From 03a3f7c4ca2b532c26c4edeea0154edb8421b658 Mon Sep 17 00:00:00 2001 From: LMBishop <13875753+LMBishop@users.noreply.github.com> Date: Wed, 2 Jun 2021 17:18:08 +0100 Subject: Renaming & refactoring --- .../com/leonardobishop/quests/QuestCompleter.java | 4 +- .../java/com/leonardobishop/quests/Quests.java | 116 ++-- .../leonardobishop/quests/QuestsConfigLoader.java | 10 +- .../com/leonardobishop/quests/api/QuestsAPI.java | 4 +- .../quests/api/QuestsPlaceholders.java | 4 +- .../quests/command/QuestsCommand.java | 682 +++++++++++++++++++++ .../quests/commands/CommandQuests.java | 682 --------------------- .../quests/events/EventPlayerJoin.java | 51 -- .../quests/events/EventPlayerLeave.java | 21 - .../quests/events/MenuController.java | 49 -- .../quests/hook/coreprotect/CoreProtectHook.java | 29 + .../quests/hook/coreprotect/CoreProtectNoHook.java | 10 + .../quests/hook/coreprotect/ICoreProtectHook.java | 16 + .../quests/hook/itemgetter/ItemGetter.java | 48 ++ .../quests/hook/itemgetter/ItemGetterLatest.java | 244 ++++++++ .../quests/hook/itemgetter/ItemGetter_1_13.java | 233 +++++++ .../hook/itemgetter/ItemGetter_Late_1_8.java | 161 +++++ .../quests/hook/papi/IPlaceholderAPIHook.java | 14 + .../quests/hook/papi/PlaceholderAPIHook.java | 28 + .../leonardobishop/quests/hook/title/Title.java | 8 + .../quests/hook/title/Title_Bukkit.java | 12 + .../quests/hook/title/Title_BukkitNoTimings.java | 13 + .../quests/hook/title/Title_Other.java | 11 + .../quests/hooks/coreprotect/CoreProtectHook.java | 29 - .../hooks/coreprotect/CoreProtectNoHook.java | 10 - .../quests/hooks/coreprotect/ICoreProtectHook.java | 16 - .../quests/hooks/itemgetter/ItemGetter.java | 48 -- .../quests/hooks/itemgetter/ItemGetterLatest.java | 245 -------- .../quests/hooks/itemgetter/ItemGetter_1_13.java | 234 ------- .../hooks/itemgetter/ItemGetter_Late_1_8.java | 161 ----- .../quests/hooks/papi/IPlaceholderAPIHook.java | 14 - .../quests/hooks/papi/PlaceholderAPIHook.java | 28 - .../leonardobishop/quests/hooks/title/Title.java | 8 - .../quests/hooks/title/Title_Bukkit.java | 12 - .../quests/hooks/title/Title_BukkitNoTimings.java | 13 - .../quests/hooks/title/Title_Other.java | 11 - .../quests/listener/MenuController.java | 49 ++ .../quests/listener/PlayerJoinListener.java | 51 ++ .../quests/listener/PlayerLeaveListener.java | 21 + .../leonardobishop/quests/menu/CancelQMenu.java | 4 +- .../leonardobishop/quests/menu/CategoryQMenu.java | 2 +- .../com/leonardobishop/quests/menu/MenuUtil.java | 4 +- .../com/leonardobishop/quests/menu/QItemStack.java | 3 +- .../java/com/leonardobishop/quests/menu/QMenu.java | 4 +- .../com/leonardobishop/quests/menu/QuestQMenu.java | 4 +- .../quests/menu/QuestSortWrapper.java | 4 +- .../leonardobishop/quests/menu/StartedQMenu.java | 4 +- .../quests/menu/element/CategoryMenuElement.java | 2 +- .../quests/menu/element/QuestMenuElement.java | 2 +- .../com/leonardobishop/quests/player/QPlayer.java | 6 +- .../questprogressfile/QuestProgressFile.java | 16 +- .../com/leonardobishop/quests/quest/Category.java | 46 ++ .../com/leonardobishop/quests/quest/Quest.java | 133 ++++ .../leonardobishop/quests/quest/QuestManager.java | 49 ++ .../java/com/leonardobishop/quests/quest/Task.java | 41 ++ .../quests/quest/tasktype/ConfigValue.java | 35 ++ .../quests/quest/tasktype/TaskType.java | 116 ++++ .../quests/quest/tasktype/TaskTypeManager.java | 69 +++ .../quests/quest/tasktype/TaskUtils.java | 89 +++ .../quest/tasktype/type/BreedingTaskType.java | 101 +++ .../tasktype/type/BrewingCertainTaskType.java | 114 ++++ .../quest/tasktype/type/BrewingTaskType.java | 114 ++++ .../tasktype/type/BuildingCertainTaskType.java | 197 ++++++ .../quest/tasktype/type/BuildingTaskType.java | 85 +++ .../quest/tasktype/type/CommandTaskType.java | 99 +++ .../quest/tasktype/type/DealDamageTaskType.java | 93 +++ .../quest/tasktype/type/DistancefromTaskType.java | 118 ++++ .../quest/tasktype/type/EnchantingTaskType.java | 87 +++ .../quest/tasktype/type/ExpEarnTaskType.java | 85 +++ .../quest/tasktype/type/FarmingTaskType.java | 96 +++ .../quest/tasktype/type/FishingTaskType.java | 97 +++ .../quest/tasktype/type/InventoryTaskType.java | 183 ++++++ .../quest/tasktype/type/MilkingTaskType.java | 98 +++ .../quest/tasktype/type/MiningCertainTaskType.java | 208 +++++++ .../quests/quest/tasktype/type/MiningTaskType.java | 88 +++ .../tasktype/type/MobkillingCertainTaskType.java | 131 ++++ .../quest/tasktype/type/MobkillingTaskType.java | 116 ++++ .../quest/tasktype/type/PermissionTaskType.java | 76 +++ .../quest/tasktype/type/PlayerkillingTaskType.java | 97 +++ .../quest/tasktype/type/PlaytimeTaskType.java | 95 +++ .../quest/tasktype/type/PositionTaskType.java | 108 ++++ .../quest/tasktype/type/ShearingTaskType.java | 93 +++ .../quests/quest/tasktype/type/TamingTaskType.java | 92 +++ .../quest/tasktype/type/WalkingTaskType.java | 92 +++ .../type/dependent/ASkyBlockLevelType.java | 72 +++ .../type/dependent/BentoBoxLevelTaskType.java | 105 ++++ .../type/dependent/CitizensDeliverTaskType.java | 150 +++++ .../type/dependent/CitizensInteractTaskType.java | 76 +++ .../type/dependent/EssentialsBalanceTaskType.java | 98 +++ .../dependent/EssentialsMoneyEarnTaskType.java | 80 +++ .../type/dependent/IridiumSkyblockValueType.java | 85 +++ .../type/dependent/MythicMobsKillingType.java | 105 ++++ .../dependent/PlaceholderAPIEvaluateTaskType.java | 162 +++++ .../dependent/ShopGUIPlusBuyCertainTaskType.java | 82 +++ .../dependent/ShopGUIPlusSellCertainTaskType.java | 82 +++ .../type/dependent/uSkyBlockLevelType.java | 74 +++ .../com/leonardobishop/quests/quests/Category.java | 46 -- .../com/leonardobishop/quests/quests/Quest.java | 133 ---- .../leonardobishop/quests/quests/QuestManager.java | 49 -- .../com/leonardobishop/quests/quests/Task.java | 41 -- .../quests/quests/tasktypes/ConfigValue.java | 35 -- .../quests/quests/tasktypes/TaskType.java | 116 ---- .../quests/quests/tasktypes/TaskTypeManager.java | 69 --- .../quests/quests/tasktypes/TaskUtils.java | 89 --- .../quests/tasktypes/types/BreedingTaskType.java | 102 --- .../tasktypes/types/BrewingCertainTaskType.java | 114 ---- .../quests/tasktypes/types/BrewingTaskType.java | 115 ---- .../tasktypes/types/BuildingCertainTaskType.java | 198 ------ .../quests/tasktypes/types/BuildingTaskType.java | 86 --- .../quests/tasktypes/types/CommandTaskType.java | 100 --- .../quests/tasktypes/types/DealDamageTaskType.java | 94 --- .../tasktypes/types/DistancefromTaskType.java | 119 ---- .../quests/tasktypes/types/EnchantingTaskType.java | 88 --- .../quests/tasktypes/types/ExpEarnTaskType.java | 86 --- .../quests/tasktypes/types/FarmingTaskType.java | 97 --- .../quests/tasktypes/types/FishingTaskType.java | 98 --- .../quests/tasktypes/types/InventoryTaskType.java | 184 ------ .../quests/tasktypes/types/MilkingTaskType.java | 98 --- .../tasktypes/types/MiningCertainTaskType.java | 209 ------- .../quests/tasktypes/types/MiningTaskType.java | 89 --- .../tasktypes/types/MobkillingCertainTaskType.java | 132 ---- .../quests/tasktypes/types/MobkillingTaskType.java | 117 ---- .../quests/tasktypes/types/PermissionTaskType.java | 77 --- .../tasktypes/types/PlayerkillingTaskType.java | 98 --- .../quests/tasktypes/types/PlaytimeTaskType.java | 96 --- .../quests/tasktypes/types/PositionTaskType.java | 109 ---- .../quests/tasktypes/types/ShearingTaskType.java | 94 --- .../quests/tasktypes/types/TamingTaskType.java | 93 --- .../quests/tasktypes/types/WalkingTaskType.java | 93 --- .../types/dependent/ASkyBlockLevelType.java | 73 --- .../types/dependent/BentoBoxLevelTaskType.java | 106 ---- .../types/dependent/CitizensDeliverTaskType.java | 151 ----- .../types/dependent/CitizensInteractTaskType.java | 77 --- .../types/dependent/EssentialsBalanceTaskType.java | 98 --- .../dependent/EssentialsMoneyEarnTaskType.java | 81 --- .../types/dependent/IridiumSkyblockValueType.java | 86 --- .../types/dependent/MythicMobsKillingType.java | 106 ---- .../dependent/PlaceholderAPIEvaluateTaskType.java | 163 ----- .../dependent/ShopGUIPlusBuyCertainTaskType.java | 83 --- .../dependent/ShopGUIPlusSellCertainTaskType.java | 83 --- .../types/dependent/uSkyBlockLevelType.java | 75 --- 141 files changed, 6231 insertions(+), 6282 deletions(-) create mode 100644 src/main/java/com/leonardobishop/quests/command/QuestsCommand.java delete mode 100644 src/main/java/com/leonardobishop/quests/commands/CommandQuests.java delete mode 100644 src/main/java/com/leonardobishop/quests/events/EventPlayerJoin.java delete mode 100644 src/main/java/com/leonardobishop/quests/events/EventPlayerLeave.java delete mode 100644 src/main/java/com/leonardobishop/quests/events/MenuController.java create mode 100644 src/main/java/com/leonardobishop/quests/hook/coreprotect/CoreProtectHook.java create mode 100644 src/main/java/com/leonardobishop/quests/hook/coreprotect/CoreProtectNoHook.java create mode 100644 src/main/java/com/leonardobishop/quests/hook/coreprotect/ICoreProtectHook.java create mode 100644 src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetter.java create mode 100644 src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetterLatest.java create mode 100644 src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetter_1_13.java create mode 100644 src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetter_Late_1_8.java create mode 100644 src/main/java/com/leonardobishop/quests/hook/papi/IPlaceholderAPIHook.java create mode 100644 src/main/java/com/leonardobishop/quests/hook/papi/PlaceholderAPIHook.java create mode 100644 src/main/java/com/leonardobishop/quests/hook/title/Title.java create mode 100644 src/main/java/com/leonardobishop/quests/hook/title/Title_Bukkit.java create mode 100644 src/main/java/com/leonardobishop/quests/hook/title/Title_BukkitNoTimings.java create mode 100644 src/main/java/com/leonardobishop/quests/hook/title/Title_Other.java delete mode 100644 src/main/java/com/leonardobishop/quests/hooks/coreprotect/CoreProtectHook.java delete mode 100644 src/main/java/com/leonardobishop/quests/hooks/coreprotect/CoreProtectNoHook.java delete mode 100644 src/main/java/com/leonardobishop/quests/hooks/coreprotect/ICoreProtectHook.java delete mode 100644 src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter.java delete mode 100644 src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetterLatest.java delete mode 100644 src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter_1_13.java delete mode 100644 src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter_Late_1_8.java delete mode 100644 src/main/java/com/leonardobishop/quests/hooks/papi/IPlaceholderAPIHook.java delete mode 100644 src/main/java/com/leonardobishop/quests/hooks/papi/PlaceholderAPIHook.java delete mode 100644 src/main/java/com/leonardobishop/quests/hooks/title/Title.java delete mode 100644 src/main/java/com/leonardobishop/quests/hooks/title/Title_Bukkit.java delete mode 100644 src/main/java/com/leonardobishop/quests/hooks/title/Title_BukkitNoTimings.java delete mode 100644 src/main/java/com/leonardobishop/quests/hooks/title/Title_Other.java create mode 100644 src/main/java/com/leonardobishop/quests/listener/MenuController.java create mode 100644 src/main/java/com/leonardobishop/quests/listener/PlayerJoinListener.java create mode 100644 src/main/java/com/leonardobishop/quests/listener/PlayerLeaveListener.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/Category.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/Quest.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/QuestManager.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/Task.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/ConfigValue.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/TaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/TaskTypeManager.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/TaskUtils.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/BreedingTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/BrewingCertainTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/BrewingTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/BuildingCertainTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/BuildingTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/CommandTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/DealDamageTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/DistancefromTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/EnchantingTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/ExpEarnTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/FarmingTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/FishingTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/InventoryTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/MilkingTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningCertainTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/MobkillingCertainTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/MobkillingTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/PermissionTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/PlayerkillingTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/PlaytimeTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/PositionTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/ShearingTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/TamingTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/WalkingTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ASkyBlockLevelType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/BentoBoxLevelTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/CitizensDeliverTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/CitizensInteractTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsBalanceTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsMoneyEarnTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/IridiumSkyblockValueType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/MythicMobsKillingType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/PlaceholderAPIEvaluateTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ShopGUIPlusBuyCertainTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ShopGUIPlusSellCertainTaskType.java create mode 100644 src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/uSkyBlockLevelType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/Category.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/Quest.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/QuestManager.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/Task.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/ConfigValue.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskTypeManager.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskUtils.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BreedingTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BrewingCertainTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BrewingTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BuildingCertainTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BuildingTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/CommandTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/DealDamageTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/DistancefromTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/EnchantingTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/ExpEarnTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/FarmingTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/FishingTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/InventoryTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MilkingTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MiningCertainTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MiningTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MobkillingCertainTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MobkillingTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PermissionTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PlayerkillingTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PlaytimeTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PositionTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/ShearingTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/TamingTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/WalkingTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/ASkyBlockLevelType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/BentoBoxLevelTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/CitizensDeliverTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/CitizensInteractTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/EssentialsBalanceTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/EssentialsMoneyEarnTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/IridiumSkyblockValueType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/MythicMobsKillingType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/PlaceholderAPIEvaluateTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/ShopGUIPlusBuyCertainTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/ShopGUIPlusSellCertainTaskType.java delete mode 100644 src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/uSkyBlockLevelType.java (limited to 'src/main/java/com') diff --git a/src/main/java/com/leonardobishop/quests/QuestCompleter.java b/src/main/java/com/leonardobishop/quests/QuestCompleter.java index 09c9b01d..f31e5daa 100644 --- a/src/main/java/com/leonardobishop/quests/QuestCompleter.java +++ b/src/main/java/com/leonardobishop/quests/QuestCompleter.java @@ -4,8 +4,8 @@ import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; import org.bukkit.Bukkit; import org.bukkit.entity.Player; diff --git a/src/main/java/com/leonardobishop/quests/Quests.java b/src/main/java/com/leonardobishop/quests/Quests.java index 119ebfc0..5cafa5ad 100644 --- a/src/main/java/com/leonardobishop/quests/Quests.java +++ b/src/main/java/com/leonardobishop/quests/Quests.java @@ -1,62 +1,62 @@ package com.leonardobishop.quests; -import com.leonardobishop.quests.commands.CommandQuests; -import com.leonardobishop.quests.events.EventPlayerJoin; -import com.leonardobishop.quests.events.EventPlayerLeave; -import com.leonardobishop.quests.events.MenuController; -import com.leonardobishop.quests.hooks.coreprotect.CoreProtectHook; -import com.leonardobishop.quests.hooks.coreprotect.CoreProtectNoHook; -import com.leonardobishop.quests.hooks.coreprotect.ICoreProtectHook; -import com.leonardobishop.quests.hooks.itemgetter.ItemGetter; -import com.leonardobishop.quests.hooks.itemgetter.ItemGetterLatest; -import com.leonardobishop.quests.hooks.itemgetter.ItemGetter_1_13; -import com.leonardobishop.quests.hooks.itemgetter.ItemGetter_Late_1_8; -import com.leonardobishop.quests.hooks.papi.IPlaceholderAPIHook; -import com.leonardobishop.quests.hooks.papi.PlaceholderAPIHook; -import com.leonardobishop.quests.hooks.title.Title; -import com.leonardobishop.quests.hooks.title.Title_Bukkit; -import com.leonardobishop.quests.hooks.title.Title_BukkitNoTimings; -import com.leonardobishop.quests.hooks.title.Title_Other; +import com.leonardobishop.quests.command.QuestsCommand; +import com.leonardobishop.quests.listener.PlayerJoinListener; +import com.leonardobishop.quests.listener.PlayerLeaveListener; +import com.leonardobishop.quests.listener.MenuController; +import com.leonardobishop.quests.hook.coreprotect.CoreProtectHook; +import com.leonardobishop.quests.hook.coreprotect.CoreProtectNoHook; +import com.leonardobishop.quests.hook.coreprotect.ICoreProtectHook; +import com.leonardobishop.quests.hook.itemgetter.ItemGetter; +import com.leonardobishop.quests.hook.itemgetter.ItemGetterLatest; +import com.leonardobishop.quests.hook.itemgetter.ItemGetter_1_13; +import com.leonardobishop.quests.hook.itemgetter.ItemGetter_Late_1_8; +import com.leonardobishop.quests.hook.papi.IPlaceholderAPIHook; +import com.leonardobishop.quests.hook.papi.PlaceholderAPIHook; +import com.leonardobishop.quests.hook.title.Title; +import com.leonardobishop.quests.hook.title.Title_Bukkit; +import com.leonardobishop.quests.hook.title.Title_BukkitNoTimings; +import com.leonardobishop.quests.hook.title.Title_Other; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.QPlayerManager; -import com.leonardobishop.quests.quests.QuestManager; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskTypeManager; -import com.leonardobishop.quests.quests.tasktypes.types.BreedingTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.BrewingTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.BuildingCertainTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.BuildingTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.CommandTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.DealDamageTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.DistancefromTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.EnchantingTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.ExpEarnTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.FishingTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.InventoryTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.MilkingTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.MiningCertainTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.MiningTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.MobkillingCertainTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.MobkillingTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.PermissionTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.PlayerkillingTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.PlaytimeTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.PositionTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.ShearingTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.TamingTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.WalkingTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.dependent.ASkyBlockLevelType; -import com.leonardobishop.quests.quests.tasktypes.types.dependent.BentoBoxLevelTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.dependent.CitizensDeliverTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.dependent.CitizensInteractTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.dependent.EssentialsBalanceTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.dependent.EssentialsMoneyEarnTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.dependent.IridiumSkyblockValueType; -import com.leonardobishop.quests.quests.tasktypes.types.dependent.MythicMobsKillingType; -import com.leonardobishop.quests.quests.tasktypes.types.dependent.PlaceholderAPIEvaluateTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.dependent.ShopGUIPlusBuyCertainTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.dependent.ShopGUIPlusSellCertainTaskType; -import com.leonardobishop.quests.quests.tasktypes.types.dependent.uSkyBlockLevelType; +import com.leonardobishop.quests.quest.QuestManager; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskTypeManager; +import com.leonardobishop.quests.quest.tasktype.type.BreedingTaskType; +import com.leonardobishop.quests.quest.tasktype.type.BrewingTaskType; +import com.leonardobishop.quests.quest.tasktype.type.BuildingCertainTaskType; +import com.leonardobishop.quests.quest.tasktype.type.BuildingTaskType; +import com.leonardobishop.quests.quest.tasktype.type.CommandTaskType; +import com.leonardobishop.quests.quest.tasktype.type.DealDamageTaskType; +import com.leonardobishop.quests.quest.tasktype.type.DistancefromTaskType; +import com.leonardobishop.quests.quest.tasktype.type.EnchantingTaskType; +import com.leonardobishop.quests.quest.tasktype.type.ExpEarnTaskType; +import com.leonardobishop.quests.quest.tasktype.type.FishingTaskType; +import com.leonardobishop.quests.quest.tasktype.type.InventoryTaskType; +import com.leonardobishop.quests.quest.tasktype.type.MilkingTaskType; +import com.leonardobishop.quests.quest.tasktype.type.MiningCertainTaskType; +import com.leonardobishop.quests.quest.tasktype.type.MiningTaskType; +import com.leonardobishop.quests.quest.tasktype.type.MobkillingCertainTaskType; +import com.leonardobishop.quests.quest.tasktype.type.MobkillingTaskType; +import com.leonardobishop.quests.quest.tasktype.type.PermissionTaskType; +import com.leonardobishop.quests.quest.tasktype.type.PlayerkillingTaskType; +import com.leonardobishop.quests.quest.tasktype.type.PlaytimeTaskType; +import com.leonardobishop.quests.quest.tasktype.type.PositionTaskType; +import com.leonardobishop.quests.quest.tasktype.type.ShearingTaskType; +import com.leonardobishop.quests.quest.tasktype.type.TamingTaskType; +import com.leonardobishop.quests.quest.tasktype.type.WalkingTaskType; +import com.leonardobishop.quests.quest.tasktype.type.dependent.ASkyBlockLevelType; +import com.leonardobishop.quests.quest.tasktype.type.dependent.BentoBoxLevelTaskType; +import com.leonardobishop.quests.quest.tasktype.type.dependent.CitizensDeliverTaskType; +import com.leonardobishop.quests.quest.tasktype.type.dependent.CitizensInteractTaskType; +import com.leonardobishop.quests.quest.tasktype.type.dependent.EssentialsBalanceTaskType; +import com.leonardobishop.quests.quest.tasktype.type.dependent.EssentialsMoneyEarnTaskType; +import com.leonardobishop.quests.quest.tasktype.type.dependent.IridiumSkyblockValueType; +import com.leonardobishop.quests.quest.tasktype.type.dependent.MythicMobsKillingType; +import com.leonardobishop.quests.quest.tasktype.type.dependent.PlaceholderAPIEvaluateTaskType; +import com.leonardobishop.quests.quest.tasktype.type.dependent.ShopGUIPlusBuyCertainTaskType; +import com.leonardobishop.quests.quest.tasktype.type.dependent.ShopGUIPlusSellCertainTaskType; +import com.leonardobishop.quests.quest.tasktype.type.dependent.uSkyBlockLevelType; import com.leonardobishop.quests.updater.Updater; import com.leonardobishop.quests.util.Messages; import org.bstats.bukkit.MetricsLite; @@ -174,10 +174,10 @@ public class Quests extends JavaPlugin { this.generateConfigurations(); this.setupVersionSpecific(); - super.getCommand("quests").setExecutor(new CommandQuests(this)); - Bukkit.getPluginManager().registerEvents(new EventPlayerJoin(this), this); + super.getCommand("quests").setExecutor(new QuestsCommand(this)); + Bukkit.getPluginManager().registerEvents(new PlayerJoinListener(this), this); Bukkit.getPluginManager().registerEvents(menuController, this); - Bukkit.getPluginManager().registerEvents(new EventPlayerLeave(this), this); + Bukkit.getPluginManager().registerEvents(new PlayerLeaveListener(this), this); MetricsLite metrics = new MetricsLite(this, 3443); if (metrics.isEnabled()) { diff --git a/src/main/java/com/leonardobishop/quests/QuestsConfigLoader.java b/src/main/java/com/leonardobishop/quests/QuestsConfigLoader.java index c279ec96..8a5e10d8 100644 --- a/src/main/java/com/leonardobishop/quests/QuestsConfigLoader.java +++ b/src/main/java/com/leonardobishop/quests/QuestsConfigLoader.java @@ -1,11 +1,11 @@ package com.leonardobishop.quests; -import com.leonardobishop.quests.hooks.itemgetter.ItemGetter; +import com.leonardobishop.quests.hook.itemgetter.ItemGetter; import com.leonardobishop.quests.menu.QItemStack; -import com.leonardobishop.quests.quests.Category; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.TaskType; +import com.leonardobishop.quests.quest.Category; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.TaskType; import com.leonardobishop.quests.util.Options; import org.apache.commons.lang.StringUtils; import org.bukkit.ChatColor; diff --git a/src/main/java/com/leonardobishop/quests/api/QuestsAPI.java b/src/main/java/com/leonardobishop/quests/api/QuestsAPI.java index 9aaf6c7b..db7ed470 100644 --- a/src/main/java/com/leonardobishop/quests/api/QuestsAPI.java +++ b/src/main/java/com/leonardobishop/quests/api/QuestsAPI.java @@ -2,8 +2,8 @@ package com.leonardobishop.quests.api; import com.leonardobishop.quests.Quests; import com.leonardobishop.quests.player.QPlayerManager; -import com.leonardobishop.quests.quests.QuestManager; -import com.leonardobishop.quests.quests.tasktypes.TaskTypeManager; +import com.leonardobishop.quests.quest.QuestManager; +import com.leonardobishop.quests.quest.tasktype.TaskTypeManager; import org.bukkit.Bukkit; /** diff --git a/src/main/java/com/leonardobishop/quests/api/QuestsPlaceholders.java b/src/main/java/com/leonardobishop/quests/api/QuestsPlaceholders.java index 2b769373..9a402ed5 100644 --- a/src/main/java/com/leonardobishop/quests/api/QuestsPlaceholders.java +++ b/src/main/java/com/leonardobishop/quests/api/QuestsPlaceholders.java @@ -5,8 +5,8 @@ import com.leonardobishop.quests.api.enums.QuestStartResult; import com.leonardobishop.quests.menu.QItemStack; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.quests.Category; -import com.leonardobishop.quests.quests.Quest; +import com.leonardobishop.quests.quest.Category; +import com.leonardobishop.quests.quest.Quest; import com.leonardobishop.quests.util.Options; import me.clip.placeholderapi.expansion.Cacheable; import me.clip.placeholderapi.expansion.PlaceholderExpansion; diff --git a/src/main/java/com/leonardobishop/quests/command/QuestsCommand.java b/src/main/java/com/leonardobishop/quests/command/QuestsCommand.java new file mode 100644 index 00000000..e821d8ea --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/command/QuestsCommand.java @@ -0,0 +1,682 @@ +package com.leonardobishop.quests.command; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.enums.QuestStartResult; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; +import com.leonardobishop.quests.quest.Category; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.util.Messages; +import com.leonardobishop.quests.util.Options; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; +import org.bukkit.entity.Player; +import org.bukkit.util.StringUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.File; +import java.io.IOException; +import java.nio.file.FileVisitResult; +import java.nio.file.FileVisitor; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; + +public class QuestsCommand implements TabExecutor { + + private final Quests plugin; + + public QuestsCommand(Quests plugin) { + this.plugin = plugin; + } + + @SuppressWarnings("deprecation") + @Override + public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { + if (plugin.getTaskTypeManager().areRegistrationsAccepted()) { + sender.sendMessage(ChatColor.RED + "Quests is not ready yet."); + return true; + } + if (plugin.isBrokenConfig() && + !(args.length >= 2 && + (args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin")) && + args[1].equalsIgnoreCase("reload"))) { + sender.sendMessage(ChatColor.RED + "Quests cannot be used right now. Please speak to an administrator."); + if (sender.hasPermission("quests.admin")) { + showProblems(sender); + sender.sendMessage(ChatColor.RED + "The main config (config.yml) must be in tact before quests can be used. " + + "Please use the above information to help rectify the problem."); + } + return true; + } + + if (args.length >= 1 && args[0].equalsIgnoreCase("help")) { + showHelp(sender); + return true; + } + + if (args.length == 0 && sender instanceof Player) { + Player player = (Player) sender; + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); + qPlayer.openQuests(); + return true; + } else if (args.length >= 1) { + if ((args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin")) && sender.hasPermission("quests.admin")) { + if (args.length == 2) { + if (args[1].equalsIgnoreCase("opengui")) { + showAdminHelp(sender, "opengui"); + return true; + } else if (args[1].equalsIgnoreCase("moddata")) { + showAdminHelp(sender, "moddata"); + return true; + } else if (args[1].equalsIgnoreCase("reload")) { + plugin.reloadConfig(); + plugin.reloadQuests(); + showProblems(sender); + sender.sendMessage(ChatColor.GRAY + "Quests successfully reloaded."); + return true; + } else if (args[1].equalsIgnoreCase("config")) { + showProblems(sender); + return true; + //TODO +// } else if (args[1].equalsIgnoreCase("itemstack")) { +// if (!(sender instanceof Player)) { +// sender.sendMessage("You must be a player to use this command."); +// return true; +// } +// Player player = (Player) sender; +// ItemStack is = player.getItemInHand(); +// if (is == null || is.getType() == Material.AIR) { +// sender.sendMessage(ChatColor.GRAY + "There is no information about this ItemStack."); +// return true; +// } +// sender.sendMessage(ToStringBuilder.reflectionToString(is)); +// sender.sendMessage(ToStringBuilder.reflectionToString(is.getItemMeta())); +// return true; + } else if (args[1].equalsIgnoreCase("types")) { + sender.sendMessage(ChatColor.GRAY + "Registered task types:"); + for (TaskType taskType : plugin.getTaskTypeManager().getTaskTypes()) { + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + taskType.getType()); + } + sender.sendMessage(ChatColor.DARK_GRAY + "View info using /q a types [type]."); + return true; + } else if (args[1].equalsIgnoreCase("info")) { + sender.sendMessage(ChatColor.GRAY + "Loaded quests:"); + for (Quest quest : plugin.getQuestManager().getQuests().values()) { + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + quest.getId() + ChatColor.GRAY + " [" + quest.getTasks().size() + " tasks]"); + } + sender.sendMessage(ChatColor.DARK_GRAY + "View info using /q a info [quest]."); + return true; + } else if (args[1].equalsIgnoreCase("update")) { + sender.sendMessage(ChatColor.GRAY + "Checking for updates..."); + Bukkit.getScheduler().runTaskAsynchronously(this.plugin, () -> { + plugin.getUpdater().check(); + if (plugin.getUpdater().isUpdateReady()) { + sender.sendMessage(plugin.getUpdater().getMessage()); + } else { + sender.sendMessage(ChatColor.GRAY + "No updates were found."); + } + }); + return true; + } else if (args[1].equalsIgnoreCase("wiki")) { + sender.sendMessage(ChatColor.RED + "Link to Quests wiki: " + ChatColor.GRAY + "https://github.com/LMBishop/Quests/wiki"); + return true; + } else if (args[1].equalsIgnoreCase("about")) { + sender.sendMessage(ChatColor.RED + "Quests " + ChatColor.BOLD + "v" + plugin.getDescription().getVersion()); + sender.sendMessage(ChatColor.DARK_GRAY + " - " + ChatColor.RED + "Source code: " + ChatColor.GRAY + "https://github.com/LMBishop/Quests/"); + sender.sendMessage(ChatColor.DARK_GRAY + " - " + ChatColor.RED + "Report an issue: " + ChatColor.GRAY + "https://github.com/LMBishop/Quests/issues"); + sender.sendMessage(ChatColor.DARK_GRAY + " - " + ChatColor.RED + "Wiki: " + ChatColor.GRAY + "https://github.com/LMBishop/Quests/wiki"); + sender.sendMessage(ChatColor.DARK_GRAY + " - " + ChatColor.RED + "Licensed under the GPLv3"); + sender.sendMessage(ChatColor.GRAY + "Many contributors have written source code and task types for Quests," + + " please see the GitHub link for an up-to-date list of contributors."); + return true; + } + } else if (args.length == 3) { + if (args[1].equalsIgnoreCase("opengui")) { + showAdminHelp(sender, "opengui"); + return true; + } else if (args[1].equalsIgnoreCase("moddata")) { + if (args[2].equalsIgnoreCase("clean")) { + FileVisitor fileVisitor = new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path path, BasicFileAttributes attributes) { + File playerDataFile = new File(path.toUri()); + if (!playerDataFile.getName().toLowerCase().endsWith(".yml")) return FileVisitResult.CONTINUE; + String uuidStr = playerDataFile.getName().replace(".yml", ""); + UUID uuid; + try { + uuid = UUID.fromString(uuidStr); + } catch (IllegalArgumentException ex) { + return FileVisitResult.CONTINUE; + } + + plugin.getPlayerManager().loadPlayer(uuid); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(uuid); + qPlayer.getQuestProgressFile().clean(); + qPlayer.getQuestProgressFile().saveToDisk(false); + if (Bukkit.getPlayer(uuid) == null) { + plugin.getPlayerManager().dropPlayer(uuid); + } + return FileVisitResult.CONTINUE; + } + }; + //TODO command to clean specific player + try { + Files.walkFileTree(Paths.get(plugin.getDataFolder() + File.separator + "playerdata"), fileVisitor); + } catch (IOException e) { + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_CLEAN_FAIL.getMessage()); + e.printStackTrace(); + return true; + } + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_CLEAN_SUCCESS.getMessage()); + return true; + } + showAdminHelp(sender, "moddata"); + return true; + } else if (args[1].equalsIgnoreCase("types")) { + TaskType taskType = null; + for (TaskType task : plugin.getTaskTypeManager().getTaskTypes()) { + if (task.getType().equals(args[2])) { + taskType = task; + } + } + if (taskType == null) { + sender.sendMessage(Messages.COMMAND_TASKVIEW_ADMIN_FAIL.getMessage().replace("{task}", args[2])); + } else { + sender.sendMessage(ChatColor.RED + "Task type: " + ChatColor.GRAY + taskType.getType()); + sender.sendMessage(ChatColor.RED + "Author: " + ChatColor.GRAY + taskType.getAuthor()); + sender.sendMessage(ChatColor.RED + "Description: " + ChatColor.GRAY + taskType.getDescription()); + } + return true; + } else if (args[1].equalsIgnoreCase("info")) { + Quest quest = plugin.getQuestManager().getQuestById(args[2]); + if (quest == null) { + sender.sendMessage(Messages.COMMAND_QUEST_GENERAL_DOESNTEXIST.getMessage().replace("{quest}", args[2])); + } else { + sender.sendMessage(ChatColor.RED.toString() + ChatColor.BOLD + "Information for quest '" + quest.getId() + "'"); + sender.sendMessage(ChatColor.RED.toString() + ChatColor.UNDERLINE + "Task configurations (" + quest.getTasks().size() + ")"); + for (Task task : quest.getTasks()) { + sender.sendMessage(ChatColor.RED + "Task '" + task.getId() + "':"); + for (Map.Entry config : task.getConfigValues().entrySet()) { + sender.sendMessage(ChatColor.DARK_GRAY + " | " + ChatColor.GRAY + config.getKey() + ": " + ChatColor.GRAY + ChatColor.ITALIC + config.getValue()); + } + } + sender.sendMessage(ChatColor.RED.toString() + ChatColor.UNDERLINE + "Start string"); + for (String s : quest.getStartString()) { + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.GRAY + s); + } + sender.sendMessage(ChatColor.RED.toString() + ChatColor.UNDERLINE + "Reward string"); + for (String s : quest.getRewardString()) { + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.GRAY + s); + } + sender.sendMessage(ChatColor.RED.toString() + ChatColor.UNDERLINE + "Rewards"); + for (String s : quest.getRewards()) { + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.GRAY + s); + } + sender.sendMessage(ChatColor.RED.toString() + ChatColor.UNDERLINE + "Quest options"); + sender.sendMessage(ChatColor.RED + "Category: " + ChatColor.GRAY + quest.getCategoryId()); + sender.sendMessage(ChatColor.RED + "Repeatable: " + ChatColor.GRAY + quest.isRepeatable()); + sender.sendMessage(ChatColor.RED + "Requirements: " + ChatColor.GRAY + String.join(", ", quest.getRequirements())); + sender.sendMessage(ChatColor.RED + "Cooldown enabled: " + ChatColor.GRAY + quest.isCooldownEnabled()); + sender.sendMessage(ChatColor.RED + "Cooldown time: " + ChatColor.GRAY + quest.getCooldown()); + } + return true; + } + } else if (args.length == 4) { + if (args[1].equalsIgnoreCase("opengui")) { + if (args[2].equalsIgnoreCase("q") || args[2].equalsIgnoreCase("quests")) { + Player player = Bukkit.getPlayer(args[3]); + if (player != null) { + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer != null) { + qPlayer.openQuests(); + sender.sendMessage(Messages.COMMAND_QUEST_OPENQUESTS_ADMIN_SUCCESS.getMessage().replace("{player}", player.getName())); + return true; + } + } + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_PLAYERNOTFOUND.getMessage().replace("{player}", args[3])); + return true; + } + showAdminHelp(sender, "opengui"); + return true; + } else if (args[1].equalsIgnoreCase("moddata")) { + OfflinePlayer ofp = Bukkit.getOfflinePlayer(args[3]); + UUID uuid; + String name; + // Player.class is a superclass for OfflinePlayer. + // getofflinePlayer return a player regardless if exists or not + if (ofp.hasPlayedBefore()) { + uuid = ofp.getUniqueId(); + name = ofp.getName(); + } else { + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_PLAYERNOTFOUND.getMessage().replace("{player}", args[3])); + return true; + } + if (args[2].equalsIgnoreCase("fullreset")) { + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(uuid); + if (qPlayer == null) { + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_LOADDATA.getMessage().replace("{player}", name)); + plugin.getPlayerManager().loadPlayer(uuid); + qPlayer = plugin.getPlayerManager().getPlayer(uuid); //get again + } + if (qPlayer == null) { + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_NODATA.getMessage().replace("{player}", name)); + return true; + } + QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile(); + questProgressFile.clear(); + questProgressFile.saveToDisk(false); + if (Bukkit.getPlayer(uuid) == null) { + plugin.getPlayerManager().dropPlayer(uuid); + } + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_FULLRESET.getMessage().replace("{player}", name)); + return true; + } + showAdminHelp(sender, "moddata"); + return true; + } + } else if (args.length == 5) { + if (args[1].equalsIgnoreCase("opengui")) { + if (args[2].equalsIgnoreCase("c") || args[2].equalsIgnoreCase("category")) { + if (!Options.CATEGORIES_ENABLED.getBooleanValue()) { + sender.sendMessage(Messages.COMMAND_CATEGORY_OPEN_DISABLED.getMessage()); + return true; + } + Category category = plugin.getQuestManager().getCategoryById(args[4]); + if (category == null) { + sender.sendMessage(Messages.COMMAND_CATEGORY_OPEN_DOESNTEXIST.getMessage().replace("{category}", args[4])); + return true; + } + Player player = Bukkit.getPlayer(args[3]); + if (player != null) { + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer != null) { + if (qPlayer.openCategory(category, null, false) == 0) { + sender.sendMessage(Messages.COMMAND_QUEST_OPENCATEGORY_ADMIN_SUCCESS.getMessage().replace("{player}", player.getName()) + .replace("{category}", category.getId())); + } else { + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_CATEGORY_PERMISSION.getMessage().replace("{player}", player.getName()) + .replace("{category}", category.getId())); + } + return true; + } + } + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_PLAYERNOTFOUND.getMessage().replace("{player}", args[3])); + return true; + } + } else if (args[1].equalsIgnoreCase("moddata")) { + boolean success = false; + OfflinePlayer ofp = Bukkit.getOfflinePlayer(args[3]); + UUID uuid; + String name; + if (ofp.hasPlayedBefore()) { + uuid = ofp.getUniqueId(); + name = ofp.getName(); + } else { + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_PLAYERNOTFOUND.getMessage().replace("{player}", args[3])); + return true; + } + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(uuid); + if (qPlayer == null) { + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_LOADDATA.getMessage().replace("{player}", name)); + plugin.getPlayerManager().loadPlayer(uuid); + } + if (qPlayer == null) { + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_NODATA.getMessage().replace("{player}", name)); + success = true; + } + qPlayer = plugin.getPlayerManager().getPlayer(uuid); //get again + QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile(); + Quest quest = plugin.getQuestManager().getQuestById(args[4]); + if (quest == null) { + sender.sendMessage(Messages.COMMAND_QUEST_START_DOESNTEXIST.getMessage().replace("{quest}", args[4])); + //success = true; + return true; + } + if (args[2].equalsIgnoreCase("reset")) { + questProgressFile.generateBlankQuestProgress(quest); + questProgressFile.saveToDisk(false); + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_RESET_SUCCESS.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); + success = true; + } else if (args[2].equalsIgnoreCase("start")) { + QuestStartResult response = qPlayer.startQuest(quest); + if (response == QuestStartResult.QUEST_LIMIT_REACHED) { + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILLIMIT.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); + return true; + } else if (response == QuestStartResult.QUEST_ALREADY_COMPLETED) { + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILCOMPLETE.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); + return true; + } else if (response == QuestStartResult.QUEST_COOLDOWN) { + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILCOOLDOWN.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); + return true; + } else if (response == QuestStartResult.QUEST_LOCKED) { + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILLOCKED.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); + return true; + } else if (response == QuestStartResult.QUEST_ALREADY_STARTED) { + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILSTARTED.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); + return true; + } else if (response == QuestStartResult.QUEST_NO_PERMISSION) { + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILPERMISSION.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); + return true; + } else if (response == QuestStartResult.NO_PERMISSION_FOR_CATEGORY) { + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILCATEGORYPERMISSION.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); + return true; + } + questProgressFile.saveToDisk(false); + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_SUCCESS.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); + success = true; + } else if (args[2].equalsIgnoreCase("complete")) { + qPlayer.completeQuest(quest); + questProgressFile.saveToDisk(false); + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_COMPLETE_SUCCESS.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); + success = true; + } + if (!success) { + showAdminHelp(sender, "moddata"); + } + if (Bukkit.getPlayer(uuid) == null) { + plugin.getPlayerManager().dropPlayer(uuid); + } + return true; + } + } + showAdminHelp(sender, null); + return true; + } + if (sender instanceof Player && (args[0].equalsIgnoreCase("q") || args[0].equalsIgnoreCase("quests") || args[0].equalsIgnoreCase("quest"))) { + Player player = (Player) sender; + if (args.length >= 3) { + Quest quest = plugin.getQuestManager().getQuestById(args[1]); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + sender.sendMessage(ChatColor.RED + "Your quest progress file has not been loaded yet."); + return true; + } + if (quest == null) { + sender.sendMessage(Messages.COMMAND_QUEST_GENERAL_DOESNTEXIST.getMessage().replace("{quest}", args[1])); + } + if (args[2].equalsIgnoreCase("s") || args[2].equalsIgnoreCase("start")) { + qPlayer.startQuest(quest); + } else if (args[2].equalsIgnoreCase("c") || args[2].equalsIgnoreCase("cancel")) { + qPlayer.cancelQuest(quest); + } else if (args[2].equalsIgnoreCase("t") || args[2].equalsIgnoreCase("track")) { + qPlayer.trackQuest(quest); + } else { + sender.sendMessage(Messages.COMMAND_SUB_DOESNTEXIST.getMessage().replace("{sub}", args[2])); + } + return true; + } + } else if (sender instanceof Player && (args[0].equalsIgnoreCase("c") || args[0].equalsIgnoreCase("category"))) { + if (!Options.CATEGORIES_ENABLED.getBooleanValue()) { + sender.sendMessage(Messages.COMMAND_CATEGORY_OPEN_DISABLED.getMessage()); + return true; + } + Player player = (Player) sender; + if (args.length >= 2) { + Category category = plugin.getQuestManager().getCategoryById(args[1]); + if (category == null) { + sender.sendMessage(Messages.COMMAND_CATEGORY_OPEN_DOESNTEXIST.getMessage().replace("{category}", args[1])); + } else { + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); + qPlayer.openCategory(category, null, false); + return true; + } + return true; + } + } else if (sender instanceof Player && (args[0].equalsIgnoreCase("random")) && sender.hasPermission("quests.command.random")) { + Player player = (Player) sender; + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + sender.sendMessage(ChatColor.RED + "Your quest progress file has not been loaded yet."); + return true; + } + List validQuests = new ArrayList<>(); + for (Quest quest : plugin.getQuestManager().getQuests().values()) { + if (qPlayer.canStartQuest(quest) == QuestStartResult.QUEST_SUCCESS) { + validQuests.add(quest); + } + } + + if (validQuests.isEmpty()) { + player.sendMessage(Messages.QUEST_RANDOM_NONE.getMessage()); + return true; + } + int random = ThreadLocalRandom.current().nextInt(0, validQuests.size()); + qPlayer.startQuest(validQuests.get(random)); + return true; + } else if (sender instanceof Player && (args[0].equalsIgnoreCase("started"))) { + Player player = (Player) sender; + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); + qPlayer.openStartedQuests(); + return true; + } + showHelp(sender); + } else { + sender.sendMessage(ChatColor.RED + "Only admin commands are available to non-player senders."); + } + return true; + } + + private void showProblems(CommandSender sender) { + if (!plugin.getQuestsConfigLoader().getFilesWithProblems().isEmpty()) { +// sender.sendMessage(ChatColor.DARK_GRAY.toString() + "----"); + sender.sendMessage(ChatColor.GRAY + "Detected problems and potential issues:"); + Set problemTypes = new HashSet<>(); + for (Map.Entry> entry : plugin.getQuestsConfigLoader().getFilesWithProblems().entrySet()) { + HashMap> sortedProblems = new HashMap<>(); + for (QuestsConfigLoader.ConfigProblem problem : entry.getValue()) { + if (sortedProblems.containsKey(problem.getType())) { + sortedProblems.get(problem.getType()).add(problem); + } else { + List specificProblems = new ArrayList<>(); + specificProblems.add(problem); + sortedProblems.put(problem.getType(), specificProblems); + } + problemTypes.add(problem.getType()); + } + QuestsConfigLoader.ConfigProblemType highest = null; + for (QuestsConfigLoader.ConfigProblemType type : QuestsConfigLoader.ConfigProblemType.values()) { + if (sortedProblems.containsKey(type)) { + highest = type; + break; + } + } + ChatColor highestColor = ChatColor.WHITE; + if (highest != null) { + highestColor = highest.getColor(); + } + sender.sendMessage(highestColor + entry.getKey() + ChatColor.DARK_GRAY + " ----"); + for (QuestsConfigLoader.ConfigProblemType type : QuestsConfigLoader.ConfigProblemType.values()) { + if (sortedProblems.containsKey(type)) { + for (QuestsConfigLoader.ConfigProblem problem : sortedProblems.get(type)) { + sender.sendMessage(ChatColor.DARK_GRAY + " | - " + problem.getType().getColor() + + problem.getType().getShortened() + ChatColor.DARK_GRAY + ": " + + ChatColor.GRAY + problem.getDescription() + ChatColor.DARK_GRAY + " :" + problem.getLocation()); + } + } + } + } +// sender.sendMessage(ChatColor.DARK_GRAY.toString() + "----"); + List legend = new ArrayList<>(); + for (QuestsConfigLoader.ConfigProblemType type : QuestsConfigLoader.ConfigProblemType.values()) { + if (problemTypes.contains(type)) + legend.add(type.getColor() + type.getShortened() + ChatColor.DARK_GRAY + " = " + type.getColor() + type.getTitle()); + } + sender.sendMessage(ChatColor.DARK_GRAY.toString() + "----"); + sender.sendMessage(ChatColor.GRAY.toString() + plugin.getQuestsConfigLoader().getProblemsCount() + " problem(s) | " + String.join(ChatColor.DARK_GRAY + ", ", legend)); + } else { + sender.sendMessage(ChatColor.GRAY + "Quests did not detect any problems with your configuration."); + } + } + + private void showHelp(CommandSender sender) { + sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "------------=[" + ChatColor.RED + " Quests v" + plugin + .getDescription().getVersion() + " " + ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "]=------------"); + sender.sendMessage(ChatColor.GRAY + "The following commands are available: "); + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests " + ChatColor.DARK_GRAY + ": show quests"); + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests c/category " + ChatColor.DARK_GRAY + ": open category by ID"); + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests q/quest " + ChatColor.DARK_GRAY + ": start, cancel or track quest by ID"); + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a/admin " + ChatColor.DARK_GRAY + ": view help for admins"); + sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "--------=[" + ChatColor.RED + " made with <3 by LMBishop " + ChatColor + .GRAY.toString() + ChatColor.STRIKETHROUGH + "]=--------"); + } + + private void showAdminHelp(CommandSender sender, String command) { + if (command != null && command.equalsIgnoreCase("opengui")) { + sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "------------=[" + ChatColor.RED + " Quests Admin: opengui " + ChatColor + .GRAY.toString() + ChatColor.STRIKETHROUGH + "]=------------"); + sender.sendMessage(ChatColor.GRAY + "The following commands are available: "); + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a opengui q/quests " + ChatColor.DARK_GRAY + ": forcefully show" + + " quests for player"); + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a opengui c/category " + ChatColor.DARK_GRAY + ": " + + "forcefully " + + "open category by ID for player"); + sender.sendMessage(ChatColor.GRAY + "These commands are useful for command NPCs. These will bypass the usual quests.command permission."); + } else if (command != null && command.equalsIgnoreCase("moddata")) { + sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "------------=[" + ChatColor.RED + " Quests Admin: moddata " + ChatColor + .GRAY.toString() + ChatColor.STRIKETHROUGH + "]=------------"); + sender.sendMessage(ChatColor.GRAY + "The following commands are available: "); + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a moddata fullreset " + ChatColor.DARK_GRAY + ": clear a " + + "players quest data file"); + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a moddata reset " + ChatColor.DARK_GRAY + ": clear a " + + "players data for specifc quest"); + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a moddata start " + ChatColor.DARK_GRAY + ": start a " + + "quest for a player"); + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a moddata complete " + ChatColor.DARK_GRAY + ": " + + "complete a quest for a player"); + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a moddata clean " + ChatColor.DARK_GRAY + ": " + + "clean quest data files for quests which are no longer defined"); + sender.sendMessage(ChatColor.GRAY + "These commands modify quest progress for players. Use them cautiously. Changes are irreversible."); + } else { + sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "------------=[" + ChatColor.RED + " Quests Admin " + ChatColor.GRAY + .toString() + ChatColor.STRIKETHROUGH + "]=------------"); + sender.sendMessage(ChatColor.GRAY + "The following commands are available: "); + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a opengui " + ChatColor.DARK_GRAY + ": view help for opengui"); + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a moddata " + ChatColor.DARK_GRAY + ": view help for quest progression"); + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a types [type]" + ChatColor.DARK_GRAY + ": view registered task types"); + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a info [quest]" + ChatColor.DARK_GRAY + ": see information about loaded quests"); + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a reload " + ChatColor.DARK_GRAY + ": reload Quests configuration"); + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a config " + ChatColor.DARK_GRAY + ": see detected problems in config"); + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a itemstack " + ChatColor.DARK_GRAY + ": print information about the current held ItemStack"); + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a update " + ChatColor.DARK_GRAY + ": check for updates"); + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a wiki " + ChatColor.DARK_GRAY + ": get a link to the Quests wiki"); + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a about " + ChatColor.DARK_GRAY + ": get information about Quests"); + } + sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "-----=[" + ChatColor.RED + " requires permission: quests.admin " + + ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "]=-----"); + } + + private List matchTabComplete(String arg, List options) { + List completions = new ArrayList<>(); + StringUtil.copyPartialMatches(arg, options, completions); + Collections.sort(completions); + return completions; + } + + private List tabCompleteCategory(String arg) { + List options = new ArrayList<>(); + for (Category c : plugin.getQuestManager().getCategories()) { + options.add(c.getId()); + } + return matchTabComplete(arg, options); + } + + private List tabCompleteQuests(String arg) { + List options = new ArrayList<>(plugin.getQuestManager().getQuests().keySet()); + return matchTabComplete(arg, options); + } + + @Nullable + @Override + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { + if (!Options.TAB_COMPLETE_ENABLED.getBooleanValue(true)) { + return null; + } + if (sender instanceof Player) { + if (args.length == 1) { + List options = new ArrayList<>(Arrays.asList("quest", "category", "started")); + if (sender.hasPermission("quests.admin")) { + options.add("admin"); + } + if (sender.hasPermission("quests.command.random")) { + options.add("random"); + } + return matchTabComplete(args[0], options); + } else if (args.length == 2) { + if (args[0].equalsIgnoreCase("c") || args[0].equalsIgnoreCase("category")) { + return tabCompleteCategory(args[1]); + } else if (args[0].equalsIgnoreCase("q") || args[0].equalsIgnoreCase("quest")) { + return tabCompleteQuests(args[1]); + } else if (args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin") + && sender.hasPermission("quests.admin")) { + List options = Arrays.asList("opengui", "moddata", "types", "reload", "update", "config", "info", "wiki", "about"); + return matchTabComplete(args[1], options); + } + } else if (args.length == 3) { + if (args[0].equalsIgnoreCase("q") || args[0].equalsIgnoreCase("quest") + && sender.hasPermission("quests.admin")) { + Quest q = plugin.getQuestManager().getQuestById(args[1]); + if (q != null) { + List options = Arrays.asList("start", "cancel", "track"); + return matchTabComplete(args[2], options); + } + } else if (args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin") + && sender.hasPermission("quests.admin")) { + if (args[1].equalsIgnoreCase("types")) { + List options = new ArrayList<>(); + for (TaskType taskType : plugin.getTaskTypeManager().getTaskTypes()) { + options.add(taskType.getType()); + } + return matchTabComplete(args[2], options); + } else if (args[1].equalsIgnoreCase("opengui")) { + List options = Arrays.asList("quests", "category"); + return matchTabComplete(args[2], options); + } else if (args[1].equalsIgnoreCase("moddata")) { + List options = Arrays.asList("fullreset", "reset", "start", "complete", "clean"); + return matchTabComplete(args[2], options); + } else if (args[1].equalsIgnoreCase("info")) { + return tabCompleteQuests(args[2]); + } + } + } else if (args.length == 4) { + if (sender.hasPermission("quests.admin")) return null; + } else if (args.length == 5) { + if (args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin") + && sender.hasPermission("quests.admin")) { + if (args[1].equalsIgnoreCase("opengui")) { + if (args[2].equalsIgnoreCase("c") || args[2].equalsIgnoreCase("category")) { + return tabCompleteCategory(args[4]); + } + } else if (args[1].equalsIgnoreCase("moddata")) { + if (args[2].equalsIgnoreCase("start") + || args[2].equalsIgnoreCase("complete") + || args[2].equalsIgnoreCase("reset")) { + return tabCompleteQuests(args[4]); + } + } + } + } + } + return Collections.emptyList(); + } +} diff --git a/src/main/java/com/leonardobishop/quests/commands/CommandQuests.java b/src/main/java/com/leonardobishop/quests/commands/CommandQuests.java deleted file mode 100644 index c6bc0d9c..00000000 --- a/src/main/java/com/leonardobishop/quests/commands/CommandQuests.java +++ /dev/null @@ -1,682 +0,0 @@ -package com.leonardobishop.quests.commands; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.enums.QuestStartResult; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.quests.Category; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.util.Messages; -import com.leonardobishop.quests.util.Options; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.OfflinePlayer; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabExecutor; -import org.bukkit.entity.Player; -import org.bukkit.util.StringUtil; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.io.File; -import java.io.IOException; -import java.nio.file.FileVisitResult; -import java.nio.file.FileVisitor; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.SimpleFileVisitor; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.ThreadLocalRandom; - -public class CommandQuests implements TabExecutor { - - private final Quests plugin; - - public CommandQuests(Quests plugin) { - this.plugin = plugin; - } - - @SuppressWarnings("deprecation") - @Override - public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { - if (plugin.getTaskTypeManager().areRegistrationsAccepted()) { - sender.sendMessage(ChatColor.RED + "Quests is not ready yet."); - return true; - } - if (plugin.isBrokenConfig() && - !(args.length >= 2 && - (args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin")) && - args[1].equalsIgnoreCase("reload"))) { - sender.sendMessage(ChatColor.RED + "Quests cannot be used right now. Please speak to an administrator."); - if (sender.hasPermission("quests.admin")) { - showProblems(sender); - sender.sendMessage(ChatColor.RED + "The main config (config.yml) must be in tact before quests can be used. " + - "Please use the above information to help rectify the problem."); - } - return true; - } - - if (args.length >= 1 && args[0].equalsIgnoreCase("help")) { - showHelp(sender); - return true; - } - - if (args.length == 0 && sender instanceof Player) { - Player player = (Player) sender; - QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); - qPlayer.openQuests(); - return true; - } else if (args.length >= 1) { - if ((args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin")) && sender.hasPermission("quests.admin")) { - if (args.length == 2) { - if (args[1].equalsIgnoreCase("opengui")) { - showAdminHelp(sender, "opengui"); - return true; - } else if (args[1].equalsIgnoreCase("moddata")) { - showAdminHelp(sender, "moddata"); - return true; - } else if (args[1].equalsIgnoreCase("reload")) { - plugin.reloadConfig(); - plugin.reloadQuests(); - showProblems(sender); - sender.sendMessage(ChatColor.GRAY + "Quests successfully reloaded."); - return true; - } else if (args[1].equalsIgnoreCase("config")) { - showProblems(sender); - return true; - //TODO -// } else if (args[1].equalsIgnoreCase("itemstack")) { -// if (!(sender instanceof Player)) { -// sender.sendMessage("You must be a player to use this command."); -// return true; -// } -// Player player = (Player) sender; -// ItemStack is = player.getItemInHand(); -// if (is == null || is.getType() == Material.AIR) { -// sender.sendMessage(ChatColor.GRAY + "There is no information about this ItemStack."); -// return true; -// } -// sender.sendMessage(ToStringBuilder.reflectionToString(is)); -// sender.sendMessage(ToStringBuilder.reflectionToString(is.getItemMeta())); -// return true; - } else if (args[1].equalsIgnoreCase("types")) { - sender.sendMessage(ChatColor.GRAY + "Registered task types:"); - for (TaskType taskType : plugin.getTaskTypeManager().getTaskTypes()) { - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + taskType.getType()); - } - sender.sendMessage(ChatColor.DARK_GRAY + "View info using /q a types [type]."); - return true; - } else if (args[1].equalsIgnoreCase("info")) { - sender.sendMessage(ChatColor.GRAY + "Loaded quests:"); - for (Quest quest : plugin.getQuestManager().getQuests().values()) { - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + quest.getId() + ChatColor.GRAY + " [" + quest.getTasks().size() + " tasks]"); - } - sender.sendMessage(ChatColor.DARK_GRAY + "View info using /q a info [quest]."); - return true; - } else if (args[1].equalsIgnoreCase("update")) { - sender.sendMessage(ChatColor.GRAY + "Checking for updates..."); - Bukkit.getScheduler().runTaskAsynchronously(this.plugin, () -> { - plugin.getUpdater().check(); - if (plugin.getUpdater().isUpdateReady()) { - sender.sendMessage(plugin.getUpdater().getMessage()); - } else { - sender.sendMessage(ChatColor.GRAY + "No updates were found."); - } - }); - return true; - } else if (args[1].equalsIgnoreCase("wiki")) { - sender.sendMessage(ChatColor.RED + "Link to Quests wiki: " + ChatColor.GRAY + "https://github.com/LMBishop/Quests/wiki"); - return true; - } else if (args[1].equalsIgnoreCase("about")) { - sender.sendMessage(ChatColor.RED + "Quests " + ChatColor.BOLD + "v" + plugin.getDescription().getVersion()); - sender.sendMessage(ChatColor.DARK_GRAY + " - " + ChatColor.RED + "Source code: " + ChatColor.GRAY + "https://github.com/LMBishop/Quests/"); - sender.sendMessage(ChatColor.DARK_GRAY + " - " + ChatColor.RED + "Report an issue: " + ChatColor.GRAY + "https://github.com/LMBishop/Quests/issues"); - sender.sendMessage(ChatColor.DARK_GRAY + " - " + ChatColor.RED + "Wiki: " + ChatColor.GRAY + "https://github.com/LMBishop/Quests/wiki"); - sender.sendMessage(ChatColor.DARK_GRAY + " - " + ChatColor.RED + "Licensed under the GPLv3"); - sender.sendMessage(ChatColor.GRAY + "Many contributors have written source code and task types for Quests," + - " please see the GitHub link for an up-to-date list of contributors."); - return true; - } - } else if (args.length == 3) { - if (args[1].equalsIgnoreCase("opengui")) { - showAdminHelp(sender, "opengui"); - return true; - } else if (args[1].equalsIgnoreCase("moddata")) { - if (args[2].equalsIgnoreCase("clean")) { - FileVisitor fileVisitor = new SimpleFileVisitor() { - @Override - public FileVisitResult visitFile(Path path, BasicFileAttributes attributes) { - File playerDataFile = new File(path.toUri()); - if (!playerDataFile.getName().toLowerCase().endsWith(".yml")) return FileVisitResult.CONTINUE; - String uuidStr = playerDataFile.getName().replace(".yml", ""); - UUID uuid; - try { - uuid = UUID.fromString(uuidStr); - } catch (IllegalArgumentException ex) { - return FileVisitResult.CONTINUE; - } - - plugin.getPlayerManager().loadPlayer(uuid); - QPlayer qPlayer = plugin.getPlayerManager().getPlayer(uuid); - qPlayer.getQuestProgressFile().clean(); - qPlayer.getQuestProgressFile().saveToDisk(false); - if (Bukkit.getPlayer(uuid) == null) { - plugin.getPlayerManager().dropPlayer(uuid); - } - return FileVisitResult.CONTINUE; - } - }; - //TODO command to clean specific player - try { - Files.walkFileTree(Paths.get(plugin.getDataFolder() + File.separator + "playerdata"), fileVisitor); - } catch (IOException e) { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_CLEAN_FAIL.getMessage()); - e.printStackTrace(); - return true; - } - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_CLEAN_SUCCESS.getMessage()); - return true; - } - showAdminHelp(sender, "moddata"); - return true; - } else if (args[1].equalsIgnoreCase("types")) { - TaskType taskType = null; - for (TaskType task : plugin.getTaskTypeManager().getTaskTypes()) { - if (task.getType().equals(args[2])) { - taskType = task; - } - } - if (taskType == null) { - sender.sendMessage(Messages.COMMAND_TASKVIEW_ADMIN_FAIL.getMessage().replace("{task}", args[2])); - } else { - sender.sendMessage(ChatColor.RED + "Task type: " + ChatColor.GRAY + taskType.getType()); - sender.sendMessage(ChatColor.RED + "Author: " + ChatColor.GRAY + taskType.getAuthor()); - sender.sendMessage(ChatColor.RED + "Description: " + ChatColor.GRAY + taskType.getDescription()); - } - return true; - } else if (args[1].equalsIgnoreCase("info")) { - Quest quest = plugin.getQuestManager().getQuestById(args[2]); - if (quest == null) { - sender.sendMessage(Messages.COMMAND_QUEST_GENERAL_DOESNTEXIST.getMessage().replace("{quest}", args[2])); - } else { - sender.sendMessage(ChatColor.RED.toString() + ChatColor.BOLD + "Information for quest '" + quest.getId() + "'"); - sender.sendMessage(ChatColor.RED.toString() + ChatColor.UNDERLINE + "Task configurations (" + quest.getTasks().size() + ")"); - for (Task task : quest.getTasks()) { - sender.sendMessage(ChatColor.RED + "Task '" + task.getId() + "':"); - for (Map.Entry config : task.getConfigValues().entrySet()) { - sender.sendMessage(ChatColor.DARK_GRAY + " | " + ChatColor.GRAY + config.getKey() + ": " + ChatColor.GRAY + ChatColor.ITALIC + config.getValue()); - } - } - sender.sendMessage(ChatColor.RED.toString() + ChatColor.UNDERLINE + "Start string"); - for (String s : quest.getStartString()) { - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.GRAY + s); - } - sender.sendMessage(ChatColor.RED.toString() + ChatColor.UNDERLINE + "Reward string"); - for (String s : quest.getRewardString()) { - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.GRAY + s); - } - sender.sendMessage(ChatColor.RED.toString() + ChatColor.UNDERLINE + "Rewards"); - for (String s : quest.getRewards()) { - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.GRAY + s); - } - sender.sendMessage(ChatColor.RED.toString() + ChatColor.UNDERLINE + "Quest options"); - sender.sendMessage(ChatColor.RED + "Category: " + ChatColor.GRAY + quest.getCategoryId()); - sender.sendMessage(ChatColor.RED + "Repeatable: " + ChatColor.GRAY + quest.isRepeatable()); - sender.sendMessage(ChatColor.RED + "Requirements: " + ChatColor.GRAY + String.join(", ", quest.getRequirements())); - sender.sendMessage(ChatColor.RED + "Cooldown enabled: " + ChatColor.GRAY + quest.isCooldownEnabled()); - sender.sendMessage(ChatColor.RED + "Cooldown time: " + ChatColor.GRAY + quest.getCooldown()); - } - return true; - } - } else if (args.length == 4) { - if (args[1].equalsIgnoreCase("opengui")) { - if (args[2].equalsIgnoreCase("q") || args[2].equalsIgnoreCase("quests")) { - Player player = Bukkit.getPlayer(args[3]); - if (player != null) { - QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); - if (qPlayer != null) { - qPlayer.openQuests(); - sender.sendMessage(Messages.COMMAND_QUEST_OPENQUESTS_ADMIN_SUCCESS.getMessage().replace("{player}", player.getName())); - return true; - } - } - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_PLAYERNOTFOUND.getMessage().replace("{player}", args[3])); - return true; - } - showAdminHelp(sender, "opengui"); - return true; - } else if (args[1].equalsIgnoreCase("moddata")) { - OfflinePlayer ofp = Bukkit.getOfflinePlayer(args[3]); - UUID uuid; - String name; - // Player.class is a superclass for OfflinePlayer. - // getofflinePlayer return a player regardless if exists or not - if (ofp.hasPlayedBefore()) { - uuid = ofp.getUniqueId(); - name = ofp.getName(); - } else { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_PLAYERNOTFOUND.getMessage().replace("{player}", args[3])); - return true; - } - if (args[2].equalsIgnoreCase("fullreset")) { - QPlayer qPlayer = plugin.getPlayerManager().getPlayer(uuid); - if (qPlayer == null) { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_LOADDATA.getMessage().replace("{player}", name)); - plugin.getPlayerManager().loadPlayer(uuid); - qPlayer = plugin.getPlayerManager().getPlayer(uuid); //get again - } - if (qPlayer == null) { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_NODATA.getMessage().replace("{player}", name)); - return true; - } - QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile(); - questProgressFile.clear(); - questProgressFile.saveToDisk(false); - if (Bukkit.getPlayer(uuid) == null) { - plugin.getPlayerManager().dropPlayer(uuid); - } - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_FULLRESET.getMessage().replace("{player}", name)); - return true; - } - showAdminHelp(sender, "moddata"); - return true; - } - } else if (args.length == 5) { - if (args[1].equalsIgnoreCase("opengui")) { - if (args[2].equalsIgnoreCase("c") || args[2].equalsIgnoreCase("category")) { - if (!Options.CATEGORIES_ENABLED.getBooleanValue()) { - sender.sendMessage(Messages.COMMAND_CATEGORY_OPEN_DISABLED.getMessage()); - return true; - } - Category category = plugin.getQuestManager().getCategoryById(args[4]); - if (category == null) { - sender.sendMessage(Messages.COMMAND_CATEGORY_OPEN_DOESNTEXIST.getMessage().replace("{category}", args[4])); - return true; - } - Player player = Bukkit.getPlayer(args[3]); - if (player != null) { - QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); - if (qPlayer != null) { - if (qPlayer.openCategory(category, null, false) == 0) { - sender.sendMessage(Messages.COMMAND_QUEST_OPENCATEGORY_ADMIN_SUCCESS.getMessage().replace("{player}", player.getName()) - .replace("{category}", category.getId())); - } else { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_CATEGORY_PERMISSION.getMessage().replace("{player}", player.getName()) - .replace("{category}", category.getId())); - } - return true; - } - } - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_PLAYERNOTFOUND.getMessage().replace("{player}", args[3])); - return true; - } - } else if (args[1].equalsIgnoreCase("moddata")) { - boolean success = false; - OfflinePlayer ofp = Bukkit.getOfflinePlayer(args[3]); - UUID uuid; - String name; - if (ofp.hasPlayedBefore()) { - uuid = ofp.getUniqueId(); - name = ofp.getName(); - } else { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_PLAYERNOTFOUND.getMessage().replace("{player}", args[3])); - return true; - } - QPlayer qPlayer = plugin.getPlayerManager().getPlayer(uuid); - if (qPlayer == null) { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_LOADDATA.getMessage().replace("{player}", name)); - plugin.getPlayerManager().loadPlayer(uuid); - } - if (qPlayer == null) { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_NODATA.getMessage().replace("{player}", name)); - success = true; - } - qPlayer = plugin.getPlayerManager().getPlayer(uuid); //get again - QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile(); - Quest quest = plugin.getQuestManager().getQuestById(args[4]); - if (quest == null) { - sender.sendMessage(Messages.COMMAND_QUEST_START_DOESNTEXIST.getMessage().replace("{quest}", args[4])); - //success = true; - return true; - } - if (args[2].equalsIgnoreCase("reset")) { - questProgressFile.generateBlankQuestProgress(quest); - questProgressFile.saveToDisk(false); - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_RESET_SUCCESS.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); - success = true; - } else if (args[2].equalsIgnoreCase("start")) { - QuestStartResult response = qPlayer.startQuest(quest); - if (response == QuestStartResult.QUEST_LIMIT_REACHED) { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILLIMIT.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); - return true; - } else if (response == QuestStartResult.QUEST_ALREADY_COMPLETED) { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILCOMPLETE.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); - return true; - } else if (response == QuestStartResult.QUEST_COOLDOWN) { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILCOOLDOWN.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); - return true; - } else if (response == QuestStartResult.QUEST_LOCKED) { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILLOCKED.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); - return true; - } else if (response == QuestStartResult.QUEST_ALREADY_STARTED) { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILSTARTED.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); - return true; - } else if (response == QuestStartResult.QUEST_NO_PERMISSION) { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILPERMISSION.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); - return true; - } else if (response == QuestStartResult.NO_PERMISSION_FOR_CATEGORY) { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILCATEGORYPERMISSION.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); - return true; - } - questProgressFile.saveToDisk(false); - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_SUCCESS.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); - success = true; - } else if (args[2].equalsIgnoreCase("complete")) { - qPlayer.completeQuest(quest); - questProgressFile.saveToDisk(false); - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_COMPLETE_SUCCESS.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); - success = true; - } - if (!success) { - showAdminHelp(sender, "moddata"); - } - if (Bukkit.getPlayer(uuid) == null) { - plugin.getPlayerManager().dropPlayer(uuid); - } - return true; - } - } - showAdminHelp(sender, null); - return true; - } - if (sender instanceof Player && (args[0].equalsIgnoreCase("q") || args[0].equalsIgnoreCase("quests") || args[0].equalsIgnoreCase("quest"))) { - Player player = (Player) sender; - if (args.length >= 3) { - Quest quest = plugin.getQuestManager().getQuestById(args[1]); - QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); - if (qPlayer == null) { - sender.sendMessage(ChatColor.RED + "Your quest progress file has not been loaded yet."); - return true; - } - if (quest == null) { - sender.sendMessage(Messages.COMMAND_QUEST_GENERAL_DOESNTEXIST.getMessage().replace("{quest}", args[1])); - } - if (args[2].equalsIgnoreCase("s") || args[2].equalsIgnoreCase("start")) { - qPlayer.startQuest(quest); - } else if (args[2].equalsIgnoreCase("c") || args[2].equalsIgnoreCase("cancel")) { - qPlayer.cancelQuest(quest); - } else if (args[2].equalsIgnoreCase("t") || args[2].equalsIgnoreCase("track")) { - qPlayer.trackQuest(quest); - } else { - sender.sendMessage(Messages.COMMAND_SUB_DOESNTEXIST.getMessage().replace("{sub}", args[2])); - } - return true; - } - } else if (sender instanceof Player && (args[0].equalsIgnoreCase("c") || args[0].equalsIgnoreCase("category"))) { - if (!Options.CATEGORIES_ENABLED.getBooleanValue()) { - sender.sendMessage(Messages.COMMAND_CATEGORY_OPEN_DISABLED.getMessage()); - return true; - } - Player player = (Player) sender; - if (args.length >= 2) { - Category category = plugin.getQuestManager().getCategoryById(args[1]); - if (category == null) { - sender.sendMessage(Messages.COMMAND_CATEGORY_OPEN_DOESNTEXIST.getMessage().replace("{category}", args[1])); - } else { - QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); - qPlayer.openCategory(category, null, false); - return true; - } - return true; - } - } else if (sender instanceof Player && (args[0].equalsIgnoreCase("random")) && sender.hasPermission("quests.command.random")) { - Player player = (Player) sender; - QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); - if (qPlayer == null) { - sender.sendMessage(ChatColor.RED + "Your quest progress file has not been loaded yet."); - return true; - } - List validQuests = new ArrayList<>(); - for (Quest quest : plugin.getQuestManager().getQuests().values()) { - if (qPlayer.canStartQuest(quest) == QuestStartResult.QUEST_SUCCESS) { - validQuests.add(quest); - } - } - - if (validQuests.isEmpty()) { - player.sendMessage(Messages.QUEST_RANDOM_NONE.getMessage()); - return true; - } - int random = ThreadLocalRandom.current().nextInt(0, validQuests.size()); - qPlayer.startQuest(validQuests.get(random)); - return true; - } else if (sender instanceof Player && (args[0].equalsIgnoreCase("started"))) { - Player player = (Player) sender; - QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); - qPlayer.openStartedQuests(); - return true; - } - showHelp(sender); - } else { - sender.sendMessage(ChatColor.RED + "Only admin commands are available to non-player senders."); - } - return true; - } - - private void showProblems(CommandSender sender) { - if (!plugin.getQuestsConfigLoader().getFilesWithProblems().isEmpty()) { -// sender.sendMessage(ChatColor.DARK_GRAY.toString() + "----"); - sender.sendMessage(ChatColor.GRAY + "Detected problems and potential issues:"); - Set problemTypes = new HashSet<>(); - for (Map.Entry> entry : plugin.getQuestsConfigLoader().getFilesWithProblems().entrySet()) { - HashMap> sortedProblems = new HashMap<>(); - for (QuestsConfigLoader.ConfigProblem problem : entry.getValue()) { - if (sortedProblems.containsKey(problem.getType())) { - sortedProblems.get(problem.getType()).add(problem); - } else { - List specificProblems = new ArrayList<>(); - specificProblems.add(problem); - sortedProblems.put(problem.getType(), specificProblems); - } - problemTypes.add(problem.getType()); - } - QuestsConfigLoader.ConfigProblemType highest = null; - for (QuestsConfigLoader.ConfigProblemType type : QuestsConfigLoader.ConfigProblemType.values()) { - if (sortedProblems.containsKey(type)) { - highest = type; - break; - } - } - ChatColor highestColor = ChatColor.WHITE; - if (highest != null) { - highestColor = highest.getColor(); - } - sender.sendMessage(highestColor + entry.getKey() + ChatColor.DARK_GRAY + " ----"); - for (QuestsConfigLoader.ConfigProblemType type : QuestsConfigLoader.ConfigProblemType.values()) { - if (sortedProblems.containsKey(type)) { - for (QuestsConfigLoader.ConfigProblem problem : sortedProblems.get(type)) { - sender.sendMessage(ChatColor.DARK_GRAY + " | - " + problem.getType().getColor() - + problem.getType().getShortened() + ChatColor.DARK_GRAY + ": " - + ChatColor.GRAY + problem.getDescription() + ChatColor.DARK_GRAY + " :" + problem.getLocation()); - } - } - } - } -// sender.sendMessage(ChatColor.DARK_GRAY.toString() + "----"); - List legend = new ArrayList<>(); - for (QuestsConfigLoader.ConfigProblemType type : QuestsConfigLoader.ConfigProblemType.values()) { - if (problemTypes.contains(type)) - legend.add(type.getColor() + type.getShortened() + ChatColor.DARK_GRAY + " = " + type.getColor() + type.getTitle()); - } - sender.sendMessage(ChatColor.DARK_GRAY.toString() + "----"); - sender.sendMessage(ChatColor.GRAY.toString() + plugin.getQuestsConfigLoader().getProblemsCount() + " problem(s) | " + String.join(ChatColor.DARK_GRAY + ", ", legend)); - } else { - sender.sendMessage(ChatColor.GRAY + "Quests did not detect any problems with your configuration."); - } - } - - private void showHelp(CommandSender sender) { - sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "------------=[" + ChatColor.RED + " Quests v" + plugin - .getDescription().getVersion() + " " + ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "]=------------"); - sender.sendMessage(ChatColor.GRAY + "The following commands are available: "); - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests " + ChatColor.DARK_GRAY + ": show quests"); - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests c/category " + ChatColor.DARK_GRAY + ": open category by ID"); - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests q/quest " + ChatColor.DARK_GRAY + ": start, cancel or track quest by ID"); - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a/admin " + ChatColor.DARK_GRAY + ": view help for admins"); - sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "--------=[" + ChatColor.RED + " made with <3 by LMBishop " + ChatColor - .GRAY.toString() + ChatColor.STRIKETHROUGH + "]=--------"); - } - - private void showAdminHelp(CommandSender sender, String command) { - if (command != null && command.equalsIgnoreCase("opengui")) { - sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "------------=[" + ChatColor.RED + " Quests Admin: opengui " + ChatColor - .GRAY.toString() + ChatColor.STRIKETHROUGH + "]=------------"); - sender.sendMessage(ChatColor.GRAY + "The following commands are available: "); - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a opengui q/quests " + ChatColor.DARK_GRAY + ": forcefully show" + - " quests for player"); - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a opengui c/category " + ChatColor.DARK_GRAY + ": " + - "forcefully " + - "open category by ID for player"); - sender.sendMessage(ChatColor.GRAY + "These commands are useful for command NPCs. These will bypass the usual quests.command permission."); - } else if (command != null && command.equalsIgnoreCase("moddata")) { - sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "------------=[" + ChatColor.RED + " Quests Admin: moddata " + ChatColor - .GRAY.toString() + ChatColor.STRIKETHROUGH + "]=------------"); - sender.sendMessage(ChatColor.GRAY + "The following commands are available: "); - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a moddata fullreset " + ChatColor.DARK_GRAY + ": clear a " + - "players quest data file"); - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a moddata reset " + ChatColor.DARK_GRAY + ": clear a " + - "players data for specifc quest"); - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a moddata start " + ChatColor.DARK_GRAY + ": start a " + - "quest for a player"); - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a moddata complete " + ChatColor.DARK_GRAY + ": " + - "complete a quest for a player"); - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a moddata clean " + ChatColor.DARK_GRAY + ": " + - "clean quest data files for quests which are no longer defined"); - sender.sendMessage(ChatColor.GRAY + "These commands modify quest progress for players. Use them cautiously. Changes are irreversible."); - } else { - sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "------------=[" + ChatColor.RED + " Quests Admin " + ChatColor.GRAY - .toString() + ChatColor.STRIKETHROUGH + "]=------------"); - sender.sendMessage(ChatColor.GRAY + "The following commands are available: "); - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a opengui " + ChatColor.DARK_GRAY + ": view help for opengui"); - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a moddata " + ChatColor.DARK_GRAY + ": view help for quest progression"); - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a types [type]" + ChatColor.DARK_GRAY + ": view registered task types"); - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a info [quest]" + ChatColor.DARK_GRAY + ": see information about loaded quests"); - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a reload " + ChatColor.DARK_GRAY + ": reload Quests configuration"); - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a config " + ChatColor.DARK_GRAY + ": see detected problems in config"); - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a itemstack " + ChatColor.DARK_GRAY + ": print information about the current held ItemStack"); - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a update " + ChatColor.DARK_GRAY + ": check for updates"); - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a wiki " + ChatColor.DARK_GRAY + ": get a link to the Quests wiki"); - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a about " + ChatColor.DARK_GRAY + ": get information about Quests"); - } - sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "-----=[" + ChatColor.RED + " requires permission: quests.admin " + - ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "]=-----"); - } - - private List matchTabComplete(String arg, List options) { - List completions = new ArrayList<>(); - StringUtil.copyPartialMatches(arg, options, completions); - Collections.sort(completions); - return completions; - } - - private List tabCompleteCategory(String arg) { - List options = new ArrayList<>(); - for (Category c : plugin.getQuestManager().getCategories()) { - options.add(c.getId()); - } - return matchTabComplete(arg, options); - } - - private List tabCompleteQuests(String arg) { - List options = new ArrayList<>(plugin.getQuestManager().getQuests().keySet()); - return matchTabComplete(arg, options); - } - - @Nullable - @Override - public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { - if (!Options.TAB_COMPLETE_ENABLED.getBooleanValue(true)) { - return null; - } - if (sender instanceof Player) { - if (args.length == 1) { - List options = new ArrayList<>(Arrays.asList("quest", "category", "started")); - if (sender.hasPermission("quests.admin")) { - options.add("admin"); - } - if (sender.hasPermission("quests.command.random")) { - options.add("random"); - } - return matchTabComplete(args[0], options); - } else if (args.length == 2) { - if (args[0].equalsIgnoreCase("c") || args[0].equalsIgnoreCase("category")) { - return tabCompleteCategory(args[1]); - } else if (args[0].equalsIgnoreCase("q") || args[0].equalsIgnoreCase("quest")) { - return tabCompleteQuests(args[1]); - } else if (args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin") - && sender.hasPermission("quests.admin")) { - List options = Arrays.asList("opengui", "moddata", "types", "reload", "update", "config", "info", "wiki", "about"); - return matchTabComplete(args[1], options); - } - } else if (args.length == 3) { - if (args[0].equalsIgnoreCase("q") || args[0].equalsIgnoreCase("quest") - && sender.hasPermission("quests.admin")) { - Quest q = plugin.getQuestManager().getQuestById(args[1]); - if (q != null) { - List options = Arrays.asList("start", "cancel", "track"); - return matchTabComplete(args[2], options); - } - } else if (args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin") - && sender.hasPermission("quests.admin")) { - if (args[1].equalsIgnoreCase("types")) { - List options = new ArrayList<>(); - for (TaskType taskType : plugin.getTaskTypeManager().getTaskTypes()) { - options.add(taskType.getType()); - } - return matchTabComplete(args[2], options); - } else if (args[1].equalsIgnoreCase("opengui")) { - List options = Arrays.asList("quests", "category"); - return matchTabComplete(args[2], options); - } else if (args[1].equalsIgnoreCase("moddata")) { - List options = Arrays.asList("fullreset", "reset", "start", "complete", "clean"); - return matchTabComplete(args[2], options); - } else if (args[1].equalsIgnoreCase("info")) { - return tabCompleteQuests(args[2]); - } - } - } else if (args.length == 4) { - if (sender.hasPermission("quests.admin")) return null; - } else if (args.length == 5) { - if (args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin") - && sender.hasPermission("quests.admin")) { - if (args[1].equalsIgnoreCase("opengui")) { - if (args[2].equalsIgnoreCase("c") || args[2].equalsIgnoreCase("category")) { - return tabCompleteCategory(args[4]); - } - } else if (args[1].equalsIgnoreCase("moddata")) { - if (args[2].equalsIgnoreCase("start") - || args[2].equalsIgnoreCase("complete") - || args[2].equalsIgnoreCase("reset")) { - return tabCompleteQuests(args[4]); - } - } - } - } - } - return Collections.emptyList(); - } -} diff --git a/src/main/java/com/leonardobishop/quests/events/EventPlayerJoin.java b/src/main/java/com/leonardobishop/quests/events/EventPlayerJoin.java deleted file mode 100644 index 8e718975..00000000 --- a/src/main/java/com/leonardobishop/quests/events/EventPlayerJoin.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.leonardobishop.quests.events; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.util.Messages; -import com.leonardobishop.quests.util.Options; -import org.bukkit.Bukkit; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerJoinEvent; - -import java.util.UUID; - -public class EventPlayerJoin implements Listener { - - private final Quests plugin; - - public EventPlayerJoin(Quests plugin) { - this.plugin = plugin; - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onAsyncJoin(AsyncPlayerPreLoginEvent event) { - if (!Options.QUEST_JOIN_ASYNC.getBooleanValue()) return; - plugin.getPlayerManager().loadPlayer(event.getUniqueId()); - } - - @EventHandler - public void onEvent(PlayerJoinEvent event) { - UUID playerUuid = event.getPlayer().getUniqueId(); - plugin.getPlayerManager().loadPlayer(playerUuid); - if (Options.SOFT_CLEAN_QUESTSPROGRESSFILE_ON_JOIN.getBooleanValue()) { - plugin.getPlayerManager().getPlayer(playerUuid).getQuestProgressFile().clean(); - if (Options.PUSH_SOFT_CLEAN_TO_DISK.getBooleanValue()) { - plugin.getPlayerManager().getPlayer(playerUuid).getQuestProgressFile().saveToDisk(false); - } - } - if (plugin.getDescription().getVersion().contains("beta") && event.getPlayer().hasPermission("quests.admin")) { - event.getPlayer().sendMessage(Messages.BETA_REMINDER.getMessage()); - } - if (plugin.getUpdater().isUpdateReady() && event.getPlayer().hasPermission("quests.admin")) { - // delay for a bit so they actually see the message - Bukkit.getScheduler().runTaskLater(this.plugin, () -> event.getPlayer().sendMessage(plugin.getUpdater().getMessage()), 50L); - } - - // run a full check to check for any missed quest completions - plugin.getQuestCompleter().queueFullCheck(plugin.getPlayerManager().getPlayer(playerUuid).getQuestProgressFile()); - } - -} diff --git a/src/main/java/com/leonardobishop/quests/events/EventPlayerLeave.java b/src/main/java/com/leonardobishop/quests/events/EventPlayerLeave.java deleted file mode 100644 index e3c714a4..00000000 --- a/src/main/java/com/leonardobishop/quests/events/EventPlayerLeave.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.leonardobishop.quests.events; - -import com.leonardobishop.quests.Quests; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerQuitEvent; - -public class EventPlayerLeave implements Listener { - - private final Quests plugin; - - public EventPlayerLeave(Quests plugin) { - this.plugin = plugin; - } - - @EventHandler - public void onEvent(PlayerQuitEvent event) { - plugin.getPlayerManager().removePlayer(event.getPlayer().getUniqueId()); - } - -} diff --git a/src/main/java/com/leonardobishop/quests/events/MenuController.java b/src/main/java/com/leonardobishop/quests/events/MenuController.java deleted file mode 100644 index 12f35baa..00000000 --- a/src/main/java/com/leonardobishop/quests/events/MenuController.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.leonardobishop.quests.events; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.menu.QMenu; -import org.bukkit.entity.HumanEntity; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryCloseEvent; -import org.bukkit.event.inventory.InventoryType; - -import java.util.HashMap; -import java.util.UUID; - -public class MenuController implements Listener { - - private final HashMap tracker = new HashMap<>(); - private final Quests plugin; - - public MenuController(Quests plugin) { - this.plugin = plugin; - } - - public void openMenu(HumanEntity player, QMenu qMenu, int page) { - player.openInventory(qMenu.toInventory(page)); - tracker.put(player.getUniqueId(), qMenu); - } - - @EventHandler - private void onClose(InventoryCloseEvent event) { - tracker.remove(event.getPlayer().getUniqueId()); - } - - @EventHandler - private void onClick(InventoryClickEvent event) { - // check if the player has a quest menu open - if (tracker.containsKey(event.getWhoClicked().getUniqueId())) { - event.setCancelled(true); - if (event.getClickedInventory() == null) - return; //The player clicked outside the inventory - if (event.getClickedInventory().getType() == InventoryType.PLAYER) - return; //The clicked inventory is a player inventory type - - QMenu qMenu = tracker.get(event.getWhoClicked().getUniqueId()); - qMenu.handleClick(event, this); - } - } - -} diff --git a/src/main/java/com/leonardobishop/quests/hook/coreprotect/CoreProtectHook.java b/src/main/java/com/leonardobishop/quests/hook/coreprotect/CoreProtectHook.java new file mode 100644 index 00000000..60f4e0a4 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/hook/coreprotect/CoreProtectHook.java @@ -0,0 +1,29 @@ +package com.leonardobishop.quests.hook.coreprotect; + +import net.coreprotect.CoreProtect; +import net.coreprotect.CoreProtectAPI; +import org.bukkit.Bukkit; +import org.bukkit.block.Block; + +import java.util.List; + +public class CoreProtectHook implements ICoreProtectHook { + + private final CoreProtectAPI api; + + public CoreProtectHook() { + api = ((CoreProtect) Bukkit.getPluginManager().getPlugin("CoreProtect")).getAPI(); + } + + @Override + public boolean checkBlock(Block block, int time) { + List lookup = api.blockLookup(block, time); + if (lookup.isEmpty()) return false; + + String[] result = lookup.get(0); + CoreProtectAPI.ParseResult parseResult = api.parseResult(result); + + return !parseResult.getPlayer().isEmpty() && parseResult.getActionId() == 1; + } + +} diff --git a/src/main/java/com/leonardobishop/quests/hook/coreprotect/CoreProtectNoHook.java b/src/main/java/com/leonardobishop/quests/hook/coreprotect/CoreProtectNoHook.java new file mode 100644 index 00000000..32916934 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/hook/coreprotect/CoreProtectNoHook.java @@ -0,0 +1,10 @@ +package com.leonardobishop.quests.hook.coreprotect; + +import org.bukkit.block.Block; + +public class CoreProtectNoHook implements ICoreProtectHook { + @Override + public boolean checkBlock(Block block, int time) { + return false; + } +} diff --git a/src/main/java/com/leonardobishop/quests/hook/coreprotect/ICoreProtectHook.java b/src/main/java/com/leonardobishop/quests/hook/coreprotect/ICoreProtectHook.java new file mode 100644 index 00000000..5dc1fa36 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/hook/coreprotect/ICoreProtectHook.java @@ -0,0 +1,16 @@ +package com.leonardobishop.quests.hook.coreprotect; + +import org.bukkit.block.Block; + +public interface ICoreProtectHook { + + /** + * Check whether or not the most recent edit to a block was the result of a player. + * + * @param block the block + * @param time the time to look back in seconds + * @return true if from a player + */ + boolean checkBlock(Block block, int time); + +} diff --git a/src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetter.java b/src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetter.java new file mode 100644 index 00000000..f3a6fc7e --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetter.java @@ -0,0 +1,48 @@ +package com.leonardobishop.quests.hook.itemgetter; + +import com.leonardobishop.quests.Quests; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.inventory.ItemStack; + +public interface ItemGetter { + + /** + * Gets an ItemStack from a configuration. + * Implementations should specific to the server version. + * + * @param path the path to where the item is defined in the config (null if item is defined in second param) + * @param config the configuration file + * @param plugin Quests plugin instance + * @param excludes exclude certain fields in the configuration + * @return {@link org.bukkit.inventory.ItemStack} + */ + ItemStack getItem(String path, ConfigurationSection config, Quests plugin, Filter... excludes); + + /** + * Gets an ItemStack from a given string (which represents a material). + * For pre-1.13 server implementations, the string may use a data code. + * + * @param material the string + * @return {@link org.bukkit.inventory.ItemStack} + */ + ItemStack getItemStack(String material, Quests plugin); + + /** + * Validates a material from a string. + * For pre-1.13 server implementations, the string may use a data code. + * + * @param material the string + * @return true if it a material + */ + boolean isValidMaterial(String material); + + enum Filter { + DISPLAY_NAME, + LORE, + ENCHANTMENTS, + ITEM_FLAGS, + UNBREAKABLE, + ATTRIBUTE_MODIFIER, + CUSTOM_MODEL_DATA; + } +} \ No newline at end of file diff --git a/src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetterLatest.java b/src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetterLatest.java new file mode 100644 index 00000000..e1215388 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetterLatest.java @@ -0,0 +1,244 @@ +package com.leonardobishop.quests.hook.itemgetter; + +import com.leonardobishop.quests.Quests; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeModifier; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class ItemGetterLatest implements ItemGetter { + + /* + supporting: + - name + - material + - lore + - enchantments (NamespacedKey) + - itemflags + - unbreakable + - attribute modifier + - custom model data + + requires at least API version 1.14 + */ + @Override + public ItemStack getItem(String path, ConfigurationSection config, Quests plugin, ItemGetter.Filter... excludes) { + if (path != null && !path.equals("")) { + path = path + "."; + } + List filters = Arrays.asList(excludes); + + String cName = config.getString(path + "name", path + "name"); + String cType = config.getString(path + "item", config.getString(path + "type", path + "item")); + boolean hasCustomModelData = config.contains(path + "custommodeldata"); + int customModelData = config.getInt(path + "custommodeldata", 0); + boolean unbreakable = config.getBoolean(path + "unbreakable", false); + List cLore = config.getStringList(path + "lore"); + List cItemFlags = config.getStringList(path + "itemflags"); + boolean hasAttributeModifiers = config.contains(path + "attributemodifiers"); + List> cAttributeModifiers = config.getMapList(path + "attributemodifiers"); + + String name; + Material type = null; + int data = 0; + + // material + ItemStack is = getItemStack(cType, plugin); + ItemMeta ism = is.getItemMeta(); + + // name + if (!filters.contains(Filter.DISPLAY_NAME)) { + name = ChatColor.translateAlternateColorCodes('&', cName); + ism.setDisplayName(name); + } + + // lore + if (!filters.contains(Filter.LORE)) { + List lore = new ArrayList<>(); + if (cLore != null) { + for (String s : cLore) { + lore.add(ChatColor.translateAlternateColorCodes('&', s)); + } + } + ism.setLore(lore); + } + + // attribute modifiers + if (!filters.contains(Filter.ATTRIBUTE_MODIFIER)) { + if (hasAttributeModifiers) { + for (Map attr : cAttributeModifiers) { + String cAttribute = (String) attr.get("attribute"); + Attribute attribute = null; + for (Attribute enumattr : Attribute.values()) { + if (enumattr.toString().equals(cAttribute)) { + attribute = enumattr; + break; + } + } + + if (attribute == null) continue; + + Map configurationSection = (Map) attr.get("modifier"); + + String cUUID = (String) configurationSection.get("uuid"); + String cModifierName = (String) configurationSection.get("name"); + String cModifierOperation = (String) configurationSection.get("operation"); + double cAmount; + try { + Object cAmountObj = configurationSection.get("amount"); + if (cAmountObj instanceof Integer) { + cAmount = ((Integer) cAmountObj).doubleValue(); + } else { + cAmount = (Double) cAmountObj; + } + } catch (Exception e) { + cAmount = 1; + } + String cEquipmentSlot = (String) configurationSection.get("equipmentslot"); + + UUID uuid = null; + if (cUUID != null) { + try { + uuid = UUID.fromString(cUUID); + } catch (Exception ignored) { + // ignored + } + } + EquipmentSlot equipmentSlot = null; + if (cEquipmentSlot != null) { + try { + equipmentSlot = EquipmentSlot.valueOf(cEquipmentSlot); + } catch (Exception ignored) { + // ignored + } + } + AttributeModifier.Operation operation = AttributeModifier.Operation.ADD_NUMBER; + try { + operation = AttributeModifier.Operation.valueOf(cModifierOperation); + } catch (Exception ignored) { + // ignored + } + + AttributeModifier modifier; + if (uuid == null) { + modifier = new AttributeModifier(cModifierName, cAmount, operation); + } else if (equipmentSlot == null) { + modifier = new AttributeModifier(uuid, cModifierName, cAmount, operation); + } else { + modifier = new AttributeModifier(uuid, cModifierName, cAmount, operation, equipmentSlot); + } + + ism.addAttributeModifier(attribute, modifier); + } + } + } + + // item flags + if (!filters.contains(Filter.ITEM_FLAGS)) { + if (config.isSet(path + "itemflags")) { + for (String flag : cItemFlags) { + for (ItemFlag iflag : ItemFlag.values()) { + if (iflag.toString().equals(flag)) { + ism.addItemFlags(iflag); + break; + } + } + } + } + } + + // custom model data + if (!filters.contains(Filter.CUSTOM_MODEL_DATA)) { + if (hasCustomModelData) { + ism.setCustomModelData(customModelData); + } + } + + // unbreakable + if (!filters.contains(Filter.UNBREAKABLE)) { + ism.setUnbreakable(unbreakable); + } + + // enchantments + if (!filters.contains(Filter.ENCHANTMENTS)) { + if (config.isSet(path + "enchantments")) { + for (String key : config.getStringList(path + "enchantments")) { + String[] split = key.split(":"); + if (split.length < 2) { + plugin.getQuestsLogger().debug("Enchantment does not follow format {namespace}:{name}:{level} : " + key); + continue; + } + String namespace = split[0]; + String ench = split[1]; + String levelName; + if (split.length >= 3) { + levelName = split[2]; + } else { + levelName = "1"; + } + + // TODO i don't know how these namespaces work +// NamespacedKey namespacedKey; +// try { +// namespacedKey = new NamespacedKey(namespace, ench); +// } catch (Exception e) { +// plugin.getQuestsLogger().debug("Unrecognised namespace: " + namespace); +// e.printStackTrace(); +// continue; +// } + Enchantment enchantment; + if ((enchantment = Enchantment.getByName(ench)) == null) { + plugin.getQuestsLogger().debug("Unrecognised enchantment: " + ench); + continue; + } + + int level; + try { + level = Integer.parseInt(levelName); + } catch (NumberFormatException e) { + level = 1; + } + + ism.addEnchant(enchantment, level, true); + } + } + } + + is.setItemMeta(ism); + return is; + } + + @Override + public ItemStack getItemStack(String material, Quests plugin) { + Material type; + try { + type = Material.valueOf(material); + } catch (Exception e) { + plugin.getQuestsLogger().debug("Unrecognised material: " + material); + type = Material.STONE; + } + return new ItemStack(type, 1); + } + + @Override + public boolean isValidMaterial(String material) { + try { + Material.valueOf(material); + return true; + } catch (IllegalArgumentException ex) { + return false; + } + } +} diff --git a/src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetter_1_13.java b/src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetter_1_13.java new file mode 100644 index 00000000..f25aab0c --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetter_1_13.java @@ -0,0 +1,233 @@ +package com.leonardobishop.quests.hook.itemgetter; + +import com.leonardobishop.quests.Quests; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeModifier; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class ItemGetter_1_13 implements ItemGetter { + /* + reads the following: + - name + - material + - lore + - enchantments (NamespacedKey) + - itemflags + - unbreakable + - attribute modifier + + requires at least API version 1.13 + */ + @Override + public ItemStack getItem(String path, ConfigurationSection config, Quests plugin, ItemGetter.Filter... excludes) { + if (path != null && !path.equals("")) { + path = path + "."; + } + List filters = Arrays.asList(excludes); + + String cName = config.getString(path + "name", path + "name"); + String cType = config.getString(path + "item", config.getString(path + "type", path + "item")); + boolean unbreakable = config.getBoolean(path + "unbreakable", false); + List cLore = config.getStringList(path + "lore"); + List cItemFlags = config.getStringList(path + "itemflags"); + boolean hasAttributeModifiers = config.contains(path + "attributemodifiers"); + List> cAttributeModifiers = config.getMapList(path + "attributemodifiers"); + + String name; + Material type = null; + int data = 0; + + // material + ItemStack is = getItemStack(cType, plugin); + ItemMeta ism = is.getItemMeta(); + + // name + if (!filters.contains(Filter.DISPLAY_NAME)) { + name = ChatColor.translateAlternateColorCodes('&', cName); + ism.setDisplayName(name); + } + + // lore + if (!filters.contains(Filter.LORE)) { + List lore = new ArrayList<>(); + if (cLore != null) { + for (String s : cLore) { + lore.add(ChatColor.translateAlternateColorCodes('&', s)); + } + } + ism.setLore(lore); + } + + // attribute modifiers + if (!filters.contains(Filter.ATTRIBUTE_MODIFIER)) { + if (hasAttributeModifiers) { + for (Map attr : cAttributeModifiers) { + String cAttribute = (String) attr.get("attribute"); + Attribute attribute = null; + for (Attribute enumattr : Attribute.values()) { + if (enumattr.toString().equals(cAttribute)) { + attribute = enumattr; + break; + } + } + + if (attribute == null) continue; + + Map configurationSection = (Map) attr.get("modifier"); + + String cUUID = (String) configurationSection.get("uuid"); + String cModifierName = (String) configurationSection.get("name"); + String cModifierOperation = (String) configurationSection.get("operation"); + double cAmount; + try { + Object cAmountObj = configurationSection.get("amount"); + if (cAmountObj instanceof Integer) { + cAmount = ((Integer) cAmountObj).doubleValue(); + } else { + cAmount = (Double) cAmountObj; + } + } catch (Exception e) { + cAmount = 1; + } + String cEquipmentSlot = (String) configurationSection.get("equipmentslot"); + + UUID uuid = null; + if (cUUID != null) { + try { + uuid = UUID.fromString(cUUID); + } catch (Exception ignored) { + // ignored + } + } + EquipmentSlot equipmentSlot = null; + if (cEquipmentSlot != null) { + try { + equipmentSlot = EquipmentSlot.valueOf(cEquipmentSlot); + } catch (Exception ignored) { + // ignored + } + } + AttributeModifier.Operation operation = AttributeModifier.Operation.ADD_NUMBER; + try { + operation = AttributeModifier.Operation.valueOf(cModifierOperation); + } catch (Exception ignored) { + // ignored + } + + AttributeModifier modifier; + if (uuid == null) { + modifier = new AttributeModifier(cModifierName, cAmount, operation); + } else if (equipmentSlot == null) { + modifier = new AttributeModifier(uuid, cModifierName, cAmount, operation); + } else { + modifier = new AttributeModifier(uuid, cModifierName, cAmount, operation, equipmentSlot); + } + + ism.addAttributeModifier(attribute, modifier); + } + } + } + + // item flags + if (!filters.contains(Filter.ITEM_FLAGS)) { + if (config.isSet(path + "itemflags")) { + for (String flag : cItemFlags) { + for (ItemFlag iflag : ItemFlag.values()) { + if (iflag.toString().equals(flag)) { + ism.addItemFlags(iflag); + break; + } + } + } + } + } + + // unbreakable + if (!filters.contains(Filter.UNBREAKABLE)) { + ism.setUnbreakable(unbreakable); + } + + // enchantments + if (!filters.contains(Filter.ENCHANTMENTS)) { + if (config.isSet(path + "enchantments")) { + for (String key : config.getStringList(path + "enchantments")) { + String[] split = key.split(":"); + if (split.length < 2) { + plugin.getQuestsLogger().debug("Enchantment does not follow format {namespace}:{name}:{level} : " + key); + continue; + } + String namespace = split[0]; + String ench = split[1]; + String levelName; + if (split.length >= 3) { + levelName = split[2]; + } else { + levelName = "1"; + } + + // TODO i don't know how these namespaces work +// NamespacedKey namespacedKey; +// try { +// namespacedKey = new NamespacedKey(namespace, ench); +// } catch (Exception e) { +// plugin.getQuestsLogger().debug("Unrecognised namespace: " + namespace); +// e.printStackTrace(); +// continue; +// } + Enchantment enchantment; + if ((enchantment = Enchantment.getByName(ench)) == null) { + plugin.getQuestsLogger().debug("Unrecognised enchantment: " + ench); + continue; + } + + int level; + try { + level = Integer.parseInt(levelName); + } catch (NumberFormatException e) { + level = 1; + } + + is.addUnsafeEnchantment(enchantment, level); + } + } + } + + is.setItemMeta(ism); + return is; + } + + @Override + public ItemStack getItemStack(String material, Quests plugin) { + Material type; + try { + type = Material.valueOf(material); + } catch (Exception e) { + plugin.getQuestsLogger().debug("Unrecognised material: " + material); + type = Material.STONE; + } + return new ItemStack(type, 1); + } + + @Override + public boolean isValidMaterial(String material) { + try { + Material.valueOf(material); + return true; + } catch (IllegalArgumentException ex) { + return false; + } + } +} diff --git a/src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetter_Late_1_8.java b/src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetter_Late_1_8.java new file mode 100644 index 00000000..84525cfb --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/hook/itemgetter/ItemGetter_Late_1_8.java @@ -0,0 +1,161 @@ +package com.leonardobishop.quests.hook.itemgetter; + +import com.leonardobishop.quests.Quests; +import org.apache.commons.lang.StringUtils; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.regex.Pattern; + +public class ItemGetter_Late_1_8 implements ItemGetter { + /* + reads the following: + - name + - material (+ DATA) + - lore + - enchantments (NOT NamespacedKey) + - itemflags + + requires at least API version 1.8 (?) + */ + @Override + public ItemStack getItem(String path, ConfigurationSection config, Quests plugin, Filter... excludes) { + if (path != null && !path.equals("")) { + path = path + "."; + } + List filters = Arrays.asList(excludes); + + + String cName = config.getString(path + "name", path + "name"); + String cType = config.getString(path + "item", config.getString(path + "type", path + "item")); + List cLore = config.getStringList(path + "lore"); + List cItemFlags = config.getStringList(path + "itemflags"); + + String name; + Material type = null; + int data = 0; + + // material + ItemStack is = getItemStack(cType, plugin); + ItemMeta ism = is.getItemMeta(); + + // lore + if (!filters.contains(Filter.LORE)) { + List lore = new ArrayList<>(); + if (cLore != null) { + for (String s : cLore) { + lore.add(ChatColor.translateAlternateColorCodes('&', s)); + } + } + ism.setLore(lore); + } + + // name + if (!filters.contains(Filter.DISPLAY_NAME)) { + name = ChatColor.translateAlternateColorCodes('&', cName); + ism.setDisplayName(name); + } + + + // item flags + if (!filters.contains(Filter.ITEM_FLAGS)) { + if (config.isSet(path + "itemflags")) { + for (String flag : cItemFlags) { + for (ItemFlag iflag : ItemFlag.values()) { + if (iflag.toString().equals(flag)) { + ism.addItemFlags(iflag); + break; + } + } + } + } + } + + // enchantments + if (!filters.contains(Filter.ENCHANTMENTS)) { + if (config.isSet(path + "enchantments")) { + for (String key : config.getStringList(path + "enchantments")) { + String[] split = key.split(":"); + String ench = split[0]; + String levelName; + if (split.length >= 2) { + levelName = split[1]; + } else { + levelName = "1"; + } + + Enchantment enchantment; + if ((enchantment = Enchantment.getByName(ench)) == null) { + plugin.getQuestsLogger().debug("Unrecognised enchantment: " + ench); + continue; + } + + int level; + try { + level = Integer.parseInt(levelName); + } catch (NumberFormatException e) { + level = 1; + } + + ism.addEnchant(enchantment, level, true); + } + } + } + + is.setItemMeta(ism); + return is; + } + + + @Override + public ItemStack getItemStack(String material, Quests plugin) { + Material type = null; + int data = 0; + + if (Material.getMaterial(material) != null) { + type = Material.getMaterial(material); + } else if (material.contains(":")) { + String[] parts = material.split(Pattern.quote(":")); + if (parts.length > 1) { + if (Material.getMaterial(parts[0]) != null) { + type = Material.getMaterial(parts[0]); + } + if (StringUtils.isNumeric(parts[1])) { + data = Integer.parseInt(parts[1]); + } + } + } + + if (type == null) { + plugin.getQuestsLogger().debug("Unrecognised material: " + material); + type = Material.STONE; + } + return new ItemStack(type, 1, (short) data); + } + + @Override + public boolean isValidMaterial(String material) { + Material type = null; + + if (Material.getMaterial(material) != null) { + type = Material.getMaterial(material); + } else if (material.contains(":")) { + String[] parts = material.split(Pattern.quote(":")); + if (parts.length > 1) { + if (Material.getMaterial(parts[0]) != null) { + type = Material.getMaterial(parts[0]); + } + } + } + + return !(type == null); + } +} diff --git a/src/main/java/com/leonardobishop/quests/hook/papi/IPlaceholderAPIHook.java b/src/main/java/com/leonardobishop/quests/hook/papi/IPlaceholderAPIHook.java new file mode 100644 index 00000000..454ee02e --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/hook/papi/IPlaceholderAPIHook.java @@ -0,0 +1,14 @@ +package com.leonardobishop.quests.hook.papi; + +import com.leonardobishop.quests.Quests; +import org.bukkit.entity.Player; + +public interface IPlaceholderAPIHook { + + String replacePlaceholders(Player player, String text); + + void registerExpansion(Quests plugin); + + void unregisterExpansion(); + +} diff --git a/src/main/java/com/leonardobishop/quests/hook/papi/PlaceholderAPIHook.java b/src/main/java/com/leonardobishop/quests/hook/papi/PlaceholderAPIHook.java new file mode 100644 index 00000000..8fd86efc --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/hook/papi/PlaceholderAPIHook.java @@ -0,0 +1,28 @@ +package com.leonardobishop.quests.hook.papi; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.api.QuestsPlaceholders; +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.entity.Player; + +public class PlaceholderAPIHook implements IPlaceholderAPIHook { + + private QuestsPlaceholders placeholder; + + public String replacePlaceholders(Player player, String text) { + return PlaceholderAPI.setPlaceholders(player, text); + } + + @Override + public void registerExpansion(Quests plugin) { + placeholder = new QuestsPlaceholders(plugin); + placeholder.register(); + } + + @Override + public void unregisterExpansion() { + placeholder.unregister(); + } + + +} diff --git a/src/main/java/com/leonardobishop/quests/hook/title/Title.java b/src/main/java/com/leonardobishop/quests/hook/title/Title.java new file mode 100644 index 00000000..ea8f1f57 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/hook/title/Title.java @@ -0,0 +1,8 @@ +package com.leonardobishop.quests.hook.title; + +import org.bukkit.entity.Player; + +public interface Title { + + void sendTitle(Player player, String message, String submessage); +} \ No newline at end of file diff --git a/src/main/java/com/leonardobishop/quests/hook/title/Title_Bukkit.java b/src/main/java/com/leonardobishop/quests/hook/title/Title_Bukkit.java new file mode 100644 index 00000000..34b22f6b --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/hook/title/Title_Bukkit.java @@ -0,0 +1,12 @@ +package com.leonardobishop.quests.hook.title; + +import org.bukkit.entity.Player; + +public class Title_Bukkit implements Title { + + // new title function with timings + @Override + public void sendTitle(Player player, String message, String submessage) { + player.sendTitle(message, submessage, 10, 100, 10); + } +} diff --git a/src/main/java/com/leonardobishop/quests/hook/title/Title_BukkitNoTimings.java b/src/main/java/com/leonardobishop/quests/hook/title/Title_BukkitNoTimings.java new file mode 100644 index 00000000..d0f44fe6 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/hook/title/Title_BukkitNoTimings.java @@ -0,0 +1,13 @@ +package com.leonardobishop.quests.hook.title; + +import org.bukkit.entity.Player; + +public class Title_BukkitNoTimings implements Title { + + // this one is for 1.8, 1.9 and 1.10 where there was no timings method + @Override + public void sendTitle(Player player, String message, String submessage) { + player.sendTitle(message, submessage); + } + +} diff --git a/src/main/java/com/leonardobishop/quests/hook/title/Title_Other.java b/src/main/java/com/leonardobishop/quests/hook/title/Title_Other.java new file mode 100644 index 00000000..419bf657 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/hook/title/Title_Other.java @@ -0,0 +1,11 @@ +package com.leonardobishop.quests.hook.title; + +import org.bukkit.entity.Player; + +public class Title_Other implements Title { + + @Override + public void sendTitle(Player player, String message, String submessage) { + // title function does not exist + } +} diff --git a/src/main/java/com/leonardobishop/quests/hooks/coreprotect/CoreProtectHook.java b/src/main/java/com/leonardobishop/quests/hooks/coreprotect/CoreProtectHook.java deleted file mode 100644 index 4010c4f1..00000000 --- a/src/main/java/com/leonardobishop/quests/hooks/coreprotect/CoreProtectHook.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.leonardobishop.quests.hooks.coreprotect; - -import net.coreprotect.CoreProtect; -import net.coreprotect.CoreProtectAPI; -import org.bukkit.Bukkit; -import org.bukkit.block.Block; - -import java.util.List; - -public class CoreProtectHook implements ICoreProtectHook { - - private final CoreProtectAPI api; - - public CoreProtectHook() { - api = ((CoreProtect) Bukkit.getPluginManager().getPlugin("CoreProtect")).getAPI(); - } - - @Override - public boolean checkBlock(Block block, int time) { - List lookup = api.blockLookup(block, time); - if (lookup.isEmpty()) return false; - - String[] result = lookup.get(0); - CoreProtectAPI.ParseResult parseResult = api.parseResult(result); - - return !parseResult.getPlayer().isEmpty() && parseResult.getActionId() == 1; - } - -} diff --git a/src/main/java/com/leonardobishop/quests/hooks/coreprotect/CoreProtectNoHook.java b/src/main/java/com/leonardobishop/quests/hooks/coreprotect/CoreProtectNoHook.java deleted file mode 100644 index 1587d726..00000000 --- a/src/main/java/com/leonardobishop/quests/hooks/coreprotect/CoreProtectNoHook.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.leonardobishop.quests.hooks.coreprotect; - -import org.bukkit.block.Block; - -public class CoreProtectNoHook implements ICoreProtectHook { - @Override - public boolean checkBlock(Block block, int time) { - return false; - } -} diff --git a/src/main/java/com/leonardobishop/quests/hooks/coreprotect/ICoreProtectHook.java b/src/main/java/com/leonardobishop/quests/hooks/coreprotect/ICoreProtectHook.java deleted file mode 100644 index b69a1b46..00000000 --- a/src/main/java/com/leonardobishop/quests/hooks/coreprotect/ICoreProtectHook.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.leonardobishop.quests.hooks.coreprotect; - -import org.bukkit.block.Block; - -public interface ICoreProtectHook { - - /** - * Check whether or not the most recent edit to a block was the result of a player. - * - * @param block the block - * @param time the time to look back in seconds - * @return true if from a player - */ - boolean checkBlock(Block block, int time); - -} diff --git a/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter.java b/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter.java deleted file mode 100644 index a0d7545e..00000000 --- a/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.leonardobishop.quests.hooks.itemgetter; - -import com.leonardobishop.quests.Quests; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.inventory.ItemStack; - -public interface ItemGetter { - - /** - * Gets an ItemStack from a configuration. - * Implementations should specific to the server version. - * - * @param path the path to where the item is defined in the config (null if item is defined in second param) - * @param config the configuration file - * @param plugin Quests plugin instance - * @param excludes exclude certain fields in the configuration - * @return {@link org.bukkit.inventory.ItemStack} - */ - ItemStack getItem(String path, ConfigurationSection config, Quests plugin, Filter... excludes); - - /** - * Gets an ItemStack from a given string (which represents a material). - * For pre-1.13 server implementations, the string may use a data code. - * - * @param material the string - * @return {@link org.bukkit.inventory.ItemStack} - */ - ItemStack getItemStack(String material, Quests plugin); - - /** - * Validates a material from a string. - * For pre-1.13 server implementations, the string may use a data code. - * - * @param material the string - * @return true if it a material - */ - boolean isValidMaterial(String material); - - enum Filter { - DISPLAY_NAME, - LORE, - ENCHANTMENTS, - ITEM_FLAGS, - UNBREAKABLE, - ATTRIBUTE_MODIFIER, - CUSTOM_MODEL_DATA; - } -} \ No newline at end of file diff --git a/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetterLatest.java b/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetterLatest.java deleted file mode 100644 index 2cb1ec88..00000000 --- a/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetterLatest.java +++ /dev/null @@ -1,245 +0,0 @@ -package com.leonardobishop.quests.hooks.itemgetter; - -import com.leonardobishop.quests.Quests; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.NamespacedKey; -import org.bukkit.attribute.Attribute; -import org.bukkit.attribute.AttributeModifier; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.inventory.EquipmentSlot; -import org.bukkit.inventory.ItemFlag; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -public class ItemGetterLatest implements ItemGetter { - - /* - supporting: - - name - - material - - lore - - enchantments (NamespacedKey) - - itemflags - - unbreakable - - attribute modifier - - custom model data - - requires at least API version 1.14 - */ - @Override - public ItemStack getItem(String path, ConfigurationSection config, Quests plugin, ItemGetter.Filter... excludes) { - if (path != null && !path.equals("")) { - path = path + "."; - } - List filters = Arrays.asList(excludes); - - String cName = config.getString(path + "name", path + "name"); - String cType = config.getString(path + "item", config.getString(path + "type", path + "item")); - boolean hasCustomModelData = config.contains(path + "custommodeldata"); - int customModelData = config.getInt(path + "custommodeldata", 0); - boolean unbreakable = config.getBoolean(path + "unbreakable", false); - List cLore = config.getStringList(path + "lore"); - List cItemFlags = config.getStringList(path + "itemflags"); - boolean hasAttributeModifiers = config.contains(path + "attributemodifiers"); - List> cAttributeModifiers = config.getMapList(path + "attributemodifiers"); - - String name; - Material type = null; - int data = 0; - - // material - ItemStack is = getItemStack(cType, plugin); - ItemMeta ism = is.getItemMeta(); - - // name - if (!filters.contains(Filter.DISPLAY_NAME)) { - name = ChatColor.translateAlternateColorCodes('&', cName); - ism.setDisplayName(name); - } - - // lore - if (!filters.contains(Filter.LORE)) { - List lore = new ArrayList<>(); - if (cLore != null) { - for (String s : cLore) { - lore.add(ChatColor.translateAlternateColorCodes('&', s)); - } - } - ism.setLore(lore); - } - - // attribute modifiers - if (!filters.contains(Filter.ATTRIBUTE_MODIFIER)) { - if (hasAttributeModifiers) { - for (Map attr : cAttributeModifiers) { - String cAttribute = (String) attr.get("attribute"); - Attribute attribute = null; - for (Attribute enumattr : Attribute.values()) { - if (enumattr.toString().equals(cAttribute)) { - attribute = enumattr; - break; - } - } - - if (attribute == null) continue; - - Map configurationSection = (Map) attr.get("modifier"); - - String cUUID = (String) configurationSection.get("uuid"); - String cModifierName = (String) configurationSection.get("name"); - String cModifierOperation = (String) configurationSection.get("operation"); - double cAmount; - try { - Object cAmountObj = configurationSection.get("amount"); - if (cAmountObj instanceof Integer) { - cAmount = ((Integer) cAmountObj).doubleValue(); - } else { - cAmount = (Double) cAmountObj; - } - } catch (Exception e) { - cAmount = 1; - } - String cEquipmentSlot = (String) configurationSection.get("equipmentslot"); - - UUID uuid = null; - if (cUUID != null) { - try { - uuid = UUID.fromString(cUUID); - } catch (Exception ignored) { - // ignored - } - } - EquipmentSlot equipmentSlot = null; - if (cEquipmentSlot != null) { - try { - equipmentSlot = EquipmentSlot.valueOf(cEquipmentSlot); - } catch (Exception ignored) { - // ignored - } - } - AttributeModifier.Operation operation = AttributeModifier.Operation.ADD_NUMBER; - try { - operation = AttributeModifier.Operation.valueOf(cModifierOperation); - } catch (Exception ignored) { - // ignored - } - - AttributeModifier modifier; - if (uuid == null) { - modifier = new AttributeModifier(cModifierName, cAmount, operation); - } else if (equipmentSlot == null) { - modifier = new AttributeModifier(uuid, cModifierName, cAmount, operation); - } else { - modifier = new AttributeModifier(uuid, cModifierName, cAmount, operation, equipmentSlot); - } - - ism.addAttributeModifier(attribute, modifier); - } - } - } - - // item flags - if (!filters.contains(Filter.ITEM_FLAGS)) { - if (config.isSet(path + "itemflags")) { - for (String flag : cItemFlags) { - for (ItemFlag iflag : ItemFlag.values()) { - if (iflag.toString().equals(flag)) { - ism.addItemFlags(iflag); - break; - } - } - } - } - } - - // custom model data - if (!filters.contains(Filter.CUSTOM_MODEL_DATA)) { - if (hasCustomModelData) { - ism.setCustomModelData(customModelData); - } - } - - // unbreakable - if (!filters.contains(Filter.UNBREAKABLE)) { - ism.setUnbreakable(unbreakable); - } - - // enchantments - if (!filters.contains(Filter.ENCHANTMENTS)) { - if (config.isSet(path + "enchantments")) { - for (String key : config.getStringList(path + "enchantments")) { - String[] split = key.split(":"); - if (split.length < 2) { - plugin.getQuestsLogger().debug("Enchantment does not follow format {namespace}:{name}:{level} : " + key); - continue; - } - String namespace = split[0]; - String ench = split[1]; - String levelName; - if (split.length >= 3) { - levelName = split[2]; - } else { - levelName = "1"; - } - - // TODO i don't know how these namespaces work -// NamespacedKey namespacedKey; -// try { -// namespacedKey = new NamespacedKey(namespace, ench); -// } catch (Exception e) { -// plugin.getQuestsLogger().debug("Unrecognised namespace: " + namespace); -// e.printStackTrace(); -// continue; -// } - Enchantment enchantment; - if ((enchantment = Enchantment.getByName(ench)) == null) { - plugin.getQuestsLogger().debug("Unrecognised enchantment: " + ench); - continue; - } - - int level; - try { - level = Integer.parseInt(levelName); - } catch (NumberFormatException e) { - level = 1; - } - - ism.addEnchant(enchantment, level, true); - } - } - } - - is.setItemMeta(ism); - return is; - } - - @Override - public ItemStack getItemStack(String material, Quests plugin) { - Material type; - try { - type = Material.valueOf(material); - } catch (Exception e) { - plugin.getQuestsLogger().debug("Unrecognised material: " + material); - type = Material.STONE; - } - return new ItemStack(type, 1); - } - - @Override - public boolean isValidMaterial(String material) { - try { - Material.valueOf(material); - return true; - } catch (IllegalArgumentException ex) { - return false; - } - } -} diff --git a/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter_1_13.java b/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter_1_13.java deleted file mode 100644 index 446bd1f5..00000000 --- a/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter_1_13.java +++ /dev/null @@ -1,234 +0,0 @@ -package com.leonardobishop.quests.hooks.itemgetter; - -import com.leonardobishop.quests.Quests; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.NamespacedKey; -import org.bukkit.attribute.Attribute; -import org.bukkit.attribute.AttributeModifier; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.inventory.EquipmentSlot; -import org.bukkit.inventory.ItemFlag; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -public class ItemGetter_1_13 implements ItemGetter { - /* - reads the following: - - name - - material - - lore - - enchantments (NamespacedKey) - - itemflags - - unbreakable - - attribute modifier - - requires at least API version 1.13 - */ - @Override - public ItemStack getItem(String path, ConfigurationSection config, Quests plugin, ItemGetter.Filter... excludes) { - if (path != null && !path.equals("")) { - path = path + "."; - } - List filters = Arrays.asList(excludes); - - String cName = config.getString(path + "name", path + "name"); - String cType = config.getString(path + "item", config.getString(path + "type", path + "item")); - boolean unbreakable = config.getBoolean(path + "unbreakable", false); - List cLore = config.getStringList(path + "lore"); - List cItemFlags = config.getStringList(path + "itemflags"); - boolean hasAttributeModifiers = config.contains(path + "attributemodifiers"); - List> cAttributeModifiers = config.getMapList(path + "attributemodifiers"); - - String name; - Material type = null; - int data = 0; - - // material - ItemStack is = getItemStack(cType, plugin); - ItemMeta ism = is.getItemMeta(); - - // name - if (!filters.contains(Filter.DISPLAY_NAME)) { - name = ChatColor.translateAlternateColorCodes('&', cName); - ism.setDisplayName(name); - } - - // lore - if (!filters.contains(Filter.LORE)) { - List lore = new ArrayList<>(); - if (cLore != null) { - for (String s : cLore) { - lore.add(ChatColor.translateAlternateColorCodes('&', s)); - } - } - ism.setLore(lore); - } - - // attribute modifiers - if (!filters.contains(Filter.ATTRIBUTE_MODIFIER)) { - if (hasAttributeModifiers) { - for (Map attr : cAttributeModifiers) { - String cAttribute = (String) attr.get("attribute"); - Attribute attribute = null; - for (Attribute enumattr : Attribute.values()) { - if (enumattr.toString().equals(cAttribute)) { - attribute = enumattr; - break; - } - } - - if (attribute == null) continue; - - Map configurationSection = (Map) attr.get("modifier"); - - String cUUID = (String) configurationSection.get("uuid"); - String cModifierName = (String) configurationSection.get("name"); - String cModifierOperation = (String) configurationSection.get("operation"); - double cAmount; - try { - Object cAmountObj = configurationSection.get("amount"); - if (cAmountObj instanceof Integer) { - cAmount = ((Integer) cAmountObj).doubleValue(); - } else { - cAmount = (Double) cAmountObj; - } - } catch (Exception e) { - cAmount = 1; - } - String cEquipmentSlot = (String) configurationSection.get("equipmentslot"); - - UUID uuid = null; - if (cUUID != null) { - try { - uuid = UUID.fromString(cUUID); - } catch (Exception ignored) { - // ignored - } - } - EquipmentSlot equipmentSlot = null; - if (cEquipmentSlot != null) { - try { - equipmentSlot = EquipmentSlot.valueOf(cEquipmentSlot); - } catch (Exception ignored) { - // ignored - } - } - AttributeModifier.Operation operation = AttributeModifier.Operation.ADD_NUMBER; - try { - operation = AttributeModifier.Operation.valueOf(cModifierOperation); - } catch (Exception ignored) { - // ignored - } - - AttributeModifier modifier; - if (uuid == null) { - modifier = new AttributeModifier(cModifierName, cAmount, operation); - } else if (equipmentSlot == null) { - modifier = new AttributeModifier(uuid, cModifierName, cAmount, operation); - } else { - modifier = new AttributeModifier(uuid, cModifierName, cAmount, operation, equipmentSlot); - } - - ism.addAttributeModifier(attribute, modifier); - } - } - } - - // item flags - if (!filters.contains(Filter.ITEM_FLAGS)) { - if (config.isSet(path + "itemflags")) { - for (String flag : cItemFlags) { - for (ItemFlag iflag : ItemFlag.values()) { - if (iflag.toString().equals(flag)) { - ism.addItemFlags(iflag); - break; - } - } - } - } - } - - // unbreakable - if (!filters.contains(Filter.UNBREAKABLE)) { - ism.setUnbreakable(unbreakable); - } - - // enchantments - if (!filters.contains(Filter.ENCHANTMENTS)) { - if (config.isSet(path + "enchantments")) { - for (String key : config.getStringList(path + "enchantments")) { - String[] split = key.split(":"); - if (split.length < 2) { - plugin.getQuestsLogger().debug("Enchantment does not follow format {namespace}:{name}:{level} : " + key); - continue; - } - String namespace = split[0]; - String ench = split[1]; - String levelName; - if (split.length >= 3) { - levelName = split[2]; - } else { - levelName = "1"; - } - - // TODO i don't know how these namespaces work -// NamespacedKey namespacedKey; -// try { -// namespacedKey = new NamespacedKey(namespace, ench); -// } catch (Exception e) { -// plugin.getQuestsLogger().debug("Unrecognised namespace: " + namespace); -// e.printStackTrace(); -// continue; -// } - Enchantment enchantment; - if ((enchantment = Enchantment.getByName(ench)) == null) { - plugin.getQuestsLogger().debug("Unrecognised enchantment: " + ench); - continue; - } - - int level; - try { - level = Integer.parseInt(levelName); - } catch (NumberFormatException e) { - level = 1; - } - - is.addUnsafeEnchantment(enchantment, level); - } - } - } - - is.setItemMeta(ism); - return is; - } - - @Override - public ItemStack getItemStack(String material, Quests plugin) { - Material type; - try { - type = Material.valueOf(material); - } catch (Exception e) { - plugin.getQuestsLogger().debug("Unrecognised material: " + material); - type = Material.STONE; - } - return new ItemStack(type, 1); - } - - @Override - public boolean isValidMaterial(String material) { - try { - Material.valueOf(material); - return true; - } catch (IllegalArgumentException ex) { - return false; - } - } -} diff --git a/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter_Late_1_8.java b/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter_Late_1_8.java deleted file mode 100644 index 07ff0456..00000000 --- a/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter_Late_1_8.java +++ /dev/null @@ -1,161 +0,0 @@ -package com.leonardobishop.quests.hooks.itemgetter; - -import com.leonardobishop.quests.Quests; -import org.apache.commons.lang.StringUtils; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.inventory.ItemFlag; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.regex.Pattern; - -public class ItemGetter_Late_1_8 implements ItemGetter { - /* - reads the following: - - name - - material (+ DATA) - - lore - - enchantments (NOT NamespacedKey) - - itemflags - - requires at least API version 1.8 (?) - */ - @Override - public ItemStack getItem(String path, ConfigurationSection config, Quests plugin, Filter... excludes) { - if (path != null && !path.equals("")) { - path = path + "."; - } - List filters = Arrays.asList(excludes); - - - String cName = config.getString(path + "name", path + "name"); - String cType = config.getString(path + "item", config.getString(path + "type", path + "item")); - List cLore = config.getStringList(path + "lore"); - List cItemFlags = config.getStringList(path + "itemflags"); - - String name; - Material type = null; - int data = 0; - - // material - ItemStack is = getItemStack(cType, plugin); - ItemMeta ism = is.getItemMeta(); - - // lore - if (!filters.contains(Filter.LORE)) { - List lore = new ArrayList<>(); - if (cLore != null) { - for (String s : cLore) { - lore.add(ChatColor.translateAlternateColorCodes('&', s)); - } - } - ism.setLore(lore); - } - - // name - if (!filters.contains(Filter.DISPLAY_NAME)) { - name = ChatColor.translateAlternateColorCodes('&', cName); - ism.setDisplayName(name); - } - - - // item flags - if (!filters.contains(Filter.ITEM_FLAGS)) { - if (config.isSet(path + "itemflags")) { - for (String flag : cItemFlags) { - for (ItemFlag iflag : ItemFlag.values()) { - if (iflag.toString().equals(flag)) { - ism.addItemFlags(iflag); - break; - } - } - } - } - } - - // enchantments - if (!filters.contains(Filter.ENCHANTMENTS)) { - if (config.isSet(path + "enchantments")) { - for (String key : config.getStringList(path + "enchantments")) { - String[] split = key.split(":"); - String ench = split[0]; - String levelName; - if (split.length >= 2) { - levelName = split[1]; - } else { - levelName = "1"; - } - - Enchantment enchantment; - if ((enchantment = Enchantment.getByName(ench)) == null) { - plugin.getQuestsLogger().debug("Unrecognised enchantment: " + ench); - continue; - } - - int level; - try { - level = Integer.parseInt(levelName); - } catch (NumberFormatException e) { - level = 1; - } - - ism.addEnchant(enchantment, level, true); - } - } - } - - is.setItemMeta(ism); - return is; - } - - - @Override - public ItemStack getItemStack(String material, Quests plugin) { - Material type = null; - int data = 0; - - if (Material.getMaterial(material) != null) { - type = Material.getMaterial(material); - } else if (material.contains(":")) { - String[] parts = material.split(Pattern.quote(":")); - if (parts.length > 1) { - if (Material.getMaterial(parts[0]) != null) { - type = Material.getMaterial(parts[0]); - } - if (StringUtils.isNumeric(parts[1])) { - data = Integer.parseInt(parts[1]); - } - } - } - - if (type == null) { - plugin.getQuestsLogger().debug("Unrecognised material: " + material); - type = Material.STONE; - } - return new ItemStack(type, 1, (short) data); - } - - @Override - public boolean isValidMaterial(String material) { - Material type = null; - - if (Material.getMaterial(material) != null) { - type = Material.getMaterial(material); - } else if (material.contains(":")) { - String[] parts = material.split(Pattern.quote(":")); - if (parts.length > 1) { - if (Material.getMaterial(parts[0]) != null) { - type = Material.getMaterial(parts[0]); - } - } - } - - return !(type == null); - } -} diff --git a/src/main/java/com/leonardobishop/quests/hooks/papi/IPlaceholderAPIHook.java b/src/main/java/com/leonardobishop/quests/hooks/papi/IPlaceholderAPIHook.java deleted file mode 100644 index bc0c92a2..00000000 --- a/src/main/java/com/leonardobishop/quests/hooks/papi/IPlaceholderAPIHook.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.leonardobishop.quests.hooks.papi; - -import com.leonardobishop.quests.Quests; -import org.bukkit.entity.Player; - -public interface IPlaceholderAPIHook { - - String replacePlaceholders(Player player, String text); - - void registerExpansion(Quests plugin); - - void unregisterExpansion(); - -} diff --git a/src/main/java/com/leonardobishop/quests/hooks/papi/PlaceholderAPIHook.java b/src/main/java/com/leonardobishop/quests/hooks/papi/PlaceholderAPIHook.java deleted file mode 100644 index 66e93109..00000000 --- a/src/main/java/com/leonardobishop/quests/hooks/papi/PlaceholderAPIHook.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.leonardobishop.quests.hooks.papi; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.api.QuestsPlaceholders; -import me.clip.placeholderapi.PlaceholderAPI; -import org.bukkit.entity.Player; - -public class PlaceholderAPIHook implements IPlaceholderAPIHook { - - private QuestsPlaceholders placeholder; - - public String replacePlaceholders(Player player, String text) { - return PlaceholderAPI.setPlaceholders(player, text); - } - - @Override - public void registerExpansion(Quests plugin) { - placeholder = new QuestsPlaceholders(plugin); - placeholder.register(); - } - - @Override - public void unregisterExpansion() { - placeholder.unregister(); - } - - -} diff --git a/src/main/java/com/leonardobishop/quests/hooks/title/Title.java b/src/main/java/com/leonardobishop/quests/hooks/title/Title.java deleted file mode 100644 index 030d7455..00000000 --- a/src/main/java/com/leonardobishop/quests/hooks/title/Title.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.leonardobishop.quests.hooks.title; - -import org.bukkit.entity.Player; - -public interface Title { - - void sendTitle(Player player, String message, String submessage); -} \ No newline at end of file diff --git a/src/main/java/com/leonardobishop/quests/hooks/title/Title_Bukkit.java b/src/main/java/com/leonardobishop/quests/hooks/title/Title_Bukkit.java deleted file mode 100644 index 0f46771a..00000000 --- a/src/main/java/com/leonardobishop/quests/hooks/title/Title_Bukkit.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.leonardobishop.quests.hooks.title; - -import org.bukkit.entity.Player; - -public class Title_Bukkit implements Title { - - // new title function with timings - @Override - public void sendTitle(Player player, String message, String submessage) { - player.sendTitle(message, submessage, 10, 100, 10); - } -} diff --git a/src/main/java/com/leonardobishop/quests/hooks/title/Title_BukkitNoTimings.java b/src/main/java/com/leonardobishop/quests/hooks/title/Title_BukkitNoTimings.java deleted file mode 100644 index 92ffdd16..00000000 --- a/src/main/java/com/leonardobishop/quests/hooks/title/Title_BukkitNoTimings.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.leonardobishop.quests.hooks.title; - -import org.bukkit.entity.Player; - -public class Title_BukkitNoTimings implements Title { - - // this one is for 1.8, 1.9 and 1.10 where there was no timings method - @Override - public void sendTitle(Player player, String message, String submessage) { - player.sendTitle(message, submessage); - } - -} diff --git a/src/main/java/com/leonardobishop/quests/hooks/title/Title_Other.java b/src/main/java/com/leonardobishop/quests/hooks/title/Title_Other.java deleted file mode 100644 index ab7b7bf2..00000000 --- a/src/main/java/com/leonardobishop/quests/hooks/title/Title_Other.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.leonardobishop.quests.hooks.title; - -import org.bukkit.entity.Player; - -public class Title_Other implements Title { - - @Override - public void sendTitle(Player player, String message, String submessage) { - // title function does not exist - } -} diff --git a/src/main/java/com/leonardobishop/quests/listener/MenuController.java b/src/main/java/com/leonardobishop/quests/listener/MenuController.java new file mode 100644 index 00000000..117a797c --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/listener/MenuController.java @@ -0,0 +1,49 @@ +package com.leonardobishop.quests.listener; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.menu.QMenu; +import org.bukkit.entity.HumanEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryType; + +import java.util.HashMap; +import java.util.UUID; + +public class MenuController implements Listener { + + private final HashMap tracker = new HashMap<>(); + private final Quests plugin; + + public MenuController(Quests plugin) { + this.plugin = plugin; + } + + public void openMenu(HumanEntity player, QMenu qMenu, int page) { + player.openInventory(qMenu.toInventory(page)); + tracker.put(player.getUniqueId(), qMenu); + } + + @EventHandler + private void onClose(InventoryCloseEvent event) { + tracker.remove(event.getPlayer().getUniqueId()); + } + + @EventHandler + private void onClick(InventoryClickEvent event) { + // check if the player has a quest menu open + if (tracker.containsKey(event.getWhoClicked().getUniqueId())) { + event.setCancelled(true); + if (event.getClickedInventory() == null) + return; //The player clicked outside the inventory + if (event.getClickedInventory().getType() == InventoryType.PLAYER) + return; //The clicked inventory is a player inventory type + + QMenu qMenu = tracker.get(event.getWhoClicked().getUniqueId()); + qMenu.handleClick(event, this); + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/listener/PlayerJoinListener.java b/src/main/java/com/leonardobishop/quests/listener/PlayerJoinListener.java new file mode 100644 index 00000000..b3035218 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/listener/PlayerJoinListener.java @@ -0,0 +1,51 @@ +package com.leonardobishop.quests.listener; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.util.Messages; +import com.leonardobishop.quests.util.Options; +import org.bukkit.Bukkit; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerJoinEvent; + +import java.util.UUID; + +public class PlayerJoinListener implements Listener { + + private final Quests plugin; + + public PlayerJoinListener(Quests plugin) { + this.plugin = plugin; + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onAsyncJoin(AsyncPlayerPreLoginEvent event) { + if (!Options.QUEST_JOIN_ASYNC.getBooleanValue()) return; + plugin.getPlayerManager().loadPlayer(event.getUniqueId()); + } + + @EventHandler + public void onEvent(PlayerJoinEvent event) { + UUID playerUuid = event.getPlayer().getUniqueId(); + plugin.getPlayerManager().loadPlayer(playerUuid); + if (Options.SOFT_CLEAN_QUESTSPROGRESSFILE_ON_JOIN.getBooleanValue()) { + plugin.getPlayerManager().getPlayer(playerUuid).getQuestProgressFile().clean(); + if (Options.PUSH_SOFT_CLEAN_TO_DISK.getBooleanValue()) { + plugin.getPlayerManager().getPlayer(playerUuid).getQuestProgressFile().saveToDisk(false); + } + } + if (plugin.getDescription().getVersion().contains("beta") && event.getPlayer().hasPermission("quests.admin")) { + event.getPlayer().sendMessage(Messages.BETA_REMINDER.getMessage()); + } + if (plugin.getUpdater().isUpdateReady() && event.getPlayer().hasPermission("quests.admin")) { + // delay for a bit so they actually see the message + Bukkit.getScheduler().runTaskLater(this.plugin, () -> event.getPlayer().sendMessage(plugin.getUpdater().getMessage()), 50L); + } + + // run a full check to check for any missed quest completions + plugin.getQuestCompleter().queueFullCheck(plugin.getPlayerManager().getPlayer(playerUuid).getQuestProgressFile()); + } + +} diff --git a/src/main/java/com/leonardobishop/quests/listener/PlayerLeaveListener.java b/src/main/java/com/leonardobishop/quests/listener/PlayerLeaveListener.java new file mode 100644 index 00000000..5a5559ae --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/listener/PlayerLeaveListener.java @@ -0,0 +1,21 @@ +package com.leonardobishop.quests.listener; + +import com.leonardobishop.quests.Quests; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; + +public class PlayerLeaveListener implements Listener { + + private final Quests plugin; + + public PlayerLeaveListener(Quests plugin) { + this.plugin = plugin; + } + + @EventHandler + public void onEvent(PlayerQuitEvent event) { + plugin.getPlayerManager().removePlayer(event.getPlayer().getUniqueId()); + } + +} diff --git a/src/main/java/com/leonardobishop/quests/menu/CancelQMenu.java b/src/main/java/com/leonardobishop/quests/menu/CancelQMenu.java index 24cca210..12186348 100644 --- a/src/main/java/com/leonardobishop/quests/menu/CancelQMenu.java +++ b/src/main/java/com/leonardobishop/quests/menu/CancelQMenu.java @@ -1,8 +1,8 @@ package com.leonardobishop.quests.menu; -import com.leonardobishop.quests.events.MenuController; +import com.leonardobishop.quests.listener.MenuController; import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.quests.Quest; +import com.leonardobishop.quests.quest.Quest; import com.leonardobishop.quests.util.Items; import com.leonardobishop.quests.util.Options; import org.bukkit.Bukkit; diff --git a/src/main/java/com/leonardobishop/quests/menu/CategoryQMenu.java b/src/main/java/com/leonardobishop/quests/menu/CategoryQMenu.java index 4353dcb6..3afb4eb4 100644 --- a/src/main/java/com/leonardobishop/quests/menu/CategoryQMenu.java +++ b/src/main/java/com/leonardobishop/quests/menu/CategoryQMenu.java @@ -1,7 +1,7 @@ package com.leonardobishop.quests.menu; import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.events.MenuController; +import com.leonardobishop.quests.listener.MenuController; import com.leonardobishop.quests.menu.element.CategoryMenuElement; import com.leonardobishop.quests.menu.element.CustomMenuElement; import com.leonardobishop.quests.menu.element.MenuElement; diff --git a/src/main/java/com/leonardobishop/quests/menu/MenuUtil.java b/src/main/java/com/leonardobishop/quests/menu/MenuUtil.java index a0b230e3..2f04a4f2 100644 --- a/src/main/java/com/leonardobishop/quests/menu/MenuUtil.java +++ b/src/main/java/com/leonardobishop/quests/menu/MenuUtil.java @@ -1,8 +1,8 @@ package com.leonardobishop.quests.menu; import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.events.MenuController; -import com.leonardobishop.quests.quests.Quest; +import com.leonardobishop.quests.listener.MenuController; +import com.leonardobishop.quests.quest.Quest; import com.leonardobishop.quests.util.Options; import org.bukkit.Bukkit; import org.bukkit.entity.Player; diff --git a/src/main/java/com/leonardobishop/quests/menu/QItemStack.java b/src/main/java/com/leonardobishop/quests/menu/QItemStack.java index c7a3d530..81568605 100644 --- a/src/main/java/com/leonardobishop/quests/menu/QItemStack.java +++ b/src/main/java/com/leonardobishop/quests/menu/QItemStack.java @@ -3,8 +3,7 @@ package com.leonardobishop.quests.menu; import com.leonardobishop.quests.Quests; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.quests.Quest; +import com.leonardobishop.quests.quest.Quest; import com.leonardobishop.quests.util.Options; import org.bukkit.Bukkit; import org.bukkit.enchantments.Enchantment; diff --git a/src/main/java/com/leonardobishop/quests/menu/QMenu.java b/src/main/java/com/leonardobishop/quests/menu/QMenu.java index b20ddadd..6b793c77 100644 --- a/src/main/java/com/leonardobishop/quests/menu/QMenu.java +++ b/src/main/java/com/leonardobishop/quests/menu/QMenu.java @@ -1,12 +1,10 @@ package com.leonardobishop.quests.menu; -import com.leonardobishop.quests.events.MenuController; +import com.leonardobishop.quests.listener.MenuController; import com.leonardobishop.quests.player.QPlayer; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; -import java.util.HashMap; - public interface QMenu { QPlayer getOwner(); diff --git a/src/main/java/com/leonardobishop/quests/menu/QuestQMenu.java b/src/main/java/com/leonardobishop/quests/menu/QuestQMenu.java index 46891604..af655886 100644 --- a/src/main/java/com/leonardobishop/quests/menu/QuestQMenu.java +++ b/src/main/java/com/leonardobishop/quests/menu/QuestQMenu.java @@ -2,14 +2,14 @@ package com.leonardobishop.quests.menu; import com.leonardobishop.quests.Quests; import com.leonardobishop.quests.api.enums.QuestStartResult; -import com.leonardobishop.quests.events.MenuController; +import com.leonardobishop.quests.listener.MenuController; import com.leonardobishop.quests.menu.element.CustomMenuElement; import com.leonardobishop.quests.menu.element.MenuElement; import com.leonardobishop.quests.menu.element.QuestMenuElement; import com.leonardobishop.quests.menu.element.SpacerMenuElement; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.quests.Quest; +import com.leonardobishop.quests.quest.Quest; import com.leonardobishop.quests.util.Items; import com.leonardobishop.quests.util.Options; import org.apache.commons.lang.math.NumberUtils; diff --git a/src/main/java/com/leonardobishop/quests/menu/QuestSortWrapper.java b/src/main/java/com/leonardobishop/quests/menu/QuestSortWrapper.java index a742e6e8..2d15ac87 100644 --- a/src/main/java/com/leonardobishop/quests/menu/QuestSortWrapper.java +++ b/src/main/java/com/leonardobishop/quests/menu/QuestSortWrapper.java @@ -1,8 +1,8 @@ package com.leonardobishop.quests.menu; import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.quests.Category; -import com.leonardobishop.quests.quests.Quest; +import com.leonardobishop.quests.quest.Category; +import com.leonardobishop.quests.quest.Quest; public class QuestSortWrapper implements Comparable { diff --git a/src/main/java/com/leonardobishop/quests/menu/StartedQMenu.java b/src/main/java/com/leonardobishop/quests/menu/StartedQMenu.java index 0d1f03ea..317d2839 100644 --- a/src/main/java/com/leonardobishop/quests/menu/StartedQMenu.java +++ b/src/main/java/com/leonardobishop/quests/menu/StartedQMenu.java @@ -1,10 +1,10 @@ package com.leonardobishop.quests.menu; import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.events.MenuController; +import com.leonardobishop.quests.listener.MenuController; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.quests.Quest; +import com.leonardobishop.quests.quest.Quest; import com.leonardobishop.quests.util.Items; import com.leonardobishop.quests.util.Options; import org.bukkit.Bukkit; diff --git a/src/main/java/com/leonardobishop/quests/menu/element/CategoryMenuElement.java b/src/main/java/com/leonardobishop/quests/menu/element/CategoryMenuElement.java index 2e1376eb..13d8a734 100644 --- a/src/main/java/com/leonardobishop/quests/menu/element/CategoryMenuElement.java +++ b/src/main/java/com/leonardobishop/quests/menu/element/CategoryMenuElement.java @@ -2,7 +2,7 @@ package com.leonardobishop.quests.menu.element; import com.leonardobishop.quests.Quests; import com.leonardobishop.quests.menu.QuestQMenu; -import com.leonardobishop.quests.quests.Category; +import com.leonardobishop.quests.quest.Category; import com.leonardobishop.quests.util.Options; import org.bukkit.Bukkit; import org.bukkit.entity.Player; diff --git a/src/main/java/com/leonardobishop/quests/menu/element/QuestMenuElement.java b/src/main/java/com/leonardobishop/quests/menu/element/QuestMenuElement.java index e68154d6..96c358a4 100644 --- a/src/main/java/com/leonardobishop/quests/menu/element/QuestMenuElement.java +++ b/src/main/java/com/leonardobishop/quests/menu/element/QuestMenuElement.java @@ -3,7 +3,7 @@ package com.leonardobishop.quests.menu.element; import com.leonardobishop.quests.Quests; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.quests.Quest; +import com.leonardobishop.quests.quest.Quest; import com.leonardobishop.quests.util.Items; import com.leonardobishop.quests.util.Options; import org.bukkit.Bukkit; diff --git a/src/main/java/com/leonardobishop/quests/player/QPlayer.java b/src/main/java/com/leonardobishop/quests/player/QPlayer.java index 2120c55c..872b02d2 100644 --- a/src/main/java/com/leonardobishop/quests/player/QPlayer.java +++ b/src/main/java/com/leonardobishop/quests/player/QPlayer.java @@ -17,9 +17,9 @@ import com.leonardobishop.quests.player.questprogressfile.QPlayerPreferences; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Category; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; +import com.leonardobishop.quests.quest.Category; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; import com.leonardobishop.quests.util.Messages; import com.leonardobishop.quests.util.Options; import org.bukkit.Bukkit; diff --git a/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgressFile.java b/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgressFile.java index 9cc7609e..da5fd223 100644 --- a/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgressFile.java +++ b/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgressFile.java @@ -1,23 +1,11 @@ package com.leonardobishop.quests.player.questprogressfile; import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.api.enums.QuestStartResult; -import com.leonardobishop.quests.api.events.PlayerCancelQuestEvent; -import com.leonardobishop.quests.api.events.PlayerFinishQuestEvent; -import com.leonardobishop.quests.api.events.PlayerStartQuestEvent; -import com.leonardobishop.quests.api.events.PlayerStartTrackQuestEvent; -import com.leonardobishop.quests.api.events.PlayerStopTrackQuestEvent; -import com.leonardobishop.quests.api.events.PreStartQuestEvent; import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.util.Messages; -import com.leonardobishop.quests.util.Options; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.Player; import java.io.File; import java.io.IOException; diff --git a/src/main/java/com/leonardobishop/quests/quest/Category.java b/src/main/java/com/leonardobishop/quests/quest/Category.java new file mode 100644 index 00000000..d09143dc --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/Category.java @@ -0,0 +1,46 @@ +package com.leonardobishop.quests.quest; + +import org.bukkit.ChatColor; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class Category { + + private final String id; + private final ItemStack displayItem; + private final boolean permissionRequired; + private final List registeredQuestIds = new ArrayList<>(); + + public Category(String id, ItemStack displayItem, boolean permissionRequired) { + this.id = id; + this.displayItem = displayItem; + this.permissionRequired = permissionRequired; + } + + public String getId() { + return id; + } + + public boolean isPermissionRequired() { + return permissionRequired; + } + + public ItemStack getDisplayItem() { + return displayItem; + } + + public void registerQuestId(String questid) { + registeredQuestIds.add(questid); + } + + public List getRegisteredQuestIds() { + return registeredQuestIds; + } + + + public String getDisplayNameStripped() { + return ChatColor.stripColor(this.displayItem.getItemMeta().getDisplayName()); + } +} diff --git a/src/main/java/com/leonardobishop/quests/quest/Quest.java b/src/main/java/com/leonardobishop/quests/quest/Quest.java new file mode 100644 index 00000000..c286a45a --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/Quest.java @@ -0,0 +1,133 @@ +package com.leonardobishop.quests.quest; + +import com.leonardobishop.quests.menu.QItemStack; +import org.bukkit.ChatColor; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Quest implements Comparable { + + private Map tasks = new HashMap<>(); + private final String id; + private final QItemStack displayItem; + private final List rewards; + private final List requirements; + private final List rewardString; + private final List startString; + private final boolean repeatable; + private final boolean cooldownEnabled; + private final int cooldown; + private final int sortOrder; + private final boolean permissionRequired; + private final Map placeholders; + private String categoryid; + + + public Quest(String id, QItemStack displayItem, List rewards, List requirements, boolean repeatable, boolean cooldownEnabled, int cooldown, boolean permissionRequired, List rewardString, List startString, Map placeholders, String categoryid, int sortOrder) { + this(id, displayItem, rewards, requirements, repeatable, cooldownEnabled, cooldown, permissionRequired, rewardString, startString, placeholders, sortOrder); + this.categoryid = categoryid; + } + + public Quest(String id, QItemStack displayItem, List rewards, List requirements, boolean repeatable, boolean cooldownEnabled, int cooldown, boolean permissionRequired, List rewardString, List startString, Map placeholders, int sortOrder) { + this.id = id; + this.displayItem = displayItem; + this.rewards = rewards; + this.requirements = requirements; + this.repeatable = repeatable; + this.cooldownEnabled = cooldownEnabled; + this.cooldown = cooldown; + this.permissionRequired = permissionRequired; + this.rewardString = rewardString; + this.startString = startString; + this.placeholders = placeholders; + this.sortOrder = sortOrder; + } + + public void registerTask(Task task) { + tasks.put(task.getId(), task); + } + + public Collection getTasks() { + return tasks.values(); + } + + public Task getTaskById(String id) { + return tasks.get(id); + } + + public List getTasksOfType(String type) { + List tasks = new ArrayList<>(); + for (Task task : getTasks()) { + if (task.getType().equals(type)) { + tasks.add(task); + } + } + return tasks; + } + + + public boolean isPermissionRequired() { + return permissionRequired; + } + + public List getRewardString() { + return rewardString; + } + + public List getStartString() { + return startString; + } + + public String getId() { + return id; + } + + public QItemStack getDisplayItem() { + return displayItem; + } + + public List getRewards() { + return rewards; + } + + public List getRequirements() { + return requirements; + } + + public boolean isRepeatable() { + return repeatable; + } + + public boolean isCooldownEnabled() { + return cooldownEnabled; + } + + public int getCooldown() { + return cooldown; + } + + public String getCategoryId() { + return categoryid; + } + + public String getDisplayNameStripped() { + return ChatColor.stripColor(this.displayItem.getName()); + } + + public Map getPlaceholders() { + return placeholders; + } + + public int getSortOrder() { + return sortOrder; + } + + @Override + public int compareTo(Quest quest) { + return (sortOrder - quest.sortOrder); + } +} diff --git a/src/main/java/com/leonardobishop/quests/quest/QuestManager.java b/src/main/java/com/leonardobishop/quests/quest/QuestManager.java new file mode 100644 index 00000000..2aaea571 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/QuestManager.java @@ -0,0 +1,49 @@ +package com.leonardobishop.quests.quest; + +import com.leonardobishop.quests.Quests; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class QuestManager { + + private final Quests plugin; + + public QuestManager(Quests plugin) { + this.plugin = plugin; + } + + private Map quests = new LinkedHashMap<>(); + private List categories = new ArrayList<>(); + + public void registerQuest(Quest quest) { + quests.put(quest.getId(), quest); + } + + public Quest getQuestById(String id) { + return quests.get(id); + } + + public Map getQuests() { + return quests; + } + + public void registerCategory(Category category) { categories.add(category); } + + public List getCategories() { + return categories; + } + + public Category getCategoryById(String id) { + for (Category category : categories) { + if (category.getId().equals(id)) return category; + } + return null; + } + + public Quests getPlugin() { + return this.plugin; + } +} diff --git a/src/main/java/com/leonardobishop/quests/quest/Task.java b/src/main/java/com/leonardobishop/quests/quest/Task.java new file mode 100644 index 00000000..edac070d --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/Task.java @@ -0,0 +1,41 @@ +package com.leonardobishop.quests.quest; + +import java.util.HashMap; +import java.util.Map; + +public class Task { + + private final Map configValues = new HashMap<>(); + private final String id; + private final String type; + + public Task(String id, String type) { + this.id = id; + this.type = type; + } + + public String getId() { + return id; + } + + public String getType() { + return type; + } + + public Object getConfigValue(String key) { + return configValues.getOrDefault(key, null); //??? this will return null without the need of `OrDefault(key, null)` + } + + public Object getConfigValue(String key, Object def) { + return configValues.getOrDefault(key, def); + } + + public Map getConfigValues() { + return configValues; + } + + public void addConfigValue(String key, Object value) { + configValues.put(key, value); + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/ConfigValue.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/ConfigValue.java new file mode 100644 index 00000000..764e771c --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/ConfigValue.java @@ -0,0 +1,35 @@ +package com.leonardobishop.quests.quest.tasktype; + +/** + * This is for the quest creator and is purely cosmetic. + */ +public final class ConfigValue { + + private final String key; + private final boolean required; + private final String description; + private final String[] requirementExceptions; + + public ConfigValue(String key, boolean required, String description, String... requirementExceptions) { + this.key = key; + this.required = required; + this.description = description; + this.requirementExceptions = requirementExceptions; + } + + public String getKey() { + return key; + } + + public boolean isRequired() { + return required; + } + + public String getDescription() { + return description; + } + + public String[] getRequirementExceptions() { + return requirementExceptions; + } +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/TaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/TaskType.java new file mode 100644 index 00000000..0a6147e7 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/TaskType.java @@ -0,0 +1,116 @@ +package com.leonardobishop.quests.quest.tasktype; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import org.bukkit.event.Listener; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.UUID; + +/** + * A task type which can be used within Quests. A {@link Quest} + * will be registered to this if it contains at least 1 task + * which is of this type. This is so you do not have to + * iterate through every single quest. + */ +public abstract class TaskType implements Listener { + + private final List quests = new ArrayList<>(); + private final String type; + private String author; + private String description; + + /** + * @param type the name of the task type, should not contain spaces + * @param author the name of the person (or people) who wrote it + * @param description a short, simple description of the task type + */ + public TaskType(String type, String author, String description) { + this.type = type; + this.author = author; + this.description = description; + } + + /** + * @param type the name of the task type, should not contain spaces + */ + public TaskType(String type) { + this.type = type; + } + + /** + * Registers a {@link Quest} to this task type. This is usually done when + * all the quests are initially loaded. + * + * @param quest the {@link Quest} to register. + */ + public final void registerQuest(Quest quest) { + if (!quests.contains(quest)) { + quests.add(quest); + } + } + + /** + * Clears the list which contains the registered quests. + */ + public final void unregisterAll() { + quests.clear(); + } + + /** + * @return {@link List} of type {@link Quest} of all registered quests. + */ + public final List getRegisteredQuests() { + return quests; + } + + public final String getType() { + return type; + } + + public String getAuthor() { + return author; + } + + public String getDescription() { + return description; + } + + //TODO rework this + @Deprecated + public List getCreatorConfigValues() { + // not implemented here + return Collections.emptyList(); + } + + /** + * Called when Quests has finished registering all quests to the task type + * May be called several times if an operator uses /quests admin reload + */ + public void onReady() { + // not implemented here + } + + /** + * Called when a player starts a quest containing a task of this type + */ + public void onStart(Quest quest, Task task, UUID playerUUID) { + // not implemented here + } + + public void onDisable() { + // not implemented here + } + + /** + * Called when Quests reloads the configuration - used to detect errors in the configuration of your task type + */ + public List detectProblemsInConfig(String root, HashMap config) { + // not implemented here + return Collections.emptyList(); + } +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/TaskTypeManager.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/TaskTypeManager.java new file mode 100644 index 00000000..0b1fced9 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/TaskTypeManager.java @@ -0,0 +1,69 @@ +package com.leonardobishop.quests.quest.tasktype; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import org.bukkit.Bukkit; + +import java.util.ArrayList; + +public class TaskTypeManager { + + private final Quests plugin; + private boolean allowRegistrations; + + public TaskTypeManager(Quests plugin) { + this.plugin = plugin; + allowRegistrations = true; + } + + public void closeRegistrations() { + allowRegistrations = false; + } + + public boolean areRegistrationsAccepted() { + return allowRegistrations; + } + + private ArrayList taskTypes = new ArrayList<>(); + + public ArrayList getTaskTypes() { + return taskTypes; + } + + public void resetTaskTypes() { + for (TaskType taskType : taskTypes) { + taskType.getRegisteredQuests().clear(); + } + } + + public void registerTaskType(TaskType taskType) { + if (!allowRegistrations) { + throw new IllegalStateException("No longer accepting new task types (must be done before quests are loaded)"); + } + Bukkit.getPluginManager().registerEvents(taskType, plugin); + plugin.getQuestsLogger().info("Task type " + taskType.getType() + " has been registered."); + taskTypes.add(taskType); + } + + public void registerQuestTasksWithTaskTypes(Quest quest) { + if (allowRegistrations) { + throw new IllegalStateException("Still accepting new task types (type registrations must be closed before registering quests)"); + } + for (Task task : quest.getTasks()) { + TaskType t; + if ((t = getTaskType(task.getType())) != null) { + t.registerQuest(quest); + } + } + } + + public TaskType getTaskType(String string) { + for (TaskType taskType : taskTypes) { + if (taskType.getType().equalsIgnoreCase(string)) { + return taskType; + } + } + return null; + } +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/TaskUtils.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/TaskUtils.java new file mode 100644 index 00000000..b2dadb63 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/TaskUtils.java @@ -0,0 +1,89 @@ +package com.leonardobishop.quests.quest.tasktype; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.quest.Task; +import org.bukkit.entity.Player; + +import java.util.List; + +public class TaskUtils { + + public static String TASK_ATTRIBUTION_STRING = ""; + + public static boolean validateWorld(Player player, Task task) { + return validateWorld(player.getLocation().getWorld().getName(), task.getConfigValue("worlds")); + } + + public static boolean validateWorld(String worldName, Task task) { + return validateWorld(worldName, task.getConfigValue("worlds")); + } + + public static boolean validateWorld(String worldName, Object configurationData) { + if (configurationData == null) { + return true; + } + + if (configurationData instanceof List) { + List allowedWorlds = (List) configurationData; + if (!allowedWorlds.isEmpty() && allowedWorlds.get(0) instanceof String) { + List allowedWorldNames = (List) allowedWorlds; + return allowedWorldNames.contains(worldName); + } + return true; + } + + if (configurationData instanceof String) { + String allowedWorld = (String) configurationData; + return worldName.equals(allowedWorld); + } + + return true; + } + + public static void configValidateInt(String path, Object object, List problems, boolean allowNull, boolean greaterThanZero, String... args) { + if (object == null) { + if (!allowNull) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, + String.format("Expected an integer for '%s', but got null instead", (Object[]) args), path)); + } + return; + } + + try { + Integer i = (Integer) object; + if (greaterThanZero && i <= 0) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, + String.format("Value for field '%s' must be greater than 0", (Object[]) args), path)); + } + } catch (ClassCastException ex) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, + String.format("Expected an integer for '%s', but got '" + object + "' instead", (Object[]) args), path)); + } + } + + public static void configValidateBoolean(String path, Object object, List problems, boolean allowNull, String... args) { + if (object == null) { + if (!allowNull) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, + String.format("Expected a boolean for '%s', but got null instead", (Object[]) args), path)); + } + return; + } + + try { + Boolean b = (Boolean) object; + } catch (ClassCastException ex) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, + String.format("Expected a boolean for '%s', but got '" + object + "' instead", (Object[]) args), path)); + } + } + + public static boolean configValidateExists(String path, Object object, List problems, String... args) { + if (object == null) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, + String.format(QuestsConfigLoader.ConfigProblemDescriptions.TASK_MISSING_FIELD.getDescription(args), (Object[]) args), path)); + return false; + } + return true; + } +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BreedingTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BreedingTaskType.java new file mode 100644 index 00000000..1531df37 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BreedingTaskType.java @@ -0,0 +1,101 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class BreedingTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public BreedingTaskType() { + super("breeding", TaskUtils.TASK_ATTRIBUTION_STRING, "Breed a set amount of animals."); + this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of animals to be bred")); + this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBreed(CreatureSpawnEvent e) { + if (!e.getSpawnReason().equals(SpawnReason.BREEDING)) { + return; + } + + Entity ent = e.getEntity(); + List entList = ent.getNearbyEntities(10, 10, 10); + + if (entList.isEmpty()) { + return; + } + // Check if there is a player in the list, otherwise: return. + for (Entity current : entList) { + if (current instanceof Player && !current.hasMetadata("NPC")) { + Player player = (Player) current; + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + continue; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(player, task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + int breedingNeeded = (int) task.getConfigValue("amount"); + int breedingProgress; + + if (taskProgress.getProgress() == null) { + breedingProgress = 0; + } else { + breedingProgress = (int) taskProgress.getProgress(); + } + + taskProgress.setProgress(breedingProgress + 1); + + if (((int) taskProgress.getProgress()) >= breedingNeeded) { + taskProgress.setCompleted(true); + } + } + } + } + } + } + } +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BrewingCertainTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BrewingCertainTaskType.java new file mode 100644 index 00000000..2c36f55a --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BrewingCertainTaskType.java @@ -0,0 +1,114 @@ +// TODO: fix +// +//package me.fatpigsarefat.quests.quests.tasktypes.types; +// +//import Quests; +//import QPlayer; +//import QuestProgress; +//import QuestProgressFile; +//import TaskProgress; +//import Quest; +//import Task; +//import ConfigValue; +//import TaskType; +//import org.bukkit.Bukkit; +//import org.bukkit.Location; +//import org.bukkit.Material; +//import org.bukkit.entity.Player; +//import org.bukkit.event.EventHandler; +//import org.bukkit.event.EventPriority; +//import org.bukkit.event.block.Action; +//import org.bukkit.event.inventory.BrewEvent; +//import org.bukkit.event.player.PlayerInteractEvent; +//import org.bukkit.inventory.ItemStack; +// +//import java.util.ArrayList; +//import java.util.HashMap; +//import java.util.List; +//import java.util.UUID; +// +//public final class BrewingCertainTaskType extends TaskType { +// +// private List creatorConfigValues = new ArrayList<>(); +// private HashMap brewingStands = new HashMap<>(); +// +// public BrewingCertainTaskType() { +// super("brewingcertain", "fatpigsarefat", "Brew a certain type of potion."); +// this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of potions to be brewed.")); +// this.creatorConfigValues.add(new ConfigValue("potion", true, "ID of potion to be brewed.")); +// } +// +// @Override +// public List getCreatorConfigValues() { +// return creatorConfigValues; +// } +// +// @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) +// public void onBlockPlace(PlayerInteractEvent event) { +// if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { +// if (event.getClickedBlock().getType() == Material.BREWING_STAND) { +// brewingStands.put(event.getClickedBlock().getLocation(), event.getPlayer().getUniqueId()); +// } +// } +// } +// +// @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) +// public void onBlockPlace(BrewEvent event) { +// UUID uuid; +// if ((uuid = brewingStands.get(event.getBlock().getLocation())) != null) { +// Player player = Bukkit.getPlayer(uuid); +// +// if (player == null) { +// return; +// } +// +// QPlayer qPlayer = Quests.getPlayerManager().getPlayer(player.getUniqueId()); +// QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile(); +// +// for (Quest quest : super.getRegisteredQuests()) { +// if (questProgressFile.hasStartedQuest(quest)) { +// QuestProgress questProgress = questProgressFile.getQuestProgress(quest); +// +// for (Task task : quest.getTasksOfType(super.getType())) { +// TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); +// +// if (taskProgress.isCompleted()) { +// continue; +// } +// +// int potionsNeeded = (int) task.getConfigValue("amount"); +// +// int progress; +// if (taskProgress.getProgress() == null) { +// progress = 0; +// } else { +// progress = (int) taskProgress.getProgress(); +// } +// +// int potionType = (int) task.getConfigValue("potion"); +// +// ItemStack potion1 = event.getContents().getItem(0); +// if (potion1.getDurability() != potionType) { +// potion1 = null; +// } +// ItemStack potion2 = event.getContents().getItem(1); +// if (potion2.getDurability() != potionType) { +// potion2 = null; +// } +// ItemStack potion3 = event.getContents().getItem(2); +// if (potion3.getDurability() != potionType) { +// potion3 = null; +// } +// +// taskProgress.setProgress(progress + (potion1 == null ? 0 : 1) + (potion2 == null ? 0 : 1) + (potion3 == null ? 0 : 1)); +// +// if (((int) taskProgress.getProgress()) >= potionsNeeded) { +// taskProgress.setCompleted(true); +// } +// } +// } +// } +// } +// } +// +//} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BrewingTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BrewingTaskType.java new file mode 100644 index 00000000..f05f8a5b --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BrewingTaskType.java @@ -0,0 +1,114 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.inventory.BrewEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.UUID; + +public final class BrewingTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + private HashMap brewingStands = new HashMap<>(); + + public BrewingTaskType() { + super("brewing", TaskUtils.TASK_ATTRIBUTION_STRING, "Brew a potion."); + this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of potions to be brewed.")); + this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockPlace(PlayerInteractEvent event) { + if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { + if (event.getClickedBlock().getType() == Material.BREWING_STAND) { + brewingStands.put(event.getClickedBlock().getLocation(), event.getPlayer().getUniqueId()); + } + } + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockPlace(BrewEvent event) { + UUID uuid; + if ((uuid = brewingStands.get(event.getBlock().getLocation())) != null) { + Player player = Bukkit.getPlayer(uuid); + + if (player == null || player.hasMetadata("NPC")) { + return; + } + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(player, task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + int potionsNeeded = (int) task.getConfigValue("amount"); + + int progress; + if (taskProgress.getProgress() == null) { + progress = 0; + } else { + progress = (int) taskProgress.getProgress(); + } + + ItemStack potion1 = event.getContents().getItem(0); + ItemStack potion2 = event.getContents().getItem(1); + ItemStack potion3 = event.getContents().getItem(2); + + taskProgress.setProgress(progress + (potion1 == null ? 0 : 1) + (potion2 == null ? 0 : 1) + (potion3 == null ? 0 : 1)); + + if (((int) taskProgress.getProgress()) >= potionsNeeded) { + taskProgress.setCompleted(true); + } + } + } + } + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BuildingCertainTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BuildingCertainTaskType.java new file mode 100644 index 00000000..6d44ab9d --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BuildingCertainTaskType.java @@ -0,0 +1,197 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class BuildingCertainTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public BuildingCertainTaskType() { + super("blockplacecertain", TaskUtils.TASK_ATTRIBUTION_STRING, "Place a set amount of a specific block."); + this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of blocks to be placed.")); + this.creatorConfigValues.add(new ConfigValue("block", true, "Name or ID of block.")); + this.creatorConfigValues.add(new ConfigValue("data", false, "Data code for block.")); + this.creatorConfigValues.add(new ConfigValue("reverse-if-broken", false, "Will reverse progression if block of same type is broken.")); + this.creatorConfigValues.add(new ConfigValue("use-similar-blocks", false, "(Deprecated) If true, this will ignore orientation of doors, logs etc.")); + this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + if (config.get("block") == null && config.get("blocks") == null) { + TaskUtils.configValidateExists(root + ".block", config.get("block"), problems, "block", super.getType()); + } else { + Object configBlock; + String source; + if (config.containsKey("block")) { + source = "block"; + } else { + source = "blocks"; + } + configBlock = config.get(source); + List checkBlocks = new ArrayList<>(); + if (configBlock instanceof List) { + checkBlocks.addAll((List) configBlock); + } else { + checkBlocks.add(String.valueOf(configBlock)); + } + + for (String materialName : checkBlocks) { + String[] split = materialName.split(":"); + if (Material.getMaterial(String.valueOf(split[0])) == null) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, + QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(materialName), root + "." + source)); + } + } + } + TaskUtils.configValidateBoolean(root + ".reverse-if-broken", config.get("reverse-if-broken"), problems, true,"reverse-if-broken"); + TaskUtils.configValidateBoolean(root + ".use-similar-blocks", config.get("use-similar-blocks"), problems, true,"use-similar-blocks"); + TaskUtils.configValidateInt(root + ".data", config.get("data"), problems, true,true, "data"); + return problems; + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockPlace(BlockPlaceEvent event) { + if (event.getPlayer().hasMetadata("NPC")) return; + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(event.getPlayer(), task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + if (matchBlock(task, event.getBlock())) { + increment(task, taskProgress, 1); + } + } + } + } + } + + // subtract if enabled + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockBreak(BlockBreakEvent event) { + if (event.getPlayer().hasMetadata("NPC")) return; + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + if (task.getConfigValue("reverse-if-placed") != null && ((boolean) task.getConfigValue("reverse-if-placed"))) { + if (matchBlock(task, event.getBlock())) { + increment(task, taskProgress, -1); + } + } + } + } + } + } + + @SuppressWarnings("deprecation") + private boolean matchBlock(Task task, Block block) { + Material material; + + Object configBlock = task.getConfigValues().containsKey("block") ? task.getConfigValue("block") : task.getConfigValue("blocks"); + Object configData = task.getConfigValue("data"); + Object configSimilarBlocks = task.getConfigValue("use-similar-blocks"); + + List checkBlocks = new ArrayList<>(); + if (configBlock instanceof List) { + checkBlocks.addAll((List) configBlock); + } else { + checkBlocks.add(String.valueOf(configBlock)); + } + + for (String materialName : checkBlocks) { + // LOG:1 LOG:2 LOG should all be supported with this + String[] split = materialName.split(":"); + int comparableData = 0; + if (configData != null) { + comparableData = (int) configData; + } + if (split.length > 1) { + comparableData = Integer.parseInt(split[1]); + } + + material = Material.getMaterial(String.valueOf(split[0])); + Material blockType = block.getType(); + + short blockData = block.getData(); + + if (blockType == material) { + if (((split.length == 1 && configData == null) || ((int) blockData) == comparableData)) + return true; + } + } + return false; + } + + private void increment(Task task, TaskProgress taskProgress, int amount) { + int brokenBlocksNeeded = (int) task.getConfigValue("amount"); + + int progressBlocksBroken; + if (taskProgress.getProgress() == null) { + progressBlocksBroken = 0; + } else { + progressBlocksBroken = (int) taskProgress.getProgress(); + } + + taskProgress.setProgress(progressBlocksBroken + amount); + + if (((int) taskProgress.getProgress()) >= brokenBlocksNeeded) { + taskProgress.setCompleted(true); + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BuildingTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BuildingTaskType.java new file mode 100644 index 00000000..1ca89cea --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BuildingTaskType.java @@ -0,0 +1,85 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockPlaceEvent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class BuildingTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public BuildingTaskType() { + super("blockplace", TaskUtils.TASK_ATTRIBUTION_STRING, "Place a set amount of blocks."); + this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of blocks to be placed.")); + this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockPlace(BlockPlaceEvent event) { + if (event.getPlayer().hasMetadata("NPC")) return; + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(event.getPlayer(), task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + int brokenBlocksNeeded = (int) task.getConfigValue("amount"); + + int progressBlocksBroken; + if (taskProgress.getProgress() == null) { + progressBlocksBroken = 0; + } else { + progressBlocksBroken = (int) taskProgress.getProgress(); + } + + taskProgress.setProgress(progressBlocksBroken + 1); + + if (((int) taskProgress.getProgress()) >= brokenBlocksNeeded) { + taskProgress.setCompleted(true); + } + } + } + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/CommandTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/CommandTaskType.java new file mode 100644 index 00000000..6823e5af --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/CommandTaskType.java @@ -0,0 +1,99 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class CommandTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public CommandTaskType() { + super("command", TaskUtils.TASK_ATTRIBUTION_STRING, "Execute a certain command."); + this.creatorConfigValues.add(new ConfigValue("command", true, "The command to execute.")); + this.creatorConfigValues.add(new ConfigValue("ignore-case", false, "Ignore the casing of the command.")); + this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + TaskUtils.configValidateExists(root + ".command", config.get("command"), problems, "command", super.getType()); + TaskUtils.configValidateBoolean(root + ".ignore-case", config.get("ignore-case"), problems, true, "ignore-case", super.getType()); + return problems; + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onCommand(PlayerCommandPreprocessEvent e) { + if (e.getPlayer().hasMetadata("NPC")) return; + + Player player = e.getPlayer(); + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(player, task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + Object configCommand = task.getConfigValue("command"); + Object configIgnoreCase = task.getConfigValue("ignore-case"); + + List commands = new ArrayList<>(); + if (configCommand instanceof List) { + commands.addAll((List) configCommand); + } else { + commands.add(String.valueOf(configCommand)); + } + + boolean ignoreCasing = false; + if (configIgnoreCase != null) { + ignoreCasing = (boolean) task.getConfigValue("ignore-case"); + } + String message = e.getMessage(); + if (message.length() >= 1) { + message = message.substring(1); + } + + for (String command : commands) { + if (ignoreCasing && command.equalsIgnoreCase(message)) { + taskProgress.setCompleted(true); + } else if (!ignoreCasing && command.equals(message)) { + taskProgress.setCompleted(true); + } + } + } + } + } + } +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/DealDamageTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/DealDamageTaskType.java new file mode 100644 index 00000000..f695b5fb --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/DealDamageTaskType.java @@ -0,0 +1,93 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class DealDamageTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public DealDamageTaskType() { + super("dealdamage", TaskUtils.TASK_ATTRIBUTION_STRING, "Deal a certain amount of damage."); + this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of damage you need to deal")); + this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onDamage(EntityDamageByEntityEvent e) { + if (!(e.getDamager() instanceof Player)) { + return; + } + + Player player = (Player) e.getDamager(); + double damage = e.getDamage(); + + if (player.hasMetadata("NPC")) return; + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(player, task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + double progressDamage; + int damageNeeded = (int) task.getConfigValue("amount"); + + if (taskProgress.getProgress() == null) { + progressDamage = 0.0; + } else { + progressDamage = (double) taskProgress.getProgress(); + } + + taskProgress.setProgress(progressDamage + damage); + + if (((double) taskProgress.getProgress()) >= (double) damageNeeded) { + taskProgress.setProgress(damageNeeded); + taskProgress.setCompleted(true); + } + } + } + } + } +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/DistancefromTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/DistancefromTaskType.java new file mode 100644 index 00000000..bd96760f --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/DistancefromTaskType.java @@ -0,0 +1,118 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerMoveEvent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class DistancefromTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public DistancefromTaskType() { + super("distancefrom", TaskUtils.TASK_ATTRIBUTION_STRING, "Distance yourself from a set of co-ordinates."); + this.creatorConfigValues.add(new ConfigValue("x", true, "X position.")); + this.creatorConfigValues.add(new ConfigValue("y", true, "Y position.")); + this.creatorConfigValues.add(new ConfigValue("z", true, "Z position.")); + this.creatorConfigValues.add(new ConfigValue("world", true, "Name of world.")); + this.creatorConfigValues.add(new ConfigValue("distance", true, "Distance the player needs to be from the co-ordinates.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".x", config.get("x"), problems, "x", super.getType())) + TaskUtils.configValidateInt(root + ".x", config.get("x"), problems, false, false, "x"); + if (TaskUtils.configValidateExists(root + ".y", config.get("y"), problems, "y", super.getType())) + TaskUtils.configValidateInt(root + ".y", config.get("y"), problems, false, false, "y"); + if (TaskUtils.configValidateExists(root + ".z", config.get("z"), problems, "z", super.getType())) + TaskUtils.configValidateInt(root + ".z", config.get("z"), problems, false, false, "z"); + if (TaskUtils.configValidateExists(root + ".distance", config.get("distance"), problems, "distance", super.getType())) + TaskUtils.configValidateInt(root + ".distance", config.get("distance"), problems, false, true, "distance"); + return problems; + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + +// private HashMap> distanceSquaredCache = new HashMap<>(); +// +// @Override +// public void onReady() { +// distanceSquaredCache.clear(); +// for (Quest quest : super.getRegisteredQuests()) { +// HashMap squaredDistances = new HashMap<>(); +// for (Task task : quest.getTasksOfType(super.getType())) { +// int distance = (int) task.getConfigValue("distance"); +// squaredDistances.put(task.getId(), distance); +// } +// distanceSquaredCache.put(quest.getId(), squaredDistances); +// } +// } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onMove(PlayerMoveEvent event) { + if (event.getFrom().getBlockX() == event.getTo().getBlockX() && event.getFrom().getBlockZ() == event.getTo().getBlockZ()) { + return; + } + + if (event.getPlayer().hasMetadata("NPC")) return; + Player player = event.getPlayer(); + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + int x = (int) task.getConfigValue("x"); + int y = (int) task.getConfigValue("y"); + int z = (int) task.getConfigValue("z"); + String worldString = (String) task.getConfigValue("world"); + int distance = (int) task.getConfigValue("distance"); + int distanceSquared = distance * distance; + + World world = Bukkit.getWorld(worldString); + if (world == null) { + continue; + } + + Location location = new Location(world, x, y, z); + if (player.getWorld().equals(world) && player.getLocation().distanceSquared(location) > distanceSquared) { + taskProgress.setCompleted(true); + } + } + } + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/EnchantingTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/EnchantingTaskType.java new file mode 100644 index 00000000..04754176 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/EnchantingTaskType.java @@ -0,0 +1,87 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.enchantment.EnchantItemEvent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class EnchantingTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public EnchantingTaskType() { + super("enchanting", TaskUtils.TASK_ATTRIBUTION_STRING, "Enchant a certain amount of items."); + this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of items you need to enchant.")); + this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onEnchant(EnchantItemEvent e) { + if (e.getEnchanter().hasMetadata("NPC")) return; + + Player player = e.getEnchanter(); + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(player, task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + int enchantsNeeded = (int) task.getConfigValue("amount"); + + int progressEnchant; + if (taskProgress.getProgress() == null) { + progressEnchant = 0; + } else { + progressEnchant = (int) taskProgress.getProgress(); + } + + taskProgress.setProgress(progressEnchant + 1); + + if (((int) taskProgress.getProgress()) >= enchantsNeeded) { + taskProgress.setCompleted(true); + } + } + } + } + } +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/ExpEarnTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/ExpEarnTaskType.java new file mode 100644 index 00000000..61147faf --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/ExpEarnTaskType.java @@ -0,0 +1,85 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerExpChangeEvent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class ExpEarnTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public ExpEarnTaskType() { + super("expearn", TaskUtils.TASK_ATTRIBUTION_STRING, "Earn a set amount of exp."); + this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of exp that needs to be earned.")); + this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onExpEarn(PlayerExpChangeEvent e) { + if (e.getPlayer().hasMetadata("NPC")) return; + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(e.getPlayer().getUniqueId()); + if (qPlayer == null) { + return; + } + + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(e.getPlayer(), task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + int amount = e.getAmount(); + int expNeeded = (int) task.getConfigValue("amount"); + + int progressExp; + if (taskProgress.getProgress() == null) { + progressExp = 0; + } else { + progressExp = (int) taskProgress.getProgress(); + } + + taskProgress.setProgress(progressExp + amount); + + if (((int) taskProgress.getProgress()) >= expNeeded) { + taskProgress.setCompleted(true); + } + } + } + } + } +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/FarmingTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/FarmingTaskType.java new file mode 100644 index 00000000..62223e6d --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/FarmingTaskType.java @@ -0,0 +1,96 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.material.Crops; + +import java.util.ArrayList; +import java.util.List; + +public final class FarmingTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public FarmingTaskType() { + super("farming", TaskUtils.TASK_ATTRIBUTION_STRING, "Break a set amount of a crop."); + this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of crops to be broken.")); + this.creatorConfigValues.add(new ConfigValue("crop", true, "Name or ID of crop.")); + this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @SuppressWarnings("deprecation") + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockBreak(BlockBreakEvent event) { + //TODO: finish this + if (!(event.getBlock().getState() instanceof Crops)) { + return; + } + Crops crop = (Crops) event.getBlock().getState(); + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(event.getPlayer(), task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + Material material; + Object configBlock = task.getConfigValue("block"); + Object configData = task.getConfigValue("data"); + + material = Material.matchMaterial(String.valueOf(configBlock)); + + + if (material != null && event.getBlock().getType().equals(material)) { + + if (configData != null && (((int) event.getBlock().getData()) != ((int) configData))) { + continue; + } + int brokenBlocksNeeded = (int) task.getConfigValue("amount"); + + int progressBlocksBroken; + if (taskProgress.getProgress() == null) { + progressBlocksBroken = 0; + } else { + progressBlocksBroken = (int) taskProgress.getProgress(); + } + + taskProgress.setProgress(progressBlocksBroken + 1); + + if (((int) taskProgress.getProgress()) >= brokenBlocksNeeded) { + taskProgress.setCompleted(true); + } + } + } + } + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/FishingTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/FishingTaskType.java new file mode 100644 index 00000000..fa6d7780 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/FishingTaskType.java @@ -0,0 +1,97 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerFishEvent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class FishingTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public FishingTaskType() { + super("fishing", TaskUtils.TASK_ATTRIBUTION_STRING, "Catch a set amount of items from the sea."); + this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of fish to be caught.")); + this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onFishCaught(PlayerFishEvent event) { + if (event.getPlayer().hasMetadata("NPC")) return; + + if (event.getState() != PlayerFishEvent.State.CAUGHT_FISH) { + return; + } + +// Location hookLocation = event.getHook().getLocation().add(0, -1, 0); +// if (!(hookLocation.getBlock().getType() == Material.WATER)) { +// return; +// } + + Player player = event.getPlayer(); + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(player, task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + int catchesNeeded = (int) task.getConfigValue("amount"); + + int progressCatches; + if (taskProgress.getProgress() == null) { + progressCatches = 0; + } else { + progressCatches = (int) taskProgress.getProgress(); + } + + taskProgress.setProgress(progressCatches + 1); + + if (((int) taskProgress.getProgress()) >= catchesNeeded) { + taskProgress.setCompleted(true); + } + } + } + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/InventoryTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/InventoryTaskType.java new file mode 100644 index 00000000..4e12ab3c --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/InventoryTaskType.java @@ -0,0 +1,183 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.player.PlayerPickupItemEvent; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class InventoryTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + private final Quests plugin; + + public InventoryTaskType(Quests plugin) { + super("inventory", TaskUtils.TASK_ATTRIBUTION_STRING, "Obtain a set of items."); + this.plugin = plugin; + this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of item to retrieve.")); + this.creatorConfigValues.add(new ConfigValue("item", true, "Name or ID of item.")); + this.creatorConfigValues.add(new ConfigValue("data", false, "Data of item.")); + this.creatorConfigValues.add(new ConfigValue("remove-items-when-complete", false, "Take the items away from the player on completion (true/false, " + + "default = false).")); + this.creatorConfigValues.add(new ConfigValue("update-progress", false, "Update the displayed progress (if this causes lag then disable it).")); + this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".item", config.get("item"), problems, "item", super.getType())) { + Object configBlock = config.get("item"); + if (configBlock instanceof ConfigurationSection) { + ConfigurationSection section = (ConfigurationSection) configBlock; + String itemloc = "item"; + if (!section.contains("item")) { + itemloc = "type"; + } + if (!section.contains(itemloc)) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, + QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(""), root + ".item.type")); + } else { + String type = String.valueOf(section.get(itemloc)); + if (!plugin.getItemGetter().isValidMaterial(type)) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, + QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(type), root + ".item." + itemloc)); + } + } + } else { + if (Material.getMaterial(String.valueOf(configBlock)) == null) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, + QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(String.valueOf(configBlock)), root + ".item.item")); + } + } + } + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + TaskUtils.configValidateInt(root + ".data", config.get("data"), problems, true, false, "data"); + TaskUtils.configValidateBoolean(root + ".remove-items-when-complete", config.get("remove-items-when-complete"), problems, true, "remove-items-when-complete", super.getType()); + TaskUtils.configValidateBoolean(root + ".update-progress", config.get("update-progress"), problems, true, "update-progress", super.getType()); + return problems; + } + + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @SuppressWarnings("deprecation") + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onItemPickup(PlayerPickupItemEvent event) { + if (event.getPlayer().hasMetadata("NPC")) return; + + Bukkit.getScheduler().runTaskLater(plugin, () -> this.checkInventory(event.getPlayer()), 1L); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onInventoryClick(InventoryCloseEvent event) { + Bukkit.getScheduler().runTaskLater(plugin, () -> checkInventory((Player) event.getPlayer()), 1L); //Still some work to do as it doesn't really work + } + + @SuppressWarnings("deprecation") + private void checkInventory(Player player) { + if (player == null || !player.isOnline()) { + return; + } + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(player, task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + Material material; + int amount = (int) task.getConfigValue("amount"); + Object configBlock = task.getConfigValue("item"); + Object configData = task.getConfigValue("data"); + Object remove = task.getConfigValue("remove-items-when-complete"); + + ItemStack is; + if (configBlock instanceof ConfigurationSection) { + is = plugin.getItemStack("", (org.bukkit.configuration.ConfigurationSection) configBlock); + } else { + material = Material.getMaterial(String.valueOf(configBlock)); + + if (material == null) { + continue; + } + if (configData != null) { + is = new ItemStack(material, 1, ((Integer) configData).shortValue()); + } else { + is = new ItemStack(material, 1); + } + } + + if (task.getConfigValue("update-progress") != null + && (Boolean) task.getConfigValue("update-progress")) { + int inInv = getAmount(player, is, amount); + if (taskProgress.getProgress() != null && (int) taskProgress.getProgress() != inInv) { + taskProgress.setProgress(inInv); + } else if (taskProgress.getProgress() == null) { + taskProgress.setProgress(inInv); + } + } + + if (player.getInventory().containsAtLeast(is, amount)) { + is.setAmount(amount); + taskProgress.setCompleted(true); + + if (remove != null && ((Boolean) remove)) { + player.getInventory().removeItem(is); + } + } + } + } + } + } + + private int getAmount(Player player, ItemStack is, int max) { + if (is == null) { + return 0; + } + int amount = 0; + for (int i = 0; i < 36; i++) { + ItemStack slot = player.getInventory().getItem(i); + if (slot == null || !slot.isSimilar(is)) + continue; + amount += slot.getAmount(); + } + return Math.min(amount, max); + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MilkingTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MilkingTaskType.java new file mode 100644 index 00000000..8f8232ed --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MilkingTaskType.java @@ -0,0 +1,98 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.Material; +import org.bukkit.entity.Cow; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerInteractEntityEvent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class MilkingTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public MilkingTaskType() { + super("milking", TaskUtils.TASK_ATTRIBUTION_STRING, "Milk a set amount of cows."); + this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of cows to be milked.")); + this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @SuppressWarnings("deprecation") + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onMilk(PlayerInteractEntityEvent event) { + if (!(event.getRightClicked() instanceof Cow) || (event.getPlayer().getItemInHand().getType() != Material.BUCKET)) { + return; + } + + if (event.getPlayer().hasMetadata("NPC")) return; + + Player player = event.getPlayer(); + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + return; + } + + QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile(); + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(player, task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + int cowsNeeded = (int) task.getConfigValue("amount"); + + int progressMilked; + if (taskProgress.getProgress() == null) { + progressMilked = 0; + } else { + progressMilked = (int) taskProgress.getProgress(); + } + + taskProgress.setProgress(progressMilked + 1); + + if (((int) taskProgress.getProgress()) >= cowsNeeded) { + taskProgress.setCompleted(true); + } + } + } + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningCertainTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningCertainTaskType.java new file mode 100644 index 00000000..da497808 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningCertainTaskType.java @@ -0,0 +1,208 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class MiningCertainTaskType extends TaskType { + + private final Quests plugin; + private List creatorConfigValues = new ArrayList<>(); + + public MiningCertainTaskType(Quests plugin) { + super("blockbreakcertain", TaskUtils.TASK_ATTRIBUTION_STRING, "Break a set amount of a specific block."); + this.plugin = plugin; + this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of blocks to be broken.")); + this.creatorConfigValues.add(new ConfigValue("block", true, "Name or ID of block.", "block")); // Can use name:datacode + this.creatorConfigValues.add(new ConfigValue("blocks", true, "List of blocks (alias for block for config readability).", "block")); + this.creatorConfigValues.add(new ConfigValue("data", false, "Data code for block.")); // only used if no datacode provided in block or blocks + this.creatorConfigValues.add(new ConfigValue("reverse-if-placed", false, "Will reverse progression if block of same type is placed.")); + this.creatorConfigValues.add(new ConfigValue("check-coreprotect", false, "Use coreprotect to check for blocks placed by a player")); + this.creatorConfigValues.add(new ConfigValue("check-coreprotect-time", false, "Time period for coreprotect check")); + this.creatorConfigValues.add(new ConfigValue("use-similar-blocks", false, "(Deprecated) If true, this will ignore orientation of doors, logs etc.")); + this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + if (config.get("block") == null && config.get("blocks") == null) { + TaskUtils.configValidateExists(root + ".block", config.get("block"), problems, "block", super.getType()); + } else { + Object configBlock; + String source; + if (config.containsKey("block")) { + source = "block"; + } else { + source = "blocks"; + } + configBlock = config.get(source); + List checkBlocks = new ArrayList<>(); + if (configBlock instanceof List) { + checkBlocks.addAll((List) configBlock); + } else { + checkBlocks.add(String.valueOf(configBlock)); + } + + for (String materialName : checkBlocks) { + String[] split = materialName.split(":"); + if (Material.getMaterial(String.valueOf(split[0])) == null) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, + QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(materialName), root + "." + source)); + } + } + } + TaskUtils.configValidateBoolean(root + ".reverse-if-broken", config.get("reverse-if-broken"), problems, true,"reverse-if-broken"); + TaskUtils.configValidateBoolean(root + ".check-coreprotect", config.get("check-coreprotect"), problems, true,"check-coreprotect"); + TaskUtils.configValidateInt(root + ".check-coreprotect-time", config.get("check-coreprotect-time"), problems, true,true, "check-coreprotect-time"); + TaskUtils.configValidateBoolean(root + ".use-similar-blocks", config.get("use-similar-blocks"), problems, true,"use-similar-blocks"); + TaskUtils.configValidateInt(root + ".data", config.get("data"), problems, true,true, "data"); + return problems; + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockBreak(BlockBreakEvent event) { + if (event.getPlayer().hasMetadata("NPC")) return; + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(event.getPlayer(), task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + if (matchBlock(task, event.getBlock())) { + boolean coreProtectEnabled = (boolean) task.getConfigValue("check-coreprotect", false); + int coreProtectTime = (int) task.getConfigValue("check-coreprotect-time", 3600); + + if (coreProtectEnabled && plugin.getCoreProtectHook().checkBlock(event.getBlock(), coreProtectTime)) { + continue; + } + increment(task, taskProgress, 1); + } + } + } + } + } + + // subtract if enabled + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockPlace(BlockPlaceEvent event) { + if (event.getPlayer().hasMetadata("NPC")) return; + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + if (task.getConfigValue("reverse-if-placed") != null && ((boolean) task.getConfigValue("reverse-if-placed"))) { + if (matchBlock(task, event.getBlock())) { + increment(task, taskProgress, -1); + } + } + } + } + } + } + + @SuppressWarnings("deprecation") + private boolean matchBlock(Task task, Block block) { + Material material; + + Object configBlock = task.getConfigValues().containsKey("block") ? task.getConfigValue("block") : task.getConfigValue("blocks"); + Object configData = task.getConfigValue("data"); + Object configSimilarBlocks = task.getConfigValue("use-similar-blocks"); + + List checkBlocks = new ArrayList<>(); + if (configBlock instanceof List) { + checkBlocks.addAll((List) configBlock); + } else { + checkBlocks.add(String.valueOf(configBlock)); + } + + for (String materialName : checkBlocks) { + // LOG:1 LOG:2 LOG should all be supported with this + String[] split = materialName.split(":"); + int comparableData = 0; + if (configData != null) { + comparableData = (int) configData; + } + if (split.length > 1) { + comparableData = Integer.parseInt(split[1]); + } + + material = Material.getMaterial(String.valueOf(split[0])); + Material blockType = block.getType(); + + short blockData = block.getData(); + + if (blockType == material) { + if (((split.length == 1 && configData == null) || ((int) blockData) == comparableData)) + return true; + } + } + return false; + } + + private void increment(Task task, TaskProgress taskProgress, int amount) { + int brokenBlocksNeeded = (int) task.getConfigValue("amount"); + + int progressBlocksBroken; + if (taskProgress.getProgress() == null) { + progressBlocksBroken = 0; + } else { + progressBlocksBroken = (int) taskProgress.getProgress(); + } + + taskProgress.setProgress(progressBlocksBroken + amount); + + if (((int) taskProgress.getProgress()) >= brokenBlocksNeeded) { + taskProgress.setCompleted(true); + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningTaskType.java new file mode 100644 index 00000000..2007f301 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningTaskType.java @@ -0,0 +1,88 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockBreakEvent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class MiningTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public MiningTaskType() { + // type, author, description + super("blockbreak", TaskUtils.TASK_ATTRIBUTION_STRING, "Break a set amount of blocks."); + + // config values for the quest creator to use, if unspecified then the quest creator will not know what to put here (and will require users to + // go into the config and manually configure there) + this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of blocks to be broken.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockBreak(BlockBreakEvent event) { + if (event.getPlayer().hasMetadata("NPC")) return; // citizens also causes these events to fire + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); // get the qplayer so you can get their progress + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { // iterate through all quests which are registered to use this task type + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { // get all tasks of this type + if (!TaskUtils.validateWorld(event.getPlayer(), task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); // get the task progress and increment progress by 1 + + if (taskProgress.isCompleted()) { // dont need to increment a completed task + continue; + } + + int brokenBlocksNeeded = (int) task.getConfigValue("amount"); // this will retrieve a value from the config under the key "value" + + int progressBlocksBroken; + if (taskProgress.getProgress() == null) { // note: if the player has never progressed before, getProgress() will return null + progressBlocksBroken = 0; + } else { + progressBlocksBroken = (int) taskProgress.getProgress(); + } + + taskProgress.setProgress(progressBlocksBroken + 1); // the progress does not have to be an int, although must be serializable by the yaml provider + + if (((int) taskProgress.getProgress()) >= brokenBlocksNeeded) { // completion statement, if true the task is complete + taskProgress.setCompleted(true); + } + } + } + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MobkillingCertainTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MobkillingCertainTaskType.java new file mode 100644 index 00000000..7919cc75 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MobkillingCertainTaskType.java @@ -0,0 +1,131 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.ChatColor; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDeathEvent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class MobkillingCertainTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public MobkillingCertainTaskType() { + super("mobkillingcertain", TaskUtils.TASK_ATTRIBUTION_STRING, "Kill a set amount of a specific entity type."); + this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of mobs to be killed.")); + this.creatorConfigValues.add(new ConfigValue("mob", true, "Name of mob.")); + this.creatorConfigValues.add(new ConfigValue("name", false, "Only allow a specific name for mob (unspecified = any name allowed).")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".mob", config.get("mob"), problems, "mob", super.getType())) { + try { + EntityType.valueOf(String.valueOf(config.get("mob"))); + } catch (IllegalArgumentException ex) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, + QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_ENTITY_TYPE.getDescription(String.valueOf(config.get("mob"))), root + ".mob")); + } + } + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onMobKill(EntityDeathEvent event) { + Player killer = event.getEntity().getKiller(); + Entity mob = event.getEntity(); + + if (mob == null || mob instanceof Player) { + return; + } + + if (killer == null) { + return; + } + + if (killer.hasMetadata("NPC")) return; + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(killer.getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(killer, task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + String configEntity = (String) task.getConfigValue("mob"); + String configName = (String) task.getConfigValue("name"); + + EntityType entity; + try { + entity = EntityType.valueOf(configEntity); + } catch (IllegalArgumentException ex) { + continue; + } + + if (configName != null) { + configName = ChatColor.translateAlternateColorCodes('&', configName); + if (mob.getCustomName() == null || !mob.getCustomName().equals(configName)) { + continue; + } + } + + if (mob.getType() != entity) { + continue; + } + + int mobKillsNeeded = (int) task.getConfigValue("amount"); + + int progressKills; + if (taskProgress.getProgress() == null) { + progressKills = 0; + } else { + progressKills = (int) taskProgress.getProgress(); + } + + taskProgress.setProgress(progressKills + 1); + + if (((int) taskProgress.getProgress()) >= mobKillsNeeded) { + taskProgress.setCompleted(true); + } + } + } + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MobkillingTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MobkillingTaskType.java new file mode 100644 index 00000000..08cd18c4 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MobkillingTaskType.java @@ -0,0 +1,116 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.entity.Animals; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Monster; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDeathEvent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class MobkillingTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public MobkillingTaskType() { + super("mobkilling", TaskUtils.TASK_ATTRIBUTION_STRING, "Kill a set amount of entities."); + this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of mobs to be killed.")); + this.creatorConfigValues.add(new ConfigValue("hostile", false, "Only allow hostile or non-hostile mobs (unspecified = any type allowed).")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + TaskUtils.configValidateBoolean(root + ".hostile", config.get("hostile"), problems, true, "hostile"); + return problems; + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onMobKill(EntityDeathEvent event) { + Player killer = event.getEntity().getKiller(); //The killer is a player + Entity mob = event.getEntity(); + + if (mob == null || mob instanceof Player) { + return; + } + + if (killer == null) { + return; + } + + if (killer.hasMetadata("NPC")) return; + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(killer.getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(killer, task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + boolean hostilitySpecified = false; + boolean hostile = false; + if (task.getConfigValue("hostile") != null) { + hostilitySpecified = true; + hostile = (boolean) task.getConfigValue("hostile"); + } + + if (hostilitySpecified) { + if (!hostile && !(mob instanceof Animals)) { + continue; + } else if (hostile && !(mob instanceof Monster)) { + continue; + } + } + + int mobKillsNeeded = (int) task.getConfigValue("amount"); + + int progressKills; + if (taskProgress.getProgress() == null) { + progressKills = 0; + } else { + progressKills = (int) taskProgress.getProgress(); + } + + taskProgress.setProgress(progressKills + 1); + + if (((int) taskProgress.getProgress()) >= mobKillsNeeded) { + taskProgress.setCompleted(true); + } + } + } + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PermissionTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PermissionTaskType.java new file mode 100644 index 00000000..3043aeb0 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PermissionTaskType.java @@ -0,0 +1,76 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; + +import java.util.ArrayList; +import java.util.List; + +public final class PermissionTaskType extends TaskType { + + private Quests plugin; + private BukkitTask poll; + private List creatorConfigValues = new ArrayList<>(); + + public PermissionTaskType(Quests plugin) { + super("permission", TaskUtils.TASK_ATTRIBUTION_STRING, "Test if a player has a permission"); + this.plugin = plugin; + this.creatorConfigValues.add(new ConfigValue("permission", true, "The required permission.")); + } + + @Override + public void onReady() { + this.poll = new BukkitRunnable() { + @Override + public void run() { + for (Player player : Bukkit.getOnlinePlayers()) { + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + continue; + } + for (Quest quest : PermissionTaskType.super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + for (Task task : quest.getTasksOfType(PermissionTaskType.super.getType())) { + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + if (taskProgress.isCompleted()) { + continue; + } + String permission = (String) task.getConfigValue("permission"); + if (permission != null) { + if (player.hasPermission(permission)) { + taskProgress.setCompleted(true); + } + } + } + } + } + } + } + }.runTaskTimer(plugin, 30L, 30L); + } + + @Override + public void onDisable() { + if (this.poll != null) { + this.poll.cancel(); + } + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PlayerkillingTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PlayerkillingTaskType.java new file mode 100644 index 00000000..c577ac01 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PlayerkillingTaskType.java @@ -0,0 +1,97 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDeathEvent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class PlayerkillingTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public PlayerkillingTaskType() { + super("playerkilling", TaskUtils.TASK_ATTRIBUTION_STRING, "Kill a set amount of players."); + this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of players to be killed.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onMobKill(EntityDeathEvent event) { + Player killer = event.getEntity().getKiller(); + Entity mob = event.getEntity(); + + if (!(mob instanceof Player)) { + return; + } + + if (killer == null) { + return; + } + + if (killer.hasMetadata("NPC")) return; + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(killer.getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(killer, task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + int playerKillsNeeded = (int) task.getConfigValue("amount"); + + int progressKills; + if (taskProgress.getProgress() == null) { + progressKills = 0; + } else { + progressKills = (int) taskProgress.getProgress(); + } + + taskProgress.setProgress(progressKills + 1); + + if (((int) taskProgress.getProgress()) >= playerKillsNeeded) { + taskProgress.setCompleted(true); + } + } + } + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PlaytimeTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PlaytimeTaskType.java new file mode 100644 index 00000000..3b113d01 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PlaytimeTaskType.java @@ -0,0 +1,95 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class PlaytimeTaskType extends TaskType { + + private final Quests plugin; + private BukkitTask poll; + private List creatorConfigValues = new ArrayList<>(); + + public PlaytimeTaskType(Quests plugin) { + super("playtime", TaskUtils.TASK_ATTRIBUTION_STRING, "Track the amount of playing time a user has been on"); + this.plugin = plugin; + this.creatorConfigValues.add(new ConfigValue("minutes", true, "Time in minutes.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".minutes", config.get("minutes"), problems, "minutes", super.getType())) + TaskUtils.configValidateInt(root + ".minutes", config.get("minutes"), problems, false, true, "minutes"); + return problems; + } + + + @Override + public void onReady() { + if (this.poll == null) { + this.poll = new BukkitRunnable() { + @Override + public void run() { + for (Player player : Bukkit.getOnlinePlayers()) { + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + continue; + } + + for (Quest quest : PlaytimeTaskType.super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + for (Task task : quest.getTasksOfType(PlaytimeTaskType.super.getType())) { + if (!TaskUtils.validateWorld(player, task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + if (taskProgress.isCompleted()) { + continue; + } + int minutes = (int) task.getConfigValue("minutes"); + if (taskProgress.getProgress() == null) { + taskProgress.setProgress(1); + } else { + taskProgress.setProgress((int) taskProgress.getProgress() + 1); + } + if (((int) taskProgress.getProgress()) >= minutes) { + taskProgress.setCompleted(true); + } + } + } + } + } + } + }.runTaskTimer(plugin, 1200L, 1200L); + } + } + + @Override + public void onDisable() { +// if (this.poll != null) { +// this.poll.cancel(); +// } + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PositionTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PositionTaskType.java new file mode 100644 index 00000000..ffed1476 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PositionTaskType.java @@ -0,0 +1,108 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerMoveEvent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class PositionTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public PositionTaskType() { + super("position", TaskUtils.TASK_ATTRIBUTION_STRING, "Reach a set of co-ordinates."); + this.creatorConfigValues.add(new ConfigValue("x", true, "X position.")); + this.creatorConfigValues.add(new ConfigValue("y", true, "Y position.")); + this.creatorConfigValues.add(new ConfigValue("z", true, "Z position.")); + this.creatorConfigValues.add(new ConfigValue("world", true, "Name of world.")); + this.creatorConfigValues.add(new ConfigValue("distance-padding", false, "Padding zone in meters/blocks (default/unspecified = 0).")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + TaskUtils.configValidateExists(root + ".world", config.get("world"), problems, "world", super.getType()); + if (TaskUtils.configValidateExists(root + ".x", config.get("x"), problems, "x", super.getType())) + TaskUtils.configValidateInt(root + ".x", config.get("x"), problems, false, false, "x"); + if (TaskUtils.configValidateExists(root + ".y", config.get("y"), problems, "y", super.getType())) + TaskUtils.configValidateInt(root + ".y", config.get("y"), problems, false, false, "y"); + if (TaskUtils.configValidateExists(root + ".z", config.get("z"), problems, "z", super.getType())) + TaskUtils.configValidateInt(root + ".z", config.get("z"), problems, false, false, "z"); + TaskUtils.configValidateInt(root + ".distance-padding", config.get("distance-padding"), problems, true, true, "distance-padding"); + return problems; + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onMove(PlayerMoveEvent event) { + if (event.getFrom().getBlockX() == event.getTo().getBlockX() && event.getFrom().getBlockZ() == event.getTo().getBlockZ()) { + return; + } + + if (event.getPlayer().hasMetadata("NPC")) return; + + Player player = event.getPlayer(); + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + int x = (int) task.getConfigValue("x"); + int y = (int) task.getConfigValue("y"); + int z = (int) task.getConfigValue("z"); + String worldString = (String) task.getConfigValue("world"); + int padding = 0; + if (task.getConfigValue("distance-padding") != null) { + padding = (int) task.getConfigValue("distance-padding"); + } + int paddingSquared = padding * padding; + World world = Bukkit.getWorld(worldString); + if (world == null) { + continue; + } + + Location location = new Location(world, x, y, z); + if (player.getWorld().equals(world) && player.getLocation().getBlockX() == location.getBlockX() && player.getLocation().getBlockY() == location.getBlockY() && player.getLocation().getBlockZ() == location.getBlockZ()) { + taskProgress.setCompleted(true); + } else if (padding != 0 && player.getWorld().equals(world) && player.getLocation().distanceSquared(location) < paddingSquared) { + taskProgress.setCompleted(true); + } + } + } + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/ShearingTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/ShearingTaskType.java new file mode 100644 index 00000000..cbf3c175 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/ShearingTaskType.java @@ -0,0 +1,93 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.entity.Player; +import org.bukkit.entity.Sheep; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerShearEntityEvent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class ShearingTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public ShearingTaskType() { + super("shearing", TaskUtils.TASK_ATTRIBUTION_STRING, "Shear a set amount of sheep."); + this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of cows to be milked.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onShear(PlayerShearEntityEvent event) { + if (!(event.getEntity() instanceof Sheep)) { + return; + } + + if (event.getPlayer().hasMetadata("NPC")) return; + + Player player = event.getPlayer(); + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(player, task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + int sheepNeeded = (int) task.getConfigValue("amount"); + + int progressSheared; + if (taskProgress.getProgress() == null) { + progressSheared = 0; + } else { + progressSheared = (int) taskProgress.getProgress(); + } + + taskProgress.setProgress(progressSheared + 1); + + if (((int) taskProgress.getProgress()) >= sheepNeeded) { + taskProgress.setCompleted(true); + } + } + } + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/TamingTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/TamingTaskType.java new file mode 100644 index 00000000..9f3963e4 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/TamingTaskType.java @@ -0,0 +1,92 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityTameEvent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class TamingTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public TamingTaskType() { + super("taming", TaskUtils.TASK_ATTRIBUTION_STRING, "Tame a set amount of animals."); + this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of animals to be tamed.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onTame(EntityTameEvent event) { + if (!(event.getOwner() instanceof Player)) { + return; + } + + Player player = (Player) event.getOwner(); + + if (player.hasMetadata("NPC")) return; + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(player, task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + int tamesNeeded = (int) task.getConfigValue("amount"); + + int progressTamed; + if (taskProgress.getProgress() == null) { + progressTamed = 0; + } else { + progressTamed = (int) taskProgress.getProgress(); + } + + taskProgress.setProgress(progressTamed + 1); + + if (((int) taskProgress.getProgress()) >= tamesNeeded) { + taskProgress.setCompleted(true); + } + } + } + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/WalkingTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/WalkingTaskType.java new file mode 100644 index 00000000..05f10a89 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/WalkingTaskType.java @@ -0,0 +1,92 @@ +package com.leonardobishop.quests.quest.tasktype.type; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerMoveEvent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class WalkingTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public WalkingTaskType() { + super("walking", TaskUtils.TASK_ATTRIBUTION_STRING, "Walk a set distance."); + this.creatorConfigValues.add(new ConfigValue("distance", true, "Amount of meters (blocks) to be travelled.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".distance", config.get("distance"), problems, "distance", super.getType())) + TaskUtils.configValidateInt(root + ".distance", config.get("distance"), problems, false, true, "distance"); + return problems; + } + + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onMove(PlayerMoveEvent event) { + if (event.getFrom().getBlockX() == event.getTo().getBlockX() && event.getFrom().getBlockZ() == event.getTo().getBlockZ()) { + return; + } + + Player player = event.getPlayer(); + + if (player.hasMetadata("NPC")) return; + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(player, task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + int distanceNeeded = (int) task.getConfigValue("distance"); + + int progressDistance; + if (taskProgress.getProgress() == null) { + progressDistance = 0; + } else { + progressDistance = (int) taskProgress.getProgress(); + } + + taskProgress.setProgress(progressDistance + 1); + + if (((int) taskProgress.getProgress()) >= distanceNeeded) { + taskProgress.setCompleted(true); + } + } + } + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ASkyBlockLevelType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ASkyBlockLevelType.java new file mode 100644 index 00000000..8e621288 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ASkyBlockLevelType.java @@ -0,0 +1,72 @@ +package com.leonardobishop.quests.quest.tasktype.type.dependent; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import com.wasteofplastic.askyblock.events.IslandPostLevelEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class ASkyBlockLevelType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public ASkyBlockLevelType() { + super("askyblock_level", TaskUtils.TASK_ATTRIBUTION_STRING, "Reach a certain island level for ASkyBlock."); + this.creatorConfigValues.add(new ConfigValue("level", true, "Minimum island level needed.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".level", config.get("level"), problems, "level", super.getType())) + TaskUtils.configValidateInt(root + ".level", config.get("level"), problems, false, false, "level"); + return problems; + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onIslandLevel(IslandPostLevelEvent event) { + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + long islandLevelNeeded = (long) (int) task.getConfigValue("level"); + + taskProgress.setProgress(event.getLongLevel()); + + if (((long) taskProgress.getProgress()) >= islandLevelNeeded) { + taskProgress.setCompleted(true); + } + } + } + } + } +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/BentoBoxLevelTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/BentoBoxLevelTaskType.java new file mode 100644 index 00000000..5e5c53ef --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/BentoBoxLevelTaskType.java @@ -0,0 +1,105 @@ +package com.leonardobishop.quests.quest.tasktype.type.dependent; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskTypeManager; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.event.EventHandler; +import world.bentobox.bentobox.BentoBox; +import world.bentobox.bentobox.api.events.BentoBoxEvent; +import world.bentobox.bentobox.database.objects.Island; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicLong; + +public final class BentoBoxLevelTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + private Field levelField = null; + + public BentoBoxLevelTaskType() { + super("bentobox_level", TaskUtils.TASK_ATTRIBUTION_STRING, "Reach a certain island level in the level addon for BentoBox."); + this.creatorConfigValues.add(new ConfigValue("level", true, "Minimum island level needed.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".level", config.get("level"), problems, "level", super.getType())) + TaskUtils.configValidateInt(root + ".level", config.get("level"), problems, false, false, "level"); + return problems; + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + public static void register(TaskTypeManager manager) { + if (BentoBox.getInstance().getAddonsManager().getAddonByName("Level").isPresent()) { + manager.registerTaskType(new BentoBoxLevelTaskType()); + } + } + + @EventHandler + public void onBentoBoxIslandLevelCalculated(BentoBoxEvent event) { + Map keyValues = event.getKeyValues(); + + if ("IslandLevelCalculatedEvent".equalsIgnoreCase(event.getEventName())) { + Island island = (Island) keyValues.get("island"); + + for (UUID member : island.getMemberSet()) { + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(member); + if (qPlayer == null) { + continue; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + long islandLevelNeeded = (long) (int) task.getConfigValue("level"); + + Object results = keyValues.get("results"); + + try { + if (levelField == null) { + levelField = results.getClass().getDeclaredField("level"); + levelField.setAccessible(true); + } + + AtomicLong level = (AtomicLong) levelField.get(results); + taskProgress.setProgress(level.get()); + } catch (NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + } + + if (((long) taskProgress.getProgress()) >= islandLevelNeeded) { + taskProgress.setCompleted(true); + } + } + } + } + } + } + } +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/CitizensDeliverTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/CitizensDeliverTaskType.java new file mode 100644 index 00000000..fa64741e --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/CitizensDeliverTaskType.java @@ -0,0 +1,150 @@ +package com.leonardobishop.quests.quest.tasktype.type.dependent; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import net.citizensnpcs.api.event.NPCRightClickEvent; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class CitizensDeliverTaskType extends TaskType { + + private final Quests plugin; + private List creatorConfigValues = new ArrayList<>(); + + public CitizensDeliverTaskType(Quests plugin) { + super("citizens_deliver", TaskUtils.TASK_ATTRIBUTION_STRING, "Deliver a set of items to a NPC."); + this.plugin = plugin; + this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of item to retrieve.")); + this.creatorConfigValues.add(new ConfigValue("item", true, "Name or ID of item.")); + this.creatorConfigValues.add(new ConfigValue("npc-name", true, "Name of the NPC.")); + this.creatorConfigValues.add(new ConfigValue("remove-items-when-complete", false, "Take the items away from the player on completion (true/false, " + + "default = false).")); + this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".item", config.get("item"), problems, "item", super.getType())) { + Object configBlock = config.get("item"); + if (configBlock instanceof ConfigurationSection) { + ConfigurationSection section = (ConfigurationSection) configBlock; + String itemloc = "item"; + if (!section.contains("item")) { + itemloc = "type"; + } + if (!section.contains(itemloc)) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, + QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(""), root + ".item.type")); + } else { + String type = String.valueOf(section.get(itemloc)); + if (!plugin.getItemGetter().isValidMaterial(type)) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, + QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(type), root + ".item." + itemloc)); + } + } + } else { + if (Material.getMaterial(String.valueOf(configBlock)) == null) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, + QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(String.valueOf(configBlock)), root + ".item.item")); + } + } + } + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + TaskUtils.configValidateExists(root + ".npc-name", config.get("npc-name"), problems, "npc-name", super.getType()); + TaskUtils.configValidateBoolean(root + ".remove-items-when-complete", config.get("remove-items-when-complete"), problems, true, "remove-items-when-complete", super.getType()); + return problems; + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onNPCClick(NPCRightClickEvent event) { + Bukkit.getScheduler().runTaskLater(plugin, () -> checkInventory(event.getClicker(), event.getNPC().getName()), 1L); + } + + @SuppressWarnings("deprecation") + private void checkInventory(Player player, String citizenName) { + if (player == null || !player.isOnline()) { + return; + } + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', String.valueOf(task.getConfigValue("npc-name")))).equals(ChatColor + .stripColor(ChatColor.translateAlternateColorCodes('&', citizenName)))) { + return; + } + if (!TaskUtils.validateWorld(player, task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + Material material; + int amount = (int) task.getConfigValue("amount"); + Object configBlock = task.getConfigValue("item"); + Object configData = task.getConfigValue("data"); + Object remove = task.getConfigValue("remove-items-when-complete"); + + ItemStack is; + if (configBlock instanceof ConfigurationSection) { + is = Quests.get().getItemStack("", (org.bukkit.configuration.ConfigurationSection) configBlock); + } else { + material = Material.getMaterial(String.valueOf(configBlock)); + + if (material == null) { + continue; + } + if (configData != null) { + is = new ItemStack(material, 1, ((Integer) configData).shortValue()); + } else { + is = new ItemStack(material, 1); + } + } + + if (player.getInventory().containsAtLeast(is, amount)) { + is.setAmount(amount); + taskProgress.setCompleted(true); + + if (remove != null && ((Boolean) remove)) { + player.getInventory().removeItem(is); + } + } + } + } + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/CitizensInteractTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/CitizensInteractTaskType.java new file mode 100644 index 00000000..3e6592b5 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/CitizensInteractTaskType.java @@ -0,0 +1,76 @@ +package com.leonardobishop.quests.quest.tasktype.type.dependent; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import net.citizensnpcs.api.event.NPCRightClickEvent; +import org.bukkit.ChatColor; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class CitizensInteractTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public CitizensInteractTaskType() { + super("citizens_interact", TaskUtils.TASK_ATTRIBUTION_STRING, "Interact with an NPC to complete the quest."); + this.creatorConfigValues.add(new ConfigValue("npc-name", true, "Name of the NPC.")); + this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + TaskUtils.configValidateExists(root + ".npc-name", config.get("npc-name"), problems, "npc-name", super.getType()); + TaskUtils.configValidateBoolean(root + ".remove-items-when-complete", config.get("remove-items-when-complete"), problems, true, "remove-items-when-complete", super.getType()); + return problems; + } + + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onNPCClick(NPCRightClickEvent event) { + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getClicker().getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(event.getClicker(), task)) continue; + + if (!ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', String.valueOf(task.getConfigValue("npc-name")))).equals(ChatColor + .stripColor(ChatColor.translateAlternateColorCodes('&', event.getNPC().getName())))) { + return; + } + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + taskProgress.setCompleted(true); + } + } + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsBalanceTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsBalanceTaskType.java new file mode 100644 index 00000000..581cbafb --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsBalanceTaskType.java @@ -0,0 +1,98 @@ +package com.leonardobishop.quests.quest.tasktype.type.dependent; + +import com.earth2me.essentials.Essentials; +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import net.ess3.api.events.UserBalanceUpdateEvent; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.UUID; + +public class EssentialsBalanceTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public EssentialsBalanceTaskType() { + super("essentials_balance", TaskUtils.TASK_ATTRIBUTION_STRING, "Reach a set amount of money."); + this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of money to reach.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, false, "amount"); + return problems; + } + + @Override + public void onStart(Quest quest, Task task, UUID playerUUID) { + Player player = Bukkit.getPlayer(playerUUID); + Essentials ess = (Essentials) Bukkit.getPluginManager().getPlugin("Essentials"); + if (player != null && player.isOnline() && ess != null) { + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(playerUUID); + QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile(); + QuestProgress questProgress = questProgressFile.getQuestProgress(quest); + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + int earningsNeeded = (int) task.getConfigValue("amount"); + BigDecimal money = ess.getUser(player).getMoney(); + taskProgress.setProgress(money); + if (money.compareTo(BigDecimal.valueOf(earningsNeeded)) > 0) { + taskProgress.setCompleted(true); + } + } + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onMoneyEarn(UserBalanceUpdateEvent event) { + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + int earningsNeeded = (int) task.getConfigValue("amount"); + + taskProgress.setProgress(event.getNewBalance()); + + if (event.getNewBalance().compareTo(BigDecimal.valueOf(earningsNeeded)) > 0) { + taskProgress.setCompleted(true); + } + } + } + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsMoneyEarnTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsMoneyEarnTaskType.java new file mode 100644 index 00000000..a6a56623 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsMoneyEarnTaskType.java @@ -0,0 +1,80 @@ +package com.leonardobishop.quests.quest.tasktype.type.dependent; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import net.ess3.api.events.UserBalanceUpdateEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class EssentialsMoneyEarnTaskType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public EssentialsMoneyEarnTaskType() { + super("essentials_moneyearn", TaskUtils.TASK_ATTRIBUTION_STRING, "Earn a set amount of money."); + this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of money to earn.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, false, "amount"); + return problems; + } + + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onMoneyEarn(UserBalanceUpdateEvent event) { + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + int earningsNeeded = (int) task.getConfigValue("amount"); + + BigDecimal current = (BigDecimal) taskProgress.getProgress(); + if (current == null) { + current = new BigDecimal(0); + } + BigDecimal newProgress = current.add(event.getNewBalance().subtract(event.getOldBalance())); + taskProgress.setProgress(newProgress); + + if (newProgress.compareTo(BigDecimal.valueOf(earningsNeeded)) > 0) { + taskProgress.setCompleted(true); + } + } + } + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/IridiumSkyblockValueType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/IridiumSkyblockValueType.java new file mode 100644 index 00000000..e217b8af --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/IridiumSkyblockValueType.java @@ -0,0 +1,85 @@ +package com.leonardobishop.quests.quest.tasktype.type.dependent; + +import com.iridium.iridiumskyblock.Island; +import com.iridium.iridiumskyblock.api.IslandWorthCalculatedEvent; +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.UUID; + +public final class IridiumSkyblockValueType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public IridiumSkyblockValueType() { + super("iridiumskyblock_value", TaskUtils.TASK_ATTRIBUTION_STRING, "Reach a certain island value for Iridium Skyblock."); + this.creatorConfigValues.add(new ConfigValue("value", true, "Minimum island value needed.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".value", config.get("value"), problems, "value", super.getType())) + TaskUtils.configValidateInt(root + ".value", config.get("value"), problems, false, false, "value"); + return problems; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onIslandLevel(IslandWorthCalculatedEvent event) { + Island island = event.getIsland(); + for (String player : island.members) { + UUID uuid; + try { + uuid = UUID.fromString(player); + } catch (Exception e) { + continue; + } + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(uuid); + if (qPlayer == null) { + continue; + } + + for (Quest quest : IridiumSkyblockValueType.super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(IridiumSkyblockValueType.super.getType())) { + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + int islandValueNeeded = (int) task.getConfigValue("value"); + + taskProgress.setProgress(event.getIslandWorth()); + + if (((double) taskProgress.getProgress()) >= islandValueNeeded) { + taskProgress.setCompleted(true); + } + } + } + } + } + + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/MythicMobsKillingType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/MythicMobsKillingType.java new file mode 100644 index 00000000..74b870d9 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/MythicMobsKillingType.java @@ -0,0 +1,105 @@ +package com.leonardobishop.quests.quest.tasktype.type.dependent; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import io.lumine.xikage.mythicmobs.api.bukkit.events.MythicMobDeathEvent; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class MythicMobsKillingType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public MythicMobsKillingType() { + super("mythicmobs_killing", TaskUtils.TASK_ATTRIBUTION_STRING, "Kill a set amount of a MythicMobs entity."); + this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of mobs to be killed.")); + this.creatorConfigValues.add(new ConfigValue("name", true, "The 'internal name' of the MythicMob.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + TaskUtils.configValidateExists(root + ".name", config.get("name"), problems, "name", super.getType()); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onMobKill(MythicMobDeathEvent event) { + Entity killer = event.getKiller(); + Entity mob = event.getEntity(); + + if (mob == null || mob instanceof Player) { + return; + } + + if (killer == null) { + return; + } + + String mobName = event.getMobType().getInternalName(); + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(killer.getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(killer.getWorld().getName(), task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + String configName = (String) task.getConfigValue("name"); + + if (!mobName.equals(configName)) { + return; + } + + int mobKillsNeeded = (int) task.getConfigValue("amount"); + + int progressKills; + if (taskProgress.getProgress() == null) { + progressKills = 0; + } else { + progressKills = (int) taskProgress.getProgress(); + } + + taskProgress.setProgress(progressKills + 1); + + if (((int) taskProgress.getProgress()) >= mobKillsNeeded) { + taskProgress.setCompleted(true); + } + } + } + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/PlaceholderAPIEvaluateTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/PlaceholderAPIEvaluateTaskType.java new file mode 100644 index 00000000..a3508bcc --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/PlaceholderAPIEvaluateTaskType.java @@ -0,0 +1,162 @@ +package com.leonardobishop.quests.quest.tasktype.type.dependent; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class PlaceholderAPIEvaluateTaskType extends TaskType { + + private final Quests plugin; + private BukkitTask poll; + private List creatorConfigValues = new ArrayList<>(); + + public PlaceholderAPIEvaluateTaskType(Quests plugin) { + super("placeholderapi_evaluate", TaskUtils.TASK_ATTRIBUTION_STRING, "Evaluate the result of a placeholder"); + this.plugin = plugin; + this.creatorConfigValues.add(new ConfigValue("placeholder", true, "The placeholder string (including %%).")); + this.creatorConfigValues.add(new ConfigValue("evaluates", true, "What it should evaluate to be marked as complete.")); + this.creatorConfigValues.add(new ConfigValue("operator", false, "Comparison method.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + TaskUtils.configValidateExists(root + ".placeholder", config.get("placeholder"), problems, "placeholder", super.getType()); + boolean evalExists = TaskUtils.configValidateExists(root + ".evaluates", config.get("evaluates"), problems, "evaluates", super.getType()); + + if (config.containsKey("operator")) { + String operatorStr = (String) config.get("operator"); + Operator operator = null; + try { + operator = Operator.valueOf(operatorStr); + } catch (IllegalArgumentException ex) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, + "Operator '" + operatorStr + "' does not exist.", root + ".operator")); + } + if (operator != null && evalExists) { + String evalStr = String.valueOf(config.get("evaluates")); + try { + Double.parseDouble(evalStr); + } catch (IllegalArgumentException ex) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, + "Numeric operator specified, but placeholder evaluation '" + evalStr + "' is not numeric.", root + ".evaluates")); + } + } + } + return problems; + } + + @Override + public void onReady() { + this.poll = new BukkitRunnable() { + @Override + public void run() { + for (Player player : Bukkit.getOnlinePlayers()) { + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + continue; + } + + for (Quest quest : PlaceholderAPIEvaluateTaskType.super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + for (Task task : quest.getTasksOfType(PlaceholderAPIEvaluateTaskType.super.getType())) { + if (!TaskUtils.validateWorld(player, task)) continue; + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + if (taskProgress.isCompleted()) { + continue; + } + String placeholder = (String) task.getConfigValue("placeholder"); + String evaluates = String.valueOf(task.getConfigValue("evaluates")); + String configOperator = (String) task.getConfigValue("operator"); + Operator operator = null; + if (configOperator != null) { + try { + operator = Operator.valueOf(configOperator); + } catch (IllegalArgumentException ignored) { } + } + if (placeholder != null && evaluates != null) { + double numericEvaluates = 0; + if (operator != null) { + try { + numericEvaluates = Double.parseDouble(evaluates); + } catch (NumberFormatException ex) { + continue; + } + } + + String evaluated = PlaceholderAPI.setPlaceholders(player, placeholder); + if (operator == null && evaluated.equals(evaluates)) { + taskProgress.setCompleted(true); + } else if (operator != null) { + double numericEvaluated; + try { + numericEvaluated = Double.parseDouble(evaluated); + } catch (NumberFormatException ex) { + continue; + } + switch (operator) { + case GREATER_THAN: + if (numericEvaluated > numericEvaluates) + taskProgress.setCompleted(true); + continue; + case LESS_THAN: + if (numericEvaluated < numericEvaluates) + taskProgress.setCompleted(true); + continue; + case GREATER_THAN_OR_EQUAL_TO: + if (numericEvaluated >= numericEvaluates) + taskProgress.setCompleted(true); + continue; + case LESS_THAN_OR_EQUAL_TO: + if (numericEvaluated <= numericEvaluates) + taskProgress.setCompleted(true); + continue; + } + } + } + + } + } + } + } + } + }.runTaskTimer(plugin, 30L, 30L); + } + + @Override + public void onDisable() { + if (this.poll != null) { + this.poll.cancel(); + } + } + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + enum Operator { + GREATER_THAN, + LESS_THAN, + GREATER_THAN_OR_EQUAL_TO, + LESS_THAN_OR_EQUAL_TO; + } +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ShopGUIPlusBuyCertainTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ShopGUIPlusBuyCertainTaskType.java new file mode 100644 index 00000000..0b65fb76 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ShopGUIPlusBuyCertainTaskType.java @@ -0,0 +1,82 @@ +package com.leonardobishop.quests.quest.tasktype.type.dependent; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import net.brcdev.shopgui.event.ShopPreTransactionEvent; +import net.brcdev.shopgui.shop.ShopManager; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class ShopGUIPlusBuyCertainTaskType extends TaskType { + + public ShopGUIPlusBuyCertainTaskType() { + super("shopguiplus_buycertain", TaskUtils.TASK_ATTRIBUTION_STRING, "Purchase a given item from a ShopGUI+ shop"); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, false, "amount"); + TaskUtils.configValidateExists(root + ".id", config.get("id"), problems, "id", super.getType()); + return problems; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onMobKill(ShopPreTransactionEvent event) { + if (event.getShopAction() != ShopManager.ShopAction.BUY) return; + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(event.getPlayer().getWorld().getName(), task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + String configName = (String) task.getConfigValue("id"); + + if (!event.getShopItem().getId().equals(configName)) { + return; + } + + int amountNeeded = (int) task.getConfigValue("amount"); + + int progressAmount; + if (taskProgress.getProgress() == null) { + progressAmount = 0; + } else { + progressAmount = (int) taskProgress.getProgress(); + } + + taskProgress.setProgress(progressAmount + event.getAmount()); + + if (((int) taskProgress.getProgress()) >= amountNeeded) { + taskProgress.setCompleted(true); + } + } + } + } + } +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ShopGUIPlusSellCertainTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ShopGUIPlusSellCertainTaskType.java new file mode 100644 index 00000000..1f16163c --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ShopGUIPlusSellCertainTaskType.java @@ -0,0 +1,82 @@ +package com.leonardobishop.quests.quest.tasktype.type.dependent; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import net.brcdev.shopgui.event.ShopPreTransactionEvent; +import net.brcdev.shopgui.shop.ShopManager; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class ShopGUIPlusSellCertainTaskType extends TaskType { + + public ShopGUIPlusSellCertainTaskType() { + super("shopguiplus_sellcertain", TaskUtils.TASK_ATTRIBUTION_STRING, "Sell a given item from to a ShopGUI+ shop"); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, false, "amount"); + TaskUtils.configValidateExists(root + ".id", config.get("id"), problems, "id", super.getType()); + return problems; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onMobKill(ShopPreTransactionEvent event) { + if (event.getShopAction() != ShopManager.ShopAction.SELL || event.getShopAction() != ShopManager.ShopAction.SELL_ALL) return; + + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + if (!TaskUtils.validateWorld(event.getPlayer().getWorld().getName(), task)) continue; + + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + String configName = (String) task.getConfigValue("id"); + + if (!event.getShopItem().getId().equals(configName)) { + return; + } + + int amountNeeded = (int) task.getConfigValue("amount"); + + int progressAmount; + if (taskProgress.getProgress() == null) { + progressAmount = 0; + } else { + progressAmount = (int) taskProgress.getProgress(); + } + + taskProgress.setProgress(progressAmount + event.getAmount()); + + if (((int) taskProgress.getProgress()) >= amountNeeded) { + taskProgress.setCompleted(true); + } + } + } + } + } +} diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/uSkyBlockLevelType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/uSkyBlockLevelType.java new file mode 100644 index 00000000..7e0787cb --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/uSkyBlockLevelType.java @@ -0,0 +1,74 @@ +package com.leonardobishop.quests.quest.tasktype.type.dependent; + +import com.leonardobishop.quests.QuestsConfigLoader; +import com.leonardobishop.quests.api.QuestsAPI; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.quest.Quest; +import com.leonardobishop.quests.quest.Task; +import com.leonardobishop.quests.quest.tasktype.ConfigValue; +import com.leonardobishop.quests.quest.tasktype.TaskType; +import com.leonardobishop.quests.quest.tasktype.TaskUtils; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import us.talabrek.ultimateskyblock.api.event.uSkyBlockScoreChangedEvent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public final class uSkyBlockLevelType extends TaskType { + + private List creatorConfigValues = new ArrayList<>(); + + public uSkyBlockLevelType() { + super("uskyblock_level", TaskUtils.TASK_ATTRIBUTION_STRING, "Reach a certain island level for uSkyBlock."); + this.creatorConfigValues.add(new ConfigValue("level", true, "Minimum island level needed.")); + } + + @Override + public List detectProblemsInConfig(String root, HashMap config) { + ArrayList problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".level", config.get("level"), problems, "level", super.getType())) + TaskUtils.configValidateInt(root + ".level", config.get("level"), problems, false, false, "level"); + return problems; + } + + + @Override + public List getCreatorConfigValues() { + return creatorConfigValues; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onIslandLevel(uSkyBlockScoreChangedEvent event) { + QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + if (qPlayer == null) { + return; + } + + for (Quest quest : super.getRegisteredQuests()) { + if (qPlayer.hasStartedQuest(quest)) { + QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); + + for (Task task : quest.getTasksOfType(super.getType())) { + TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); + + if (taskProgress.isCompleted()) { + continue; + } + + double islandLevelNeeded = (double) (int) task.getConfigValue("level"); + + taskProgress.setProgress(event.getScore().getScore()); + + if (((double) taskProgress.getProgress()) >= islandLevelNeeded) { + taskProgress.setCompleted(true); + } + } + } + } + } + +} diff --git a/src/main/java/com/leonardobishop/quests/quests/Category.java b/src/main/java/com/leonardobishop/quests/quests/Category.java deleted file mode 100644 index 0fdedad4..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/Category.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.leonardobishop.quests.quests; - -import org.bukkit.ChatColor; -import org.bukkit.inventory.ItemStack; - -import java.util.ArrayList; -import java.util.List; - -public class Category { - - private final String id; - private final ItemStack displayItem; - private final boolean permissionRequired; - private final List registeredQuestIds = new ArrayList<>(); - - public Category(String id, ItemStack displayItem, boolean permissionRequired) { - this.id = id; - this.displayItem = displayItem; - this.permissionRequired = permissionRequired; - } - - public String getId() { - return id; - } - - public boolean isPermissionRequired() { - return permissionRequired; - } - - public ItemStack getDisplayItem() { - return displayItem; - } - - public void registerQuestId(String questid) { - registeredQuestIds.add(questid); - } - - public List getRegisteredQuestIds() { - return registeredQuestIds; - } - - - public String getDisplayNameStripped() { - return ChatColor.stripColor(this.displayItem.getItemMeta().getDisplayName()); - } -} diff --git a/src/main/java/com/leonardobishop/quests/quests/Quest.java b/src/main/java/com/leonardobishop/quests/quests/Quest.java deleted file mode 100644 index b978f834..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/Quest.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.leonardobishop.quests.quests; - -import com.leonardobishop.quests.menu.QItemStack; -import org.bukkit.ChatColor; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class Quest implements Comparable { - - private Map tasks = new HashMap<>(); - private final String id; - private final QItemStack displayItem; - private final List rewards; - private final List requirements; - private final List rewardString; - private final List startString; - private final boolean repeatable; - private final boolean cooldownEnabled; - private final int cooldown; - private final int sortOrder; - private final boolean permissionRequired; - private final Map placeholders; - private String categoryid; - - - public Quest(String id, QItemStack displayItem, List rewards, List requirements, boolean repeatable, boolean cooldownEnabled, int cooldown, boolean permissionRequired, List rewardString, List startString, Map placeholders, String categoryid, int sortOrder) { - this(id, displayItem, rewards, requirements, repeatable, cooldownEnabled, cooldown, permissionRequired, rewardString, startString, placeholders, sortOrder); - this.categoryid = categoryid; - } - - public Quest(String id, QItemStack displayItem, List rewards, List requirements, boolean repeatable, boolean cooldownEnabled, int cooldown, boolean permissionRequired, List rewardString, List startString, Map placeholders, int sortOrder) { - this.id = id; - this.displayItem = displayItem; - this.rewards = rewards; - this.requirements = requirements; - this.repeatable = repeatable; - this.cooldownEnabled = cooldownEnabled; - this.cooldown = cooldown; - this.permissionRequired = permissionRequired; - this.rewardString = rewardString; - this.startString = startString; - this.placeholders = placeholders; - this.sortOrder = sortOrder; - } - - public void registerTask(Task task) { - tasks.put(task.getId(), task); - } - - public Collection getTasks() { - return tasks.values(); - } - - public Task getTaskById(String id) { - return tasks.get(id); - } - - public List getTasksOfType(String type) { - List tasks = new ArrayList<>(); - for (Task task : getTasks()) { - if (task.getType().equals(type)) { - tasks.add(task); - } - } - return tasks; - } - - - public boolean isPermissionRequired() { - return permissionRequired; - } - - public List getRewardString() { - return rewardString; - } - - public List getStartString() { - return startString; - } - - public String getId() { - return id; - } - - public QItemStack getDisplayItem() { - return displayItem; - } - - public List getRewards() { - return rewards; - } - - public List getRequirements() { - return requirements; - } - - public boolean isRepeatable() { - return repeatable; - } - - public boolean isCooldownEnabled() { - return cooldownEnabled; - } - - public int getCooldown() { - return cooldown; - } - - public String getCategoryId() { - return categoryid; - } - - public String getDisplayNameStripped() { - return ChatColor.stripColor(this.displayItem.getName()); - } - - public Map getPlaceholders() { - return placeholders; - } - - public int getSortOrder() { - return sortOrder; - } - - @Override - public int compareTo(Quest quest) { - return (sortOrder - quest.sortOrder); - } -} diff --git a/src/main/java/com/leonardobishop/quests/quests/QuestManager.java b/src/main/java/com/leonardobishop/quests/quests/QuestManager.java deleted file mode 100644 index 022c2c89..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/QuestManager.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.leonardobishop.quests.quests; - -import com.leonardobishop.quests.Quests; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -public class QuestManager { - - private final Quests plugin; - - public QuestManager(Quests plugin) { - this.plugin = plugin; - } - - private Map quests = new LinkedHashMap<>(); - private List categories = new ArrayList<>(); - - public void registerQuest(Quest quest) { - quests.put(quest.getId(), quest); - } - - public Quest getQuestById(String id) { - return quests.get(id); - } - - public Map getQuests() { - return quests; - } - - public void registerCategory(Category category) { categories.add(category); } - - public List getCategories() { - return categories; - } - - public Category getCategoryById(String id) { - for (Category category : categories) { - if (category.getId().equals(id)) return category; - } - return null; - } - - public Quests getPlugin() { - return this.plugin; - } -} diff --git a/src/main/java/com/leonardobishop/quests/quests/Task.java b/src/main/java/com/leonardobishop/quests/quests/Task.java deleted file mode 100644 index cc93a8cf..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/Task.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.leonardobishop.quests.quests; - -import java.util.HashMap; -import java.util.Map; - -public class Task { - - private final Map configValues = new HashMap<>(); - private final String id; - private final String type; - - public Task(String id, String type) { - this.id = id; - this.type = type; - } - - public String getId() { - return id; - } - - public String getType() { - return type; - } - - public Object getConfigValue(String key) { - return configValues.getOrDefault(key, null); //??? this will return null without the need of `OrDefault(key, null)` - } - - public Object getConfigValue(String key, Object def) { - return configValues.getOrDefault(key, def); - } - - public Map getConfigValues() { - return configValues; - } - - public void addConfigValue(String key, Object value) { - configValues.put(key, value); - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/ConfigValue.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/ConfigValue.java deleted file mode 100644 index 06a8f2f1..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/ConfigValue.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes; - -/** - * This is for the quest creator and is purely cosmetic. - */ -public final class ConfigValue { - - private final String key; - private final boolean required; - private final String description; - private final String[] requirementExceptions; - - public ConfigValue(String key, boolean required, String description, String... requirementExceptions) { - this.key = key; - this.required = required; - this.description = description; - this.requirementExceptions = requirementExceptions; - } - - public String getKey() { - return key; - } - - public boolean isRequired() { - return required; - } - - public String getDescription() { - return description; - } - - public String[] getRequirementExceptions() { - return requirementExceptions; - } -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskType.java deleted file mode 100644 index 0edec531..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskType.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import org.bukkit.event.Listener; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.UUID; - -/** - * A task type which can be used within Quests. A {@link Quest} - * will be registered to this if it contains at least 1 task - * which is of this type. This is so you do not have to - * iterate through every single quest. - */ -public abstract class TaskType implements Listener { - - private final List quests = new ArrayList<>(); - private final String type; - private String author; - private String description; - - /** - * @param type the name of the task type, should not contain spaces - * @param author the name of the person (or people) who wrote it - * @param description a short, simple description of the task type - */ - public TaskType(String type, String author, String description) { - this.type = type; - this.author = author; - this.description = description; - } - - /** - * @param type the name of the task type, should not contain spaces - */ - public TaskType(String type) { - this.type = type; - } - - /** - * Registers a {@link Quest} to this task type. This is usually done when - * all the quests are initially loaded. - * - * @param quest the {@link Quest} to register. - */ - public final void registerQuest(Quest quest) { - if (!quests.contains(quest)) { - quests.add(quest); - } - } - - /** - * Clears the list which contains the registered quests. - */ - public final void unregisterAll() { - quests.clear(); - } - - /** - * @return {@link List} of type {@link Quest} of all registered quests. - */ - public final List getRegisteredQuests() { - return quests; - } - - public final String getType() { - return type; - } - - public String getAuthor() { - return author; - } - - public String getDescription() { - return description; - } - - //TODO rework this - @Deprecated - public List getCreatorConfigValues() { - // not implemented here - return Collections.emptyList(); - } - - /** - * Called when Quests has finished registering all quests to the task type - * May be called several times if an operator uses /quests admin reload - */ - public void onReady() { - // not implemented here - } - - /** - * Called when a player starts a quest containing a task of this type - */ - public void onStart(Quest quest, Task task, UUID playerUUID) { - // not implemented here - } - - public void onDisable() { - // not implemented here - } - - /** - * Called when Quests reloads the configuration - used to detect errors in the configuration of your task type - */ - public List detectProblemsInConfig(String root, HashMap config) { - // not implemented here - return Collections.emptyList(); - } -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskTypeManager.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskTypeManager.java deleted file mode 100644 index d5196af0..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskTypeManager.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import org.bukkit.Bukkit; - -import java.util.ArrayList; - -public class TaskTypeManager { - - private final Quests plugin; - private boolean allowRegistrations; - - public TaskTypeManager(Quests plugin) { - this.plugin = plugin; - allowRegistrations = true; - } - - public void closeRegistrations() { - allowRegistrations = false; - } - - public boolean areRegistrationsAccepted() { - return allowRegistrations; - } - - private ArrayList taskTypes = new ArrayList<>(); - - public ArrayList getTaskTypes() { - return taskTypes; - } - - public void resetTaskTypes() { - for (TaskType taskType : taskTypes) { - taskType.getRegisteredQuests().clear(); - } - } - - public void registerTaskType(TaskType taskType) { - if (!allowRegistrations) { - throw new IllegalStateException("No longer accepting new task types (must be done before quests are loaded)"); - } - Bukkit.getPluginManager().registerEvents(taskType, plugin); - plugin.getQuestsLogger().info("Task type " + taskType.getType() + " has been registered."); - taskTypes.add(taskType); - } - - public void registerQuestTasksWithTaskTypes(Quest quest) { - if (allowRegistrations) { - throw new IllegalStateException("Still accepting new task types (type registrations must be closed before registering quests)"); - } - for (Task task : quest.getTasks()) { - TaskType t; - if ((t = getTaskType(task.getType())) != null) { - t.registerQuest(quest); - } - } - } - - public TaskType getTaskType(String string) { - for (TaskType taskType : taskTypes) { - if (taskType.getType().equalsIgnoreCase(string)) { - return taskType; - } - } - return null; - } -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskUtils.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskUtils.java deleted file mode 100644 index fe9e9506..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskUtils.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.quests.Task; -import org.bukkit.entity.Player; - -import java.util.List; - -public class TaskUtils { - - public static String TASK_ATTRIBUTION_STRING = ""; - - public static boolean validateWorld(Player player, Task task) { - return validateWorld(player.getLocation().getWorld().getName(), task.getConfigValue("worlds")); - } - - public static boolean validateWorld(String worldName, Task task) { - return validateWorld(worldName, task.getConfigValue("worlds")); - } - - public static boolean validateWorld(String worldName, Object configurationData) { - if (configurationData == null) { - return true; - } - - if (configurationData instanceof List) { - List allowedWorlds = (List) configurationData; - if (!allowedWorlds.isEmpty() && allowedWorlds.get(0) instanceof String) { - List allowedWorldNames = (List) allowedWorlds; - return allowedWorldNames.contains(worldName); - } - return true; - } - - if (configurationData instanceof String) { - String allowedWorld = (String) configurationData; - return worldName.equals(allowedWorld); - } - - return true; - } - - public static void configValidateInt(String path, Object object, List problems, boolean allowNull, boolean greaterThanZero, String... args) { - if (object == null) { - if (!allowNull) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, - String.format("Expected an integer for '%s', but got null instead", (Object[]) args), path)); - } - return; - } - - try { - Integer i = (Integer) object; - if (greaterThanZero && i <= 0) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, - String.format("Value for field '%s' must be greater than 0", (Object[]) args), path)); - } - } catch (ClassCastException ex) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, - String.format("Expected an integer for '%s', but got '" + object + "' instead", (Object[]) args), path)); - } - } - - public static void configValidateBoolean(String path, Object object, List problems, boolean allowNull, String... args) { - if (object == null) { - if (!allowNull) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, - String.format("Expected a boolean for '%s', but got null instead", (Object[]) args), path)); - } - return; - } - - try { - Boolean b = (Boolean) object; - } catch (ClassCastException ex) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, - String.format("Expected a boolean for '%s', but got '" + object + "' instead", (Object[]) args), path)); - } - } - - public static boolean configValidateExists(String path, Object object, List problems, String... args) { - if (object == null) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, - String.format(QuestsConfigLoader.ConfigProblemDescriptions.TASK_MISSING_FIELD.getDescription(args), (Object[]) args), path)); - return false; - } - return true; - } -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BreedingTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BreedingTaskType.java deleted file mode 100644 index f087723a..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BreedingTaskType.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.entity.CreatureSpawnEvent; -import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class BreedingTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public BreedingTaskType() { - super("breeding", TaskUtils.TASK_ATTRIBUTION_STRING, "Breed a set amount of animals."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of animals to be bred")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) - TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); - return problems; - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBreed(CreatureSpawnEvent e) { - if (!e.getSpawnReason().equals(SpawnReason.BREEDING)) { - return; - } - - Entity ent = e.getEntity(); - List entList = ent.getNearbyEntities(10, 10, 10); - - if (entList.isEmpty()) { - return; - } - // Check if there is a player in the list, otherwise: return. - for (Entity current : entList) { - if (current instanceof Player && !current.hasMetadata("NPC")) { - Player player = (Player) current; - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); - if (qPlayer == null) { - continue; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!TaskUtils.validateWorld(player, task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - int breedingNeeded = (int) task.getConfigValue("amount"); - int breedingProgress; - - if (taskProgress.getProgress() == null) { - breedingProgress = 0; - } else { - breedingProgress = (int) taskProgress.getProgress(); - } - - taskProgress.setProgress(breedingProgress + 1); - - if (((int) taskProgress.getProgress()) >= breedingNeeded) { - taskProgress.setCompleted(true); - } - } - } - } - } - } - } -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BrewingCertainTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BrewingCertainTaskType.java deleted file mode 100644 index 2c36f55a..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BrewingCertainTaskType.java +++ /dev/null @@ -1,114 +0,0 @@ -// TODO: fix -// -//package me.fatpigsarefat.quests.quests.tasktypes.types; -// -//import Quests; -//import QPlayer; -//import QuestProgress; -//import QuestProgressFile; -//import TaskProgress; -//import Quest; -//import Task; -//import ConfigValue; -//import TaskType; -//import org.bukkit.Bukkit; -//import org.bukkit.Location; -//import org.bukkit.Material; -//import org.bukkit.entity.Player; -//import org.bukkit.event.EventHandler; -//import org.bukkit.event.EventPriority; -//import org.bukkit.event.block.Action; -//import org.bukkit.event.inventory.BrewEvent; -//import org.bukkit.event.player.PlayerInteractEvent; -//import org.bukkit.inventory.ItemStack; -// -//import java.util.ArrayList; -//import java.util.HashMap; -//import java.util.List; -//import java.util.UUID; -// -//public final class BrewingCertainTaskType extends TaskType { -// -// private List creatorConfigValues = new ArrayList<>(); -// private HashMap brewingStands = new HashMap<>(); -// -// public BrewingCertainTaskType() { -// super("brewingcertain", "fatpigsarefat", "Brew a certain type of potion."); -// this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of potions to be brewed.")); -// this.creatorConfigValues.add(new ConfigValue("potion", true, "ID of potion to be brewed.")); -// } -// -// @Override -// public List getCreatorConfigValues() { -// return creatorConfigValues; -// } -// -// @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) -// public void onBlockPlace(PlayerInteractEvent event) { -// if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { -// if (event.getClickedBlock().getType() == Material.BREWING_STAND) { -// brewingStands.put(event.getClickedBlock().getLocation(), event.getPlayer().getUniqueId()); -// } -// } -// } -// -// @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) -// public void onBlockPlace(BrewEvent event) { -// UUID uuid; -// if ((uuid = brewingStands.get(event.getBlock().getLocation())) != null) { -// Player player = Bukkit.getPlayer(uuid); -// -// if (player == null) { -// return; -// } -// -// QPlayer qPlayer = Quests.getPlayerManager().getPlayer(player.getUniqueId()); -// QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile(); -// -// for (Quest quest : super.getRegisteredQuests()) { -// if (questProgressFile.hasStartedQuest(quest)) { -// QuestProgress questProgress = questProgressFile.getQuestProgress(quest); -// -// for (Task task : quest.getTasksOfType(super.getType())) { -// TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); -// -// if (taskProgress.isCompleted()) { -// continue; -// } -// -// int potionsNeeded = (int) task.getConfigValue("amount"); -// -// int progress; -// if (taskProgress.getProgress() == null) { -// progress = 0; -// } else { -// progress = (int) taskProgress.getProgress(); -// } -// -// int potionType = (int) task.getConfigValue("potion"); -// -// ItemStack potion1 = event.getContents().getItem(0); -// if (potion1.getDurability() != potionType) { -// potion1 = null; -// } -// ItemStack potion2 = event.getContents().getItem(1); -// if (potion2.getDurability() != potionType) { -// potion2 = null; -// } -// ItemStack potion3 = event.getContents().getItem(2); -// if (potion3.getDurability() != potionType) { -// potion3 = null; -// } -// -// taskProgress.setProgress(progress + (potion1 == null ? 0 : 1) + (potion2 == null ? 0 : 1) + (potion3 == null ? 0 : 1)); -// -// if (((int) taskProgress.getProgress()) >= potionsNeeded) { -// taskProgress.setCompleted(true); -// } -// } -// } -// } -// } -// } -// -//} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BrewingTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BrewingTaskType.java deleted file mode 100644 index 51956bb6..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BrewingTaskType.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.block.Action; -import org.bukkit.event.inventory.BrewEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.UUID; - -public final class BrewingTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - private HashMap brewingStands = new HashMap<>(); - - public BrewingTaskType() { - super("brewing", TaskUtils.TASK_ATTRIBUTION_STRING, "Brew a potion."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of potions to be brewed.")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) - TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); - return problems; - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockPlace(PlayerInteractEvent event) { - if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { - if (event.getClickedBlock().getType() == Material.BREWING_STAND) { - brewingStands.put(event.getClickedBlock().getLocation(), event.getPlayer().getUniqueId()); - } - } - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockPlace(BrewEvent event) { - UUID uuid; - if ((uuid = brewingStands.get(event.getBlock().getLocation())) != null) { - Player player = Bukkit.getPlayer(uuid); - - if (player == null || player.hasMetadata("NPC")) { - return; - } - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!TaskUtils.validateWorld(player, task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - int potionsNeeded = (int) task.getConfigValue("amount"); - - int progress; - if (taskProgress.getProgress() == null) { - progress = 0; - } else { - progress = (int) taskProgress.getProgress(); - } - - ItemStack potion1 = event.getContents().getItem(0); - ItemStack potion2 = event.getContents().getItem(1); - ItemStack potion3 = event.getContents().getItem(2); - - taskProgress.setProgress(progress + (potion1 == null ? 0 : 1) + (potion2 == null ? 0 : 1) + (potion3 == null ? 0 : 1)); - - if (((int) taskProgress.getProgress()) >= potionsNeeded) { - taskProgress.setCompleted(true); - } - } - } - } - } - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BuildingCertainTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BuildingCertainTaskType.java deleted file mode 100644 index 69e2c704..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BuildingCertainTaskType.java +++ /dev/null @@ -1,198 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class BuildingCertainTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public BuildingCertainTaskType() { - super("blockplacecertain", TaskUtils.TASK_ATTRIBUTION_STRING, "Place a set amount of a specific block."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of blocks to be placed.")); - this.creatorConfigValues.add(new ConfigValue("block", true, "Name or ID of block.")); - this.creatorConfigValues.add(new ConfigValue("data", false, "Data code for block.")); - this.creatorConfigValues.add(new ConfigValue("reverse-if-broken", false, "Will reverse progression if block of same type is broken.")); - this.creatorConfigValues.add(new ConfigValue("use-similar-blocks", false, "(Deprecated) If true, this will ignore orientation of doors, logs etc.")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) - TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); - if (config.get("block") == null && config.get("blocks") == null) { - TaskUtils.configValidateExists(root + ".block", config.get("block"), problems, "block", super.getType()); - } else { - Object configBlock; - String source; - if (config.containsKey("block")) { - source = "block"; - } else { - source = "blocks"; - } - configBlock = config.get(source); - List checkBlocks = new ArrayList<>(); - if (configBlock instanceof List) { - checkBlocks.addAll((List) configBlock); - } else { - checkBlocks.add(String.valueOf(configBlock)); - } - - for (String materialName : checkBlocks) { - String[] split = materialName.split(":"); - if (Material.getMaterial(String.valueOf(split[0])) == null) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, - QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(materialName), root + "." + source)); - } - } - } - TaskUtils.configValidateBoolean(root + ".reverse-if-broken", config.get("reverse-if-broken"), problems, true,"reverse-if-broken"); - TaskUtils.configValidateBoolean(root + ".use-similar-blocks", config.get("use-similar-blocks"), problems, true,"use-similar-blocks"); - TaskUtils.configValidateInt(root + ".data", config.get("data"), problems, true,true, "data"); - return problems; - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockPlace(BlockPlaceEvent event) { - if (event.getPlayer().hasMetadata("NPC")) return; - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!TaskUtils.validateWorld(event.getPlayer(), task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - if (matchBlock(task, event.getBlock())) { - increment(task, taskProgress, 1); - } - } - } - } - } - - // subtract if enabled - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockBreak(BlockBreakEvent event) { - if (event.getPlayer().hasMetadata("NPC")) return; - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - if (task.getConfigValue("reverse-if-placed") != null && ((boolean) task.getConfigValue("reverse-if-placed"))) { - if (matchBlock(task, event.getBlock())) { - increment(task, taskProgress, -1); - } - } - } - } - } - } - - @SuppressWarnings("deprecation") - private boolean matchBlock(Task task, Block block) { - Material material; - - Object configBlock = task.getConfigValues().containsKey("block") ? task.getConfigValue("block") : task.getConfigValue("blocks"); - Object configData = task.getConfigValue("data"); - Object configSimilarBlocks = task.getConfigValue("use-similar-blocks"); - - List checkBlocks = new ArrayList<>(); - if (configBlock instanceof List) { - checkBlocks.addAll((List) configBlock); - } else { - checkBlocks.add(String.valueOf(configBlock)); - } - - for (String materialName : checkBlocks) { - // LOG:1 LOG:2 LOG should all be supported with this - String[] split = materialName.split(":"); - int comparableData = 0; - if (configData != null) { - comparableData = (int) configData; - } - if (split.length > 1) { - comparableData = Integer.parseInt(split[1]); - } - - material = Material.getMaterial(String.valueOf(split[0])); - Material blockType = block.getType(); - - short blockData = block.getData(); - - if (blockType == material) { - if (((split.length == 1 && configData == null) || ((int) blockData) == comparableData)) - return true; - } - } - return false; - } - - private void increment(Task task, TaskProgress taskProgress, int amount) { - int brokenBlocksNeeded = (int) task.getConfigValue("amount"); - - int progressBlocksBroken; - if (taskProgress.getProgress() == null) { - progressBlocksBroken = 0; - } else { - progressBlocksBroken = (int) taskProgress.getProgress(); - } - - taskProgress.setProgress(progressBlocksBroken + amount); - - if (((int) taskProgress.getProgress()) >= brokenBlocksNeeded) { - taskProgress.setCompleted(true); - } - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BuildingTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BuildingTaskType.java deleted file mode 100644 index d46d2170..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BuildingTaskType.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.block.BlockPlaceEvent; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class BuildingTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public BuildingTaskType() { - super("blockplace", TaskUtils.TASK_ATTRIBUTION_STRING, "Place a set amount of blocks."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of blocks to be placed.")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) - TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); - return problems; - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockPlace(BlockPlaceEvent event) { - if (event.getPlayer().hasMetadata("NPC")) return; - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!TaskUtils.validateWorld(event.getPlayer(), task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - int brokenBlocksNeeded = (int) task.getConfigValue("amount"); - - int progressBlocksBroken; - if (taskProgress.getProgress() == null) { - progressBlocksBroken = 0; - } else { - progressBlocksBroken = (int) taskProgress.getProgress(); - } - - taskProgress.setProgress(progressBlocksBroken + 1); - - if (((int) taskProgress.getProgress()) >= brokenBlocksNeeded) { - taskProgress.setCompleted(true); - } - } - } - } - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/CommandTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/CommandTaskType.java deleted file mode 100644 index c45a1f34..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/CommandTaskType.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class CommandTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public CommandTaskType() { - super("command", TaskUtils.TASK_ATTRIBUTION_STRING, "Execute a certain command."); - this.creatorConfigValues.add(new ConfigValue("command", true, "The command to execute.")); - this.creatorConfigValues.add(new ConfigValue("ignore-case", false, "Ignore the casing of the command.")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - TaskUtils.configValidateExists(root + ".command", config.get("command"), problems, "command", super.getType()); - TaskUtils.configValidateBoolean(root + ".ignore-case", config.get("ignore-case"), problems, true, "ignore-case", super.getType()); - return problems; - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onCommand(PlayerCommandPreprocessEvent e) { - if (e.getPlayer().hasMetadata("NPC")) return; - - Player player = e.getPlayer(); - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!TaskUtils.validateWorld(player, task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - Object configCommand = task.getConfigValue("command"); - Object configIgnoreCase = task.getConfigValue("ignore-case"); - - List commands = new ArrayList<>(); - if (configCommand instanceof List) { - commands.addAll((List) configCommand); - } else { - commands.add(String.valueOf(configCommand)); - } - - boolean ignoreCasing = false; - if (configIgnoreCase != null) { - ignoreCasing = (boolean) task.getConfigValue("ignore-case"); - } - String message = e.getMessage(); - if (message.length() >= 1) { - message = message.substring(1); - } - - for (String command : commands) { - if (ignoreCasing && command.equalsIgnoreCase(message)) { - taskProgress.setCompleted(true); - } else if (!ignoreCasing && command.equals(message)) { - taskProgress.setCompleted(true); - } - } - } - } - } - } -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/DealDamageTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/DealDamageTaskType.java deleted file mode 100644 index b9ec23ab..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/DealDamageTaskType.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.entity.EntityDamageByEntityEvent; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class DealDamageTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public DealDamageTaskType() { - super("dealdamage", TaskUtils.TASK_ATTRIBUTION_STRING, "Deal a certain amount of damage."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of damage you need to deal")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) - TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); - return problems; - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onDamage(EntityDamageByEntityEvent e) { - if (!(e.getDamager() instanceof Player)) { - return; - } - - Player player = (Player) e.getDamager(); - double damage = e.getDamage(); - - if (player.hasMetadata("NPC")) return; - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!TaskUtils.validateWorld(player, task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - double progressDamage; - int damageNeeded = (int) task.getConfigValue("amount"); - - if (taskProgress.getProgress() == null) { - progressDamage = 0.0; - } else { - progressDamage = (double) taskProgress.getProgress(); - } - - taskProgress.setProgress(progressDamage + damage); - - if (((double) taskProgress.getProgress()) >= (double) damageNeeded) { - taskProgress.setProgress(damageNeeded); - taskProgress.setCompleted(true); - } - } - } - } - } -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/DistancefromTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/DistancefromTaskType.java deleted file mode 100644 index a57194e2..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/DistancefromTaskType.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.player.PlayerMoveEvent; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class DistancefromTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public DistancefromTaskType() { - super("distancefrom", TaskUtils.TASK_ATTRIBUTION_STRING, "Distance yourself from a set of co-ordinates."); - this.creatorConfigValues.add(new ConfigValue("x", true, "X position.")); - this.creatorConfigValues.add(new ConfigValue("y", true, "Y position.")); - this.creatorConfigValues.add(new ConfigValue("z", true, "Z position.")); - this.creatorConfigValues.add(new ConfigValue("world", true, "Name of world.")); - this.creatorConfigValues.add(new ConfigValue("distance", true, "Distance the player needs to be from the co-ordinates.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".x", config.get("x"), problems, "x", super.getType())) - TaskUtils.configValidateInt(root + ".x", config.get("x"), problems, false, false, "x"); - if (TaskUtils.configValidateExists(root + ".y", config.get("y"), problems, "y", super.getType())) - TaskUtils.configValidateInt(root + ".y", config.get("y"), problems, false, false, "y"); - if (TaskUtils.configValidateExists(root + ".z", config.get("z"), problems, "z", super.getType())) - TaskUtils.configValidateInt(root + ".z", config.get("z"), problems, false, false, "z"); - if (TaskUtils.configValidateExists(root + ".distance", config.get("distance"), problems, "distance", super.getType())) - TaskUtils.configValidateInt(root + ".distance", config.get("distance"), problems, false, true, "distance"); - return problems; - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - -// private HashMap> distanceSquaredCache = new HashMap<>(); -// -// @Override -// public void onReady() { -// distanceSquaredCache.clear(); -// for (Quest quest : super.getRegisteredQuests()) { -// HashMap squaredDistances = new HashMap<>(); -// for (Task task : quest.getTasksOfType(super.getType())) { -// int distance = (int) task.getConfigValue("distance"); -// squaredDistances.put(task.getId(), distance); -// } -// distanceSquaredCache.put(quest.getId(), squaredDistances); -// } -// } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onMove(PlayerMoveEvent event) { - if (event.getFrom().getBlockX() == event.getTo().getBlockX() && event.getFrom().getBlockZ() == event.getTo().getBlockZ()) { - return; - } - - if (event.getPlayer().hasMetadata("NPC")) return; - Player player = event.getPlayer(); - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - int x = (int) task.getConfigValue("x"); - int y = (int) task.getConfigValue("y"); - int z = (int) task.getConfigValue("z"); - String worldString = (String) task.getConfigValue("world"); - int distance = (int) task.getConfigValue("distance"); - int distanceSquared = distance * distance; - - World world = Bukkit.getWorld(worldString); - if (world == null) { - continue; - } - - Location location = new Location(world, x, y, z); - if (player.getWorld().equals(world) && player.getLocation().distanceSquared(location) > distanceSquared) { - taskProgress.setCompleted(true); - } - } - } - } - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/EnchantingTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/EnchantingTaskType.java deleted file mode 100644 index 76ff574a..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/EnchantingTaskType.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.enchantment.EnchantItemEvent; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class EnchantingTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public EnchantingTaskType() { - super("enchanting", TaskUtils.TASK_ATTRIBUTION_STRING, "Enchant a certain amount of items."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of items you need to enchant.")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) - TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); - return problems; - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onEnchant(EnchantItemEvent e) { - if (e.getEnchanter().hasMetadata("NPC")) return; - - Player player = e.getEnchanter(); - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!TaskUtils.validateWorld(player, task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - int enchantsNeeded = (int) task.getConfigValue("amount"); - - int progressEnchant; - if (taskProgress.getProgress() == null) { - progressEnchant = 0; - } else { - progressEnchant = (int) taskProgress.getProgress(); - } - - taskProgress.setProgress(progressEnchant + 1); - - if (((int) taskProgress.getProgress()) >= enchantsNeeded) { - taskProgress.setCompleted(true); - } - } - } - } - } -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/ExpEarnTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/ExpEarnTaskType.java deleted file mode 100644 index 7eb58d8a..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/ExpEarnTaskType.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.player.PlayerExpChangeEvent; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class ExpEarnTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public ExpEarnTaskType() { - super("expearn", TaskUtils.TASK_ATTRIBUTION_STRING, "Earn a set amount of exp."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of exp that needs to be earned.")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) - TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); - return problems; - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onExpEarn(PlayerExpChangeEvent e) { - if (e.getPlayer().hasMetadata("NPC")) return; - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(e.getPlayer().getUniqueId()); - if (qPlayer == null) { - return; - } - - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!TaskUtils.validateWorld(e.getPlayer(), task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - int amount = e.getAmount(); - int expNeeded = (int) task.getConfigValue("amount"); - - int progressExp; - if (taskProgress.getProgress() == null) { - progressExp = 0; - } else { - progressExp = (int) taskProgress.getProgress(); - } - - taskProgress.setProgress(progressExp + amount); - - if (((int) taskProgress.getProgress()) >= expNeeded) { - taskProgress.setCompleted(true); - } - } - } - } - } -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/FarmingTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/FarmingTaskType.java deleted file mode 100644 index e79164b8..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/FarmingTaskType.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.Material; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.material.Crops; - -import java.util.ArrayList; -import java.util.List; - -public final class FarmingTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public FarmingTaskType() { - super("farming", TaskUtils.TASK_ATTRIBUTION_STRING, "Break a set amount of a crop."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of crops to be broken.")); - this.creatorConfigValues.add(new ConfigValue("crop", true, "Name or ID of crop.")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @SuppressWarnings("deprecation") - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockBreak(BlockBreakEvent event) { - //TODO: finish this - if (!(event.getBlock().getState() instanceof Crops)) { - return; - } - Crops crop = (Crops) event.getBlock().getState(); - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!TaskUtils.validateWorld(event.getPlayer(), task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - Material material; - Object configBlock = task.getConfigValue("block"); - Object configData = task.getConfigValue("data"); - - material = Material.matchMaterial(String.valueOf(configBlock)); - - - if (material != null && event.getBlock().getType().equals(material)) { - - if (configData != null && (((int) event.getBlock().getData()) != ((int) configData))) { - continue; - } - int brokenBlocksNeeded = (int) task.getConfigValue("amount"); - - int progressBlocksBroken; - if (taskProgress.getProgress() == null) { - progressBlocksBroken = 0; - } else { - progressBlocksBroken = (int) taskProgress.getProgress(); - } - - taskProgress.setProgress(progressBlocksBroken + 1); - - if (((int) taskProgress.getProgress()) >= brokenBlocksNeeded) { - taskProgress.setCompleted(true); - } - } - } - } - } - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/FishingTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/FishingTaskType.java deleted file mode 100644 index 419886a1..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/FishingTaskType.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.player.PlayerFishEvent; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class FishingTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public FishingTaskType() { - super("fishing", TaskUtils.TASK_ATTRIBUTION_STRING, "Catch a set amount of items from the sea."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of fish to be caught.")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) - TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); - return problems; - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onFishCaught(PlayerFishEvent event) { - if (event.getPlayer().hasMetadata("NPC")) return; - - if (event.getState() != PlayerFishEvent.State.CAUGHT_FISH) { - return; - } - -// Location hookLocation = event.getHook().getLocation().add(0, -1, 0); -// if (!(hookLocation.getBlock().getType() == Material.WATER)) { -// return; -// } - - Player player = event.getPlayer(); - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!TaskUtils.validateWorld(player, task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - int catchesNeeded = (int) task.getConfigValue("amount"); - - int progressCatches; - if (taskProgress.getProgress() == null) { - progressCatches = 0; - } else { - progressCatches = (int) taskProgress.getProgress(); - } - - taskProgress.setProgress(progressCatches + 1); - - if (((int) taskProgress.getProgress()) >= catchesNeeded) { - taskProgress.setCompleted(true); - } - } - } - } - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/InventoryTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/InventoryTaskType.java deleted file mode 100644 index c2bdcff6..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/InventoryTaskType.java +++ /dev/null @@ -1,184 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.inventory.InventoryCloseEvent; -import org.bukkit.event.player.PlayerPickupItemEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class InventoryTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - private final Quests plugin; - - public InventoryTaskType(Quests plugin) { - super("inventory", TaskUtils.TASK_ATTRIBUTION_STRING, "Obtain a set of items."); - this.plugin = plugin; - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of item to retrieve.")); - this.creatorConfigValues.add(new ConfigValue("item", true, "Name or ID of item.")); - this.creatorConfigValues.add(new ConfigValue("data", false, "Data of item.")); - this.creatorConfigValues.add(new ConfigValue("remove-items-when-complete", false, "Take the items away from the player on completion (true/false, " + - "default = false).")); - this.creatorConfigValues.add(new ConfigValue("update-progress", false, "Update the displayed progress (if this causes lag then disable it).")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".item", config.get("item"), problems, "item", super.getType())) { - Object configBlock = config.get("item"); - if (configBlock instanceof ConfigurationSection) { - ConfigurationSection section = (ConfigurationSection) configBlock; - String itemloc = "item"; - if (!section.contains("item")) { - itemloc = "type"; - } - if (!section.contains(itemloc)) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, - QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(""), root + ".item.type")); - } else { - String type = String.valueOf(section.get(itemloc)); - if (!plugin.getItemGetter().isValidMaterial(type)) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, - QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(type), root + ".item." + itemloc)); - } - } - } else { - if (Material.getMaterial(String.valueOf(configBlock)) == null) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, - QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(String.valueOf(configBlock)), root + ".item.item")); - } - } - } - if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) - TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); - TaskUtils.configValidateInt(root + ".data", config.get("data"), problems, true, false, "data"); - TaskUtils.configValidateBoolean(root + ".remove-items-when-complete", config.get("remove-items-when-complete"), problems, true, "remove-items-when-complete", super.getType()); - TaskUtils.configValidateBoolean(root + ".update-progress", config.get("update-progress"), problems, true, "update-progress", super.getType()); - return problems; - } - - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @SuppressWarnings("deprecation") - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onItemPickup(PlayerPickupItemEvent event) { - if (event.getPlayer().hasMetadata("NPC")) return; - - Bukkit.getScheduler().runTaskLater(plugin, () -> this.checkInventory(event.getPlayer()), 1L); - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onInventoryClick(InventoryCloseEvent event) { - Bukkit.getScheduler().runTaskLater(plugin, () -> checkInventory((Player) event.getPlayer()), 1L); //Still some work to do as it doesn't really work - } - - @SuppressWarnings("deprecation") - private void checkInventory(Player player) { - if (player == null || !player.isOnline()) { - return; - } - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!TaskUtils.validateWorld(player, task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - Material material; - int amount = (int) task.getConfigValue("amount"); - Object configBlock = task.getConfigValue("item"); - Object configData = task.getConfigValue("data"); - Object remove = task.getConfigValue("remove-items-when-complete"); - - ItemStack is; - if (configBlock instanceof ConfigurationSection) { - is = plugin.getItemStack("", (org.bukkit.configuration.ConfigurationSection) configBlock); - } else { - material = Material.getMaterial(String.valueOf(configBlock)); - - if (material == null) { - continue; - } - if (configData != null) { - is = new ItemStack(material, 1, ((Integer) configData).shortValue()); - } else { - is = new ItemStack(material, 1); - } - } - - if (task.getConfigValue("update-progress") != null - && (Boolean) task.getConfigValue("update-progress")) { - int inInv = getAmount(player, is, amount); - if (taskProgress.getProgress() != null && (int) taskProgress.getProgress() != inInv) { - taskProgress.setProgress(inInv); - } else if (taskProgress.getProgress() == null) { - taskProgress.setProgress(inInv); - } - } - - if (player.getInventory().containsAtLeast(is, amount)) { - is.setAmount(amount); - taskProgress.setCompleted(true); - - if (remove != null && ((Boolean) remove)) { - player.getInventory().removeItem(is); - } - } - } - } - } - } - - private int getAmount(Player player, ItemStack is, int max) { - if (is == null) { - return 0; - } - int amount = 0; - for (int i = 0; i < 36; i++) { - ItemStack slot = player.getInventory().getItem(i); - if (slot == null || !slot.isSimilar(is)) - continue; - amount += slot.getAmount(); - } - return Math.min(amount, max); - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MilkingTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MilkingTaskType.java deleted file mode 100644 index d3ade307..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MilkingTaskType.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.Material; -import org.bukkit.entity.Cow; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.player.PlayerInteractEntityEvent; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class MilkingTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public MilkingTaskType() { - super("milking", TaskUtils.TASK_ATTRIBUTION_STRING, "Milk a set amount of cows."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of cows to be milked.")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) - TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); - return problems; - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @SuppressWarnings("deprecation") - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onMilk(PlayerInteractEntityEvent event) { - if (!(event.getRightClicked() instanceof Cow) || (event.getPlayer().getItemInHand().getType() != Material.BUCKET)) { - return; - } - - if (event.getPlayer().hasMetadata("NPC")) return; - - Player player = event.getPlayer(); - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); - if (qPlayer == null) { - return; - } - - QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile(); - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!TaskUtils.validateWorld(player, task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - int cowsNeeded = (int) task.getConfigValue("amount"); - - int progressMilked; - if (taskProgress.getProgress() == null) { - progressMilked = 0; - } else { - progressMilked = (int) taskProgress.getProgress(); - } - - taskProgress.setProgress(progressMilked + 1); - - if (((int) taskProgress.getProgress()) >= cowsNeeded) { - taskProgress.setCompleted(true); - } - } - } - } - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MiningCertainTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MiningCertainTaskType.java deleted file mode 100644 index 24e2cb99..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MiningCertainTaskType.java +++ /dev/null @@ -1,209 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class MiningCertainTaskType extends TaskType { - - private final Quests plugin; - private List creatorConfigValues = new ArrayList<>(); - - public MiningCertainTaskType(Quests plugin) { - super("blockbreakcertain", TaskUtils.TASK_ATTRIBUTION_STRING, "Break a set amount of a specific block."); - this.plugin = plugin; - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of blocks to be broken.")); - this.creatorConfigValues.add(new ConfigValue("block", true, "Name or ID of block.", "block")); // Can use name:datacode - this.creatorConfigValues.add(new ConfigValue("blocks", true, "List of blocks (alias for block for config readability).", "block")); - this.creatorConfigValues.add(new ConfigValue("data", false, "Data code for block.")); // only used if no datacode provided in block or blocks - this.creatorConfigValues.add(new ConfigValue("reverse-if-placed", false, "Will reverse progression if block of same type is placed.")); - this.creatorConfigValues.add(new ConfigValue("check-coreprotect", false, "Use coreprotect to check for blocks placed by a player")); - this.creatorConfigValues.add(new ConfigValue("check-coreprotect-time", false, "Time period for coreprotect check")); - this.creatorConfigValues.add(new ConfigValue("use-similar-blocks", false, "(Deprecated) If true, this will ignore orientation of doors, logs etc.")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) - TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); - if (config.get("block") == null && config.get("blocks") == null) { - TaskUtils.configValidateExists(root + ".block", config.get("block"), problems, "block", super.getType()); - } else { - Object configBlock; - String source; - if (config.containsKey("block")) { - source = "block"; - } else { - source = "blocks"; - } - configBlock = config.get(source); - List checkBlocks = new ArrayList<>(); - if (configBlock instanceof List) { - checkBlocks.addAll((List) configBlock); - } else { - checkBlocks.add(String.valueOf(configBlock)); - } - - for (String materialName : checkBlocks) { - String[] split = materialName.split(":"); - if (Material.getMaterial(String.valueOf(split[0])) == null) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, - QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(materialName), root + "." + source)); - } - } - } - TaskUtils.configValidateBoolean(root + ".reverse-if-broken", config.get("reverse-if-broken"), problems, true,"reverse-if-broken"); - TaskUtils.configValidateBoolean(root + ".check-coreprotect", config.get("check-coreprotect"), problems, true,"check-coreprotect"); - TaskUtils.configValidateInt(root + ".check-coreprotect-time", config.get("check-coreprotect-time"), problems, true,true, "check-coreprotect-time"); - TaskUtils.configValidateBoolean(root + ".use-similar-blocks", config.get("use-similar-blocks"), problems, true,"use-similar-blocks"); - TaskUtils.configValidateInt(root + ".data", config.get("data"), problems, true,true, "data"); - return problems; - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockBreak(BlockBreakEvent event) { - if (event.getPlayer().hasMetadata("NPC")) return; - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!TaskUtils.validateWorld(event.getPlayer(), task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - if (matchBlock(task, event.getBlock())) { - boolean coreProtectEnabled = (boolean) task.getConfigValue("check-coreprotect", false); - int coreProtectTime = (int) task.getConfigValue("check-coreprotect-time", 3600); - - if (coreProtectEnabled && plugin.getCoreProtectHook().checkBlock(event.getBlock(), coreProtectTime)) { - continue; - } - increment(task, taskProgress, 1); - } - } - } - } - } - - // subtract if enabled - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockPlace(BlockPlaceEvent event) { - if (event.getPlayer().hasMetadata("NPC")) return; - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - if (task.getConfigValue("reverse-if-placed") != null && ((boolean) task.getConfigValue("reverse-if-placed"))) { - if (matchBlock(task, event.getBlock())) { - increment(task, taskProgress, -1); - } - } - } - } - } - } - - @SuppressWarnings("deprecation") - private boolean matchBlock(Task task, Block block) { - Material material; - - Object configBlock = task.getConfigValues().containsKey("block") ? task.getConfigValue("block") : task.getConfigValue("blocks"); - Object configData = task.getConfigValue("data"); - Object configSimilarBlocks = task.getConfigValue("use-similar-blocks"); - - List checkBlocks = new ArrayList<>(); - if (configBlock instanceof List) { - checkBlocks.addAll((List) configBlock); - } else { - checkBlocks.add(String.valueOf(configBlock)); - } - - for (String materialName : checkBlocks) { - // LOG:1 LOG:2 LOG should all be supported with this - String[] split = materialName.split(":"); - int comparableData = 0; - if (configData != null) { - comparableData = (int) configData; - } - if (split.length > 1) { - comparableData = Integer.parseInt(split[1]); - } - - material = Material.getMaterial(String.valueOf(split[0])); - Material blockType = block.getType(); - - short blockData = block.getData(); - - if (blockType == material) { - if (((split.length == 1 && configData == null) || ((int) blockData) == comparableData)) - return true; - } - } - return false; - } - - private void increment(Task task, TaskProgress taskProgress, int amount) { - int brokenBlocksNeeded = (int) task.getConfigValue("amount"); - - int progressBlocksBroken; - if (taskProgress.getProgress() == null) { - progressBlocksBroken = 0; - } else { - progressBlocksBroken = (int) taskProgress.getProgress(); - } - - taskProgress.setProgress(progressBlocksBroken + amount); - - if (((int) taskProgress.getProgress()) >= brokenBlocksNeeded) { - taskProgress.setCompleted(true); - } - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MiningTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MiningTaskType.java deleted file mode 100644 index 7a9b5041..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MiningTaskType.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.block.BlockBreakEvent; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class MiningTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public MiningTaskType() { - // type, author, description - super("blockbreak", TaskUtils.TASK_ATTRIBUTION_STRING, "Break a set amount of blocks."); - - // config values for the quest creator to use, if unspecified then the quest creator will not know what to put here (and will require users to - // go into the config and manually configure there) - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of blocks to be broken.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) - TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); - return problems; - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockBreak(BlockBreakEvent event) { - if (event.getPlayer().hasMetadata("NPC")) return; // citizens also causes these events to fire - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); // get the qplayer so you can get their progress - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { // iterate through all quests which are registered to use this task type - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { // get all tasks of this type - if (!TaskUtils.validateWorld(event.getPlayer(), task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); // get the task progress and increment progress by 1 - - if (taskProgress.isCompleted()) { // dont need to increment a completed task - continue; - } - - int brokenBlocksNeeded = (int) task.getConfigValue("amount"); // this will retrieve a value from the config under the key "value" - - int progressBlocksBroken; - if (taskProgress.getProgress() == null) { // note: if the player has never progressed before, getProgress() will return null - progressBlocksBroken = 0; - } else { - progressBlocksBroken = (int) taskProgress.getProgress(); - } - - taskProgress.setProgress(progressBlocksBroken + 1); // the progress does not have to be an int, although must be serializable by the yaml provider - - if (((int) taskProgress.getProgress()) >= brokenBlocksNeeded) { // completion statement, if true the task is complete - taskProgress.setCompleted(true); - } - } - } - } - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MobkillingCertainTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MobkillingCertainTaskType.java deleted file mode 100644 index f31fcdf7..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MobkillingCertainTaskType.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.ChatColor; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.entity.EntityDeathEvent; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class MobkillingCertainTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public MobkillingCertainTaskType() { - super("mobkillingcertain", TaskUtils.TASK_ATTRIBUTION_STRING, "Kill a set amount of a specific entity type."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of mobs to be killed.")); - this.creatorConfigValues.add(new ConfigValue("mob", true, "Name of mob.")); - this.creatorConfigValues.add(new ConfigValue("name", false, "Only allow a specific name for mob (unspecified = any name allowed).")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".mob", config.get("mob"), problems, "mob", super.getType())) { - try { - EntityType.valueOf(String.valueOf(config.get("mob"))); - } catch (IllegalArgumentException ex) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, - QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_ENTITY_TYPE.getDescription(String.valueOf(config.get("mob"))), root + ".mob")); - } - } - if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) - TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); - return problems; - } - - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onMobKill(EntityDeathEvent event) { - Player killer = event.getEntity().getKiller(); - Entity mob = event.getEntity(); - - if (mob == null || mob instanceof Player) { - return; - } - - if (killer == null) { - return; - } - - if (killer.hasMetadata("NPC")) return; - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(killer.getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!TaskUtils.validateWorld(killer, task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - String configEntity = (String) task.getConfigValue("mob"); - String configName = (String) task.getConfigValue("name"); - - EntityType entity; - try { - entity = EntityType.valueOf(configEntity); - } catch (IllegalArgumentException ex) { - continue; - } - - if (configName != null) { - configName = ChatColor.translateAlternateColorCodes('&', configName); - if (mob.getCustomName() == null || !mob.getCustomName().equals(configName)) { - continue; - } - } - - if (mob.getType() != entity) { - continue; - } - - int mobKillsNeeded = (int) task.getConfigValue("amount"); - - int progressKills; - if (taskProgress.getProgress() == null) { - progressKills = 0; - } else { - progressKills = (int) taskProgress.getProgress(); - } - - taskProgress.setProgress(progressKills + 1); - - if (((int) taskProgress.getProgress()) >= mobKillsNeeded) { - taskProgress.setCompleted(true); - } - } - } - } - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MobkillingTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MobkillingTaskType.java deleted file mode 100644 index a9d958b7..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MobkillingTaskType.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.entity.Animals; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Monster; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.entity.EntityDeathEvent; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class MobkillingTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public MobkillingTaskType() { - super("mobkilling", TaskUtils.TASK_ATTRIBUTION_STRING, "Kill a set amount of entities."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of mobs to be killed.")); - this.creatorConfigValues.add(new ConfigValue("hostile", false, "Only allow hostile or non-hostile mobs (unspecified = any type allowed).")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) - TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); - TaskUtils.configValidateBoolean(root + ".hostile", config.get("hostile"), problems, true, "hostile"); - return problems; - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onMobKill(EntityDeathEvent event) { - Player killer = event.getEntity().getKiller(); //The killer is a player - Entity mob = event.getEntity(); - - if (mob == null || mob instanceof Player) { - return; - } - - if (killer == null) { - return; - } - - if (killer.hasMetadata("NPC")) return; - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(killer.getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!TaskUtils.validateWorld(killer, task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - boolean hostilitySpecified = false; - boolean hostile = false; - if (task.getConfigValue("hostile") != null) { - hostilitySpecified = true; - hostile = (boolean) task.getConfigValue("hostile"); - } - - if (hostilitySpecified) { - if (!hostile && !(mob instanceof Animals)) { - continue; - } else if (hostile && !(mob instanceof Monster)) { - continue; - } - } - - int mobKillsNeeded = (int) task.getConfigValue("amount"); - - int progressKills; - if (taskProgress.getProgress() == null) { - progressKills = 0; - } else { - progressKills = (int) taskProgress.getProgress(); - } - - taskProgress.setProgress(progressKills + 1); - - if (((int) taskProgress.getProgress()) >= mobKillsNeeded) { - taskProgress.setCompleted(true); - } - } - } - } - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PermissionTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PermissionTaskType.java deleted file mode 100644 index adf99eb1..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PermissionTaskType.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.scheduler.BukkitTask; - -import java.util.ArrayList; -import java.util.List; - -public final class PermissionTaskType extends TaskType { - - private Quests plugin; - private BukkitTask poll; - private List creatorConfigValues = new ArrayList<>(); - - public PermissionTaskType(Quests plugin) { - super("permission", TaskUtils.TASK_ATTRIBUTION_STRING, "Test if a player has a permission"); - this.plugin = plugin; - this.creatorConfigValues.add(new ConfigValue("permission", true, "The required permission.")); - } - - @Override - public void onReady() { - this.poll = new BukkitRunnable() { - @Override - public void run() { - for (Player player : Bukkit.getOnlinePlayers()) { - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); - if (qPlayer == null) { - continue; - } - for (Quest quest : PermissionTaskType.super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - for (Task task : quest.getTasksOfType(PermissionTaskType.super.getType())) { - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - if (taskProgress.isCompleted()) { - continue; - } - String permission = (String) task.getConfigValue("permission"); - if (permission != null) { - if (player.hasPermission(permission)) { - taskProgress.setCompleted(true); - } - } - } - } - } - } - } - }.runTaskTimer(plugin, 30L, 30L); - } - - @Override - public void onDisable() { - if (this.poll != null) { - this.poll.cancel(); - } - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PlayerkillingTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PlayerkillingTaskType.java deleted file mode 100644 index 94124a88..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PlayerkillingTaskType.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.entity.EntityDeathEvent; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class PlayerkillingTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public PlayerkillingTaskType() { - super("playerkilling", TaskUtils.TASK_ATTRIBUTION_STRING, "Kill a set amount of players."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of players to be killed.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) - TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); - return problems; - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onMobKill(EntityDeathEvent event) { - Player killer = event.getEntity().getKiller(); - Entity mob = event.getEntity(); - - if (!(mob instanceof Player)) { - return; - } - - if (killer == null) { - return; - } - - if (killer.hasMetadata("NPC")) return; - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(killer.getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!TaskUtils.validateWorld(killer, task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - int playerKillsNeeded = (int) task.getConfigValue("amount"); - - int progressKills; - if (taskProgress.getProgress() == null) { - progressKills = 0; - } else { - progressKills = (int) taskProgress.getProgress(); - } - - taskProgress.setProgress(progressKills + 1); - - if (((int) taskProgress.getProgress()) >= playerKillsNeeded) { - taskProgress.setCompleted(true); - } - } - } - } - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PlaytimeTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PlaytimeTaskType.java deleted file mode 100644 index 03ae29c8..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PlaytimeTaskType.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.scheduler.BukkitTask; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class PlaytimeTaskType extends TaskType { - - private final Quests plugin; - private BukkitTask poll; - private List creatorConfigValues = new ArrayList<>(); - - public PlaytimeTaskType(Quests plugin) { - super("playtime", TaskUtils.TASK_ATTRIBUTION_STRING, "Track the amount of playing time a user has been on"); - this.plugin = plugin; - this.creatorConfigValues.add(new ConfigValue("minutes", true, "Time in minutes.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".minutes", config.get("minutes"), problems, "minutes", super.getType())) - TaskUtils.configValidateInt(root + ".minutes", config.get("minutes"), problems, false, true, "minutes"); - return problems; - } - - - @Override - public void onReady() { - if (this.poll == null) { - this.poll = new BukkitRunnable() { - @Override - public void run() { - for (Player player : Bukkit.getOnlinePlayers()) { - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); - if (qPlayer == null) { - continue; - } - - for (Quest quest : PlaytimeTaskType.super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - for (Task task : quest.getTasksOfType(PlaytimeTaskType.super.getType())) { - if (!TaskUtils.validateWorld(player, task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - if (taskProgress.isCompleted()) { - continue; - } - int minutes = (int) task.getConfigValue("minutes"); - if (taskProgress.getProgress() == null) { - taskProgress.setProgress(1); - } else { - taskProgress.setProgress((int) taskProgress.getProgress() + 1); - } - if (((int) taskProgress.getProgress()) >= minutes) { - taskProgress.setCompleted(true); - } - } - } - } - } - } - }.runTaskTimer(plugin, 1200L, 1200L); - } - } - - @Override - public void onDisable() { -// if (this.poll != null) { -// this.poll.cancel(); -// } - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PositionTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PositionTaskType.java deleted file mode 100644 index b96340a7..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PositionTaskType.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.player.PlayerMoveEvent; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class PositionTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public PositionTaskType() { - super("position", TaskUtils.TASK_ATTRIBUTION_STRING, "Reach a set of co-ordinates."); - this.creatorConfigValues.add(new ConfigValue("x", true, "X position.")); - this.creatorConfigValues.add(new ConfigValue("y", true, "Y position.")); - this.creatorConfigValues.add(new ConfigValue("z", true, "Z position.")); - this.creatorConfigValues.add(new ConfigValue("world", true, "Name of world.")); - this.creatorConfigValues.add(new ConfigValue("distance-padding", false, "Padding zone in meters/blocks (default/unspecified = 0).")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - TaskUtils.configValidateExists(root + ".world", config.get("world"), problems, "world", super.getType()); - if (TaskUtils.configValidateExists(root + ".x", config.get("x"), problems, "x", super.getType())) - TaskUtils.configValidateInt(root + ".x", config.get("x"), problems, false, false, "x"); - if (TaskUtils.configValidateExists(root + ".y", config.get("y"), problems, "y", super.getType())) - TaskUtils.configValidateInt(root + ".y", config.get("y"), problems, false, false, "y"); - if (TaskUtils.configValidateExists(root + ".z", config.get("z"), problems, "z", super.getType())) - TaskUtils.configValidateInt(root + ".z", config.get("z"), problems, false, false, "z"); - TaskUtils.configValidateInt(root + ".distance-padding", config.get("distance-padding"), problems, true, true, "distance-padding"); - return problems; - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onMove(PlayerMoveEvent event) { - if (event.getFrom().getBlockX() == event.getTo().getBlockX() && event.getFrom().getBlockZ() == event.getTo().getBlockZ()) { - return; - } - - if (event.getPlayer().hasMetadata("NPC")) return; - - Player player = event.getPlayer(); - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - int x = (int) task.getConfigValue("x"); - int y = (int) task.getConfigValue("y"); - int z = (int) task.getConfigValue("z"); - String worldString = (String) task.getConfigValue("world"); - int padding = 0; - if (task.getConfigValue("distance-padding") != null) { - padding = (int) task.getConfigValue("distance-padding"); - } - int paddingSquared = padding * padding; - World world = Bukkit.getWorld(worldString); - if (world == null) { - continue; - } - - Location location = new Location(world, x, y, z); - if (player.getWorld().equals(world) && player.getLocation().getBlockX() == location.getBlockX() && player.getLocation().getBlockY() == location.getBlockY() && player.getLocation().getBlockZ() == location.getBlockZ()) { - taskProgress.setCompleted(true); - } else if (padding != 0 && player.getWorld().equals(world) && player.getLocation().distanceSquared(location) < paddingSquared) { - taskProgress.setCompleted(true); - } - } - } - } - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/ShearingTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/ShearingTaskType.java deleted file mode 100644 index 712ffcac..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/ShearingTaskType.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.entity.Player; -import org.bukkit.entity.Sheep; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.player.PlayerShearEntityEvent; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class ShearingTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public ShearingTaskType() { - super("shearing", TaskUtils.TASK_ATTRIBUTION_STRING, "Shear a set amount of sheep."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of cows to be milked.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) - TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); - return problems; - } - - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onShear(PlayerShearEntityEvent event) { - if (!(event.getEntity() instanceof Sheep)) { - return; - } - - if (event.getPlayer().hasMetadata("NPC")) return; - - Player player = event.getPlayer(); - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!TaskUtils.validateWorld(player, task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - int sheepNeeded = (int) task.getConfigValue("amount"); - - int progressSheared; - if (taskProgress.getProgress() == null) { - progressSheared = 0; - } else { - progressSheared = (int) taskProgress.getProgress(); - } - - taskProgress.setProgress(progressSheared + 1); - - if (((int) taskProgress.getProgress()) >= sheepNeeded) { - taskProgress.setCompleted(true); - } - } - } - } - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/TamingTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/TamingTaskType.java deleted file mode 100644 index a1389e8d..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/TamingTaskType.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.entity.EntityTameEvent; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class TamingTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public TamingTaskType() { - super("taming", TaskUtils.TASK_ATTRIBUTION_STRING, "Tame a set amount of animals."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of animals to be tamed.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) - TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); - return problems; - } - - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onTame(EntityTameEvent event) { - if (!(event.getOwner() instanceof Player)) { - return; - } - - Player player = (Player) event.getOwner(); - - if (player.hasMetadata("NPC")) return; - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!TaskUtils.validateWorld(player, task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - int tamesNeeded = (int) task.getConfigValue("amount"); - - int progressTamed; - if (taskProgress.getProgress() == null) { - progressTamed = 0; - } else { - progressTamed = (int) taskProgress.getProgress(); - } - - taskProgress.setProgress(progressTamed + 1); - - if (((int) taskProgress.getProgress()) >= tamesNeeded) { - taskProgress.setCompleted(true); - } - } - } - } - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/WalkingTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/WalkingTaskType.java deleted file mode 100644 index b0ae7196..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/WalkingTaskType.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.player.PlayerMoveEvent; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class WalkingTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public WalkingTaskType() { - super("walking", TaskUtils.TASK_ATTRIBUTION_STRING, "Walk a set distance."); - this.creatorConfigValues.add(new ConfigValue("distance", true, "Amount of meters (blocks) to be travelled.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".distance", config.get("distance"), problems, "distance", super.getType())) - TaskUtils.configValidateInt(root + ".distance", config.get("distance"), problems, false, true, "distance"); - return problems; - } - - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onMove(PlayerMoveEvent event) { - if (event.getFrom().getBlockX() == event.getTo().getBlockX() && event.getFrom().getBlockZ() == event.getTo().getBlockZ()) { - return; - } - - Player player = event.getPlayer(); - - if (player.hasMetadata("NPC")) return; - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!TaskUtils.validateWorld(player, task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - int distanceNeeded = (int) task.getConfigValue("distance"); - - int progressDistance; - if (taskProgress.getProgress() == null) { - progressDistance = 0; - } else { - progressDistance = (int) taskProgress.getProgress(); - } - - taskProgress.setProgress(progressDistance + 1); - - if (((int) taskProgress.getProgress()) >= distanceNeeded) { - taskProgress.setCompleted(true); - } - } - } - } - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/ASkyBlockLevelType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/ASkyBlockLevelType.java deleted file mode 100644 index 1cdddb53..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/ASkyBlockLevelType.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types.dependent; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import com.wasteofplastic.askyblock.events.IslandPostLevelEvent; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class ASkyBlockLevelType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public ASkyBlockLevelType() { - super("askyblock_level", TaskUtils.TASK_ATTRIBUTION_STRING, "Reach a certain island level for ASkyBlock."); - this.creatorConfigValues.add(new ConfigValue("level", true, "Minimum island level needed.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".level", config.get("level"), problems, "level", super.getType())) - TaskUtils.configValidateInt(root + ".level", config.get("level"), problems, false, false, "level"); - return problems; - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onIslandLevel(IslandPostLevelEvent event) { - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - long islandLevelNeeded = (long) (int) task.getConfigValue("level"); - - taskProgress.setProgress(event.getLongLevel()); - - if (((long) taskProgress.getProgress()) >= islandLevelNeeded) { - taskProgress.setCompleted(true); - } - } - } - } - } -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/BentoBoxLevelTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/BentoBoxLevelTaskType.java deleted file mode 100644 index a8d678e9..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/BentoBoxLevelTaskType.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types.dependent; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskTypeManager; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.event.EventHandler; -import world.bentobox.bentobox.BentoBox; -import world.bentobox.bentobox.api.events.BentoBoxEvent; -import world.bentobox.bentobox.database.objects.Island; - -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.atomic.AtomicLong; - -public final class BentoBoxLevelTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - private Field levelField = null; - - public BentoBoxLevelTaskType() { - super("bentobox_level", TaskUtils.TASK_ATTRIBUTION_STRING, "Reach a certain island level in the level addon for BentoBox."); - this.creatorConfigValues.add(new ConfigValue("level", true, "Minimum island level needed.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".level", config.get("level"), problems, "level", super.getType())) - TaskUtils.configValidateInt(root + ".level", config.get("level"), problems, false, false, "level"); - return problems; - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - public static void register(TaskTypeManager manager) { - if (BentoBox.getInstance().getAddonsManager().getAddonByName("Level").isPresent()) { - manager.registerTaskType(new BentoBoxLevelTaskType()); - } - } - - @EventHandler - public void onBentoBoxIslandLevelCalculated(BentoBoxEvent event) { - Map keyValues = event.getKeyValues(); - - if ("IslandLevelCalculatedEvent".equalsIgnoreCase(event.getEventName())) { - Island island = (Island) keyValues.get("island"); - - for (UUID member : island.getMemberSet()) { - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(member); - if (qPlayer == null) { - continue; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - long islandLevelNeeded = (long) (int) task.getConfigValue("level"); - - Object results = keyValues.get("results"); - - try { - if (levelField == null) { - levelField = results.getClass().getDeclaredField("level"); - levelField.setAccessible(true); - } - - AtomicLong level = (AtomicLong) levelField.get(results); - taskProgress.setProgress(level.get()); - } catch (NoSuchFieldException | IllegalAccessException e) { - e.printStackTrace(); - } - - if (((long) taskProgress.getProgress()) >= islandLevelNeeded) { - taskProgress.setCompleted(true); - } - } - } - } - } - } - } -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/CitizensDeliverTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/CitizensDeliverTaskType.java deleted file mode 100644 index 06575e67..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/CitizensDeliverTaskType.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types.dependent; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import net.citizensnpcs.api.event.NPCRightClickEvent; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.inventory.ItemStack; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class CitizensDeliverTaskType extends TaskType { - - private final Quests plugin; - private List creatorConfigValues = new ArrayList<>(); - - public CitizensDeliverTaskType(Quests plugin) { - super("citizens_deliver", TaskUtils.TASK_ATTRIBUTION_STRING, "Deliver a set of items to a NPC."); - this.plugin = plugin; - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of item to retrieve.")); - this.creatorConfigValues.add(new ConfigValue("item", true, "Name or ID of item.")); - this.creatorConfigValues.add(new ConfigValue("npc-name", true, "Name of the NPC.")); - this.creatorConfigValues.add(new ConfigValue("remove-items-when-complete", false, "Take the items away from the player on completion (true/false, " + - "default = false).")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".item", config.get("item"), problems, "item", super.getType())) { - Object configBlock = config.get("item"); - if (configBlock instanceof ConfigurationSection) { - ConfigurationSection section = (ConfigurationSection) configBlock; - String itemloc = "item"; - if (!section.contains("item")) { - itemloc = "type"; - } - if (!section.contains(itemloc)) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, - QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(""), root + ".item.type")); - } else { - String type = String.valueOf(section.get(itemloc)); - if (!plugin.getItemGetter().isValidMaterial(type)) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, - QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(type), root + ".item." + itemloc)); - } - } - } else { - if (Material.getMaterial(String.valueOf(configBlock)) == null) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, - QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(String.valueOf(configBlock)), root + ".item.item")); - } - } - } - if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) - TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); - TaskUtils.configValidateExists(root + ".npc-name", config.get("npc-name"), problems, "npc-name", super.getType()); - TaskUtils.configValidateBoolean(root + ".remove-items-when-complete", config.get("remove-items-when-complete"), problems, true, "remove-items-when-complete", super.getType()); - return problems; - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onNPCClick(NPCRightClickEvent event) { - Bukkit.getScheduler().runTaskLater(plugin, () -> checkInventory(event.getClicker(), event.getNPC().getName()), 1L); - } - - @SuppressWarnings("deprecation") - private void checkInventory(Player player, String citizenName) { - if (player == null || !player.isOnline()) { - return; - } - QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', String.valueOf(task.getConfigValue("npc-name")))).equals(ChatColor - .stripColor(ChatColor.translateAlternateColorCodes('&', citizenName)))) { - return; - } - if (!TaskUtils.validateWorld(player, task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - Material material; - int amount = (int) task.getConfigValue("amount"); - Object configBlock = task.getConfigValue("item"); - Object configData = task.getConfigValue("data"); - Object remove = task.getConfigValue("remove-items-when-complete"); - - ItemStack is; - if (configBlock instanceof ConfigurationSection) { - is = Quests.get().getItemStack("", (org.bukkit.configuration.ConfigurationSection) configBlock); - } else { - material = Material.getMaterial(String.valueOf(configBlock)); - - if (material == null) { - continue; - } - if (configData != null) { - is = new ItemStack(material, 1, ((Integer) configData).shortValue()); - } else { - is = new ItemStack(material, 1); - } - } - - if (player.getInventory().containsAtLeast(is, amount)) { - is.setAmount(amount); - taskProgress.setCompleted(true); - - if (remove != null && ((Boolean) remove)) { - player.getInventory().removeItem(is); - } - } - } - } - } - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/CitizensInteractTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/CitizensInteractTaskType.java deleted file mode 100644 index 6ecaa863..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/CitizensInteractTaskType.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types.dependent; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import net.citizensnpcs.api.event.NPCRightClickEvent; -import org.bukkit.ChatColor; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class CitizensInteractTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public CitizensInteractTaskType() { - super("citizens_interact", TaskUtils.TASK_ATTRIBUTION_STRING, "Interact with an NPC to complete the quest."); - this.creatorConfigValues.add(new ConfigValue("npc-name", true, "Name of the NPC.")); - this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - TaskUtils.configValidateExists(root + ".npc-name", config.get("npc-name"), problems, "npc-name", super.getType()); - TaskUtils.configValidateBoolean(root + ".remove-items-when-complete", config.get("remove-items-when-complete"), problems, true, "remove-items-when-complete", super.getType()); - return problems; - } - - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onNPCClick(NPCRightClickEvent event) { - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getClicker().getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!TaskUtils.validateWorld(event.getClicker(), task)) continue; - - if (!ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', String.valueOf(task.getConfigValue("npc-name")))).equals(ChatColor - .stripColor(ChatColor.translateAlternateColorCodes('&', event.getNPC().getName())))) { - return; - } - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - taskProgress.setCompleted(true); - } - } - } - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/EssentialsBalanceTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/EssentialsBalanceTaskType.java deleted file mode 100644 index 8503f1ed..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/EssentialsBalanceTaskType.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types.dependent; - -import com.earth2me.essentials.Essentials; -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import net.ess3.api.events.UserBalanceUpdateEvent; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.UUID; - -public class EssentialsBalanceTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public EssentialsBalanceTaskType() { - super("essentials_balance", TaskUtils.TASK_ATTRIBUTION_STRING, "Reach a set amount of money."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of money to reach.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) - TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, false, "amount"); - return problems; - } - - @Override - public void onStart(Quest quest, Task task, UUID playerUUID) { - Player player = Bukkit.getPlayer(playerUUID); - Essentials ess = (Essentials) Bukkit.getPluginManager().getPlugin("Essentials"); - if (player != null && player.isOnline() && ess != null) { - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(playerUUID); - QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile(); - QuestProgress questProgress = questProgressFile.getQuestProgress(quest); - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - int earningsNeeded = (int) task.getConfigValue("amount"); - BigDecimal money = ess.getUser(player).getMoney(); - taskProgress.setProgress(money); - if (money.compareTo(BigDecimal.valueOf(earningsNeeded)) > 0) { - taskProgress.setCompleted(true); - } - } - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onMoneyEarn(UserBalanceUpdateEvent event) { - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - int earningsNeeded = (int) task.getConfigValue("amount"); - - taskProgress.setProgress(event.getNewBalance()); - - if (event.getNewBalance().compareTo(BigDecimal.valueOf(earningsNeeded)) > 0) { - taskProgress.setCompleted(true); - } - } - } - } - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/EssentialsMoneyEarnTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/EssentialsMoneyEarnTaskType.java deleted file mode 100644 index c4d91525..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/EssentialsMoneyEarnTaskType.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types.dependent; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import net.ess3.api.events.UserBalanceUpdateEvent; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class EssentialsMoneyEarnTaskType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public EssentialsMoneyEarnTaskType() { - super("essentials_moneyearn", TaskUtils.TASK_ATTRIBUTION_STRING, "Earn a set amount of money."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of money to earn.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) - TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, false, "amount"); - return problems; - } - - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onMoneyEarn(UserBalanceUpdateEvent event) { - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - int earningsNeeded = (int) task.getConfigValue("amount"); - - BigDecimal current = (BigDecimal) taskProgress.getProgress(); - if (current == null) { - current = new BigDecimal(0); - } - BigDecimal newProgress = current.add(event.getNewBalance().subtract(event.getOldBalance())); - taskProgress.setProgress(newProgress); - - if (newProgress.compareTo(BigDecimal.valueOf(earningsNeeded)) > 0) { - taskProgress.setCompleted(true); - } - } - } - } - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/IridiumSkyblockValueType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/IridiumSkyblockValueType.java deleted file mode 100644 index 7eef802d..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/IridiumSkyblockValueType.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types.dependent; - -import com.iridium.iridiumskyblock.Island; -import com.iridium.iridiumskyblock.api.IslandWorthCalculatedEvent; -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.UUID; - -public final class IridiumSkyblockValueType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public IridiumSkyblockValueType() { - super("iridiumskyblock_value", TaskUtils.TASK_ATTRIBUTION_STRING, "Reach a certain island value for Iridium Skyblock."); - this.creatorConfigValues.add(new ConfigValue("value", true, "Minimum island value needed.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".value", config.get("value"), problems, "value", super.getType())) - TaskUtils.configValidateInt(root + ".value", config.get("value"), problems, false, false, "value"); - return problems; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onIslandLevel(IslandWorthCalculatedEvent event) { - Island island = event.getIsland(); - for (String player : island.members) { - UUID uuid; - try { - uuid = UUID.fromString(player); - } catch (Exception e) { - continue; - } - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(uuid); - if (qPlayer == null) { - continue; - } - - for (Quest quest : IridiumSkyblockValueType.super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(IridiumSkyblockValueType.super.getType())) { - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - int islandValueNeeded = (int) task.getConfigValue("value"); - - taskProgress.setProgress(event.getIslandWorth()); - - if (((double) taskProgress.getProgress()) >= islandValueNeeded) { - taskProgress.setCompleted(true); - } - } - } - } - } - - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/MythicMobsKillingType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/MythicMobsKillingType.java deleted file mode 100644 index 11421126..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/MythicMobsKillingType.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types.dependent; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import io.lumine.xikage.mythicmobs.api.bukkit.events.MythicMobDeathEvent; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class MythicMobsKillingType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public MythicMobsKillingType() { - super("mythicmobs_killing", TaskUtils.TASK_ATTRIBUTION_STRING, "Kill a set amount of a MythicMobs entity."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of mobs to be killed.")); - this.creatorConfigValues.add(new ConfigValue("name", true, "The 'internal name' of the MythicMob.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - TaskUtils.configValidateExists(root + ".name", config.get("name"), problems, "name", super.getType()); - if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) - TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); - return problems; - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onMobKill(MythicMobDeathEvent event) { - Entity killer = event.getKiller(); - Entity mob = event.getEntity(); - - if (mob == null || mob instanceof Player) { - return; - } - - if (killer == null) { - return; - } - - String mobName = event.getMobType().getInternalName(); - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(killer.getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!TaskUtils.validateWorld(killer.getWorld().getName(), task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - String configName = (String) task.getConfigValue("name"); - - if (!mobName.equals(configName)) { - return; - } - - int mobKillsNeeded = (int) task.getConfigValue("amount"); - - int progressKills; - if (taskProgress.getProgress() == null) { - progressKills = 0; - } else { - progressKills = (int) taskProgress.getProgress(); - } - - taskProgress.setProgress(progressKills + 1); - - if (((int) taskProgress.getProgress()) >= mobKillsNeeded) { - taskProgress.setCompleted(true); - } - } - } - } - } - -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/PlaceholderAPIEvaluateTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/PlaceholderAPIEvaluateTaskType.java deleted file mode 100644 index 58b45636..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/PlaceholderAPIEvaluateTaskType.java +++ /dev/null @@ -1,163 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types.dependent; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import me.clip.placeholderapi.PlaceholderAPI; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.scheduler.BukkitTask; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class PlaceholderAPIEvaluateTaskType extends TaskType { - - private final Quests plugin; - private BukkitTask poll; - private List creatorConfigValues = new ArrayList<>(); - - public PlaceholderAPIEvaluateTaskType(Quests plugin) { - super("placeholderapi_evaluate", TaskUtils.TASK_ATTRIBUTION_STRING, "Evaluate the result of a placeholder"); - this.plugin = plugin; - this.creatorConfigValues.add(new ConfigValue("placeholder", true, "The placeholder string (including %%).")); - this.creatorConfigValues.add(new ConfigValue("evaluates", true, "What it should evaluate to be marked as complete.")); - this.creatorConfigValues.add(new ConfigValue("operator", false, "Comparison method.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - TaskUtils.configValidateExists(root + ".placeholder", config.get("placeholder"), problems, "placeholder", super.getType()); - boolean evalExists = TaskUtils.configValidateExists(root + ".evaluates", config.get("evaluates"), problems, "evaluates", super.getType()); - - if (config.containsKey("operator")) { - String operatorStr = (String) config.get("operator"); - Operator operator = null; - try { - operator = Operator.valueOf(operatorStr); - } catch (IllegalArgumentException ex) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, - "Operator '" + operatorStr + "' does not exist.", root + ".operator")); - } - if (operator != null && evalExists) { - String evalStr = String.valueOf(config.get("evaluates")); - try { - Double.parseDouble(evalStr); - } catch (IllegalArgumentException ex) { - problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, - "Numeric operator specified, but placeholder evaluation '" + evalStr + "' is not numeric.", root + ".evaluates")); - } - } - } - return problems; - } - - @Override - public void onReady() { - this.poll = new BukkitRunnable() { - @Override - public void run() { - for (Player player : Bukkit.getOnlinePlayers()) { - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(player.getUniqueId()); - if (qPlayer == null) { - continue; - } - - for (Quest quest : PlaceholderAPIEvaluateTaskType.super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - for (Task task : quest.getTasksOfType(PlaceholderAPIEvaluateTaskType.super.getType())) { - if (!TaskUtils.validateWorld(player, task)) continue; - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - if (taskProgress.isCompleted()) { - continue; - } - String placeholder = (String) task.getConfigValue("placeholder"); - String evaluates = String.valueOf(task.getConfigValue("evaluates")); - String configOperator = (String) task.getConfigValue("operator"); - Operator operator = null; - if (configOperator != null) { - try { - operator = Operator.valueOf(configOperator); - } catch (IllegalArgumentException ignored) { } - } - if (placeholder != null && evaluates != null) { - double numericEvaluates = 0; - if (operator != null) { - try { - numericEvaluates = Double.parseDouble(evaluates); - } catch (NumberFormatException ex) { - continue; - } - } - - String evaluated = PlaceholderAPI.setPlaceholders(player, placeholder); - if (operator == null && evaluated.equals(evaluates)) { - taskProgress.setCompleted(true); - } else if (operator != null) { - double numericEvaluated; - try { - numericEvaluated = Double.parseDouble(evaluated); - } catch (NumberFormatException ex) { - continue; - } - switch (operator) { - case GREATER_THAN: - if (numericEvaluated > numericEvaluates) - taskProgress.setCompleted(true); - continue; - case LESS_THAN: - if (numericEvaluated < numericEvaluates) - taskProgress.setCompleted(true); - continue; - case GREATER_THAN_OR_EQUAL_TO: - if (numericEvaluated >= numericEvaluates) - taskProgress.setCompleted(true); - continue; - case LESS_THAN_OR_EQUAL_TO: - if (numericEvaluated <= numericEvaluates) - taskProgress.setCompleted(true); - continue; - } - } - } - - } - } - } - } - } - }.runTaskTimer(plugin, 30L, 30L); - } - - @Override - public void onDisable() { - if (this.poll != null) { - this.poll.cancel(); - } - } - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - enum Operator { - GREATER_THAN, - LESS_THAN, - GREATER_THAN_OR_EQUAL_TO, - LESS_THAN_OR_EQUAL_TO; - } -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/ShopGUIPlusBuyCertainTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/ShopGUIPlusBuyCertainTaskType.java deleted file mode 100644 index a8df4ab0..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/ShopGUIPlusBuyCertainTaskType.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types.dependent; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import net.brcdev.shopgui.event.ShopPreTransactionEvent; -import net.brcdev.shopgui.shop.ShopManager; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class ShopGUIPlusBuyCertainTaskType extends TaskType { - - public ShopGUIPlusBuyCertainTaskType() { - super("shopguiplus_buycertain", TaskUtils.TASK_ATTRIBUTION_STRING, "Purchase a given item from a ShopGUI+ shop"); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) - TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, false, "amount"); - TaskUtils.configValidateExists(root + ".id", config.get("id"), problems, "id", super.getType()); - return problems; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onMobKill(ShopPreTransactionEvent event) { - if (event.getShopAction() != ShopManager.ShopAction.BUY) return; - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!TaskUtils.validateWorld(event.getPlayer().getWorld().getName(), task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - String configName = (String) task.getConfigValue("id"); - - if (!event.getShopItem().getId().equals(configName)) { - return; - } - - int amountNeeded = (int) task.getConfigValue("amount"); - - int progressAmount; - if (taskProgress.getProgress() == null) { - progressAmount = 0; - } else { - progressAmount = (int) taskProgress.getProgress(); - } - - taskProgress.setProgress(progressAmount + event.getAmount()); - - if (((int) taskProgress.getProgress()) >= amountNeeded) { - taskProgress.setCompleted(true); - } - } - } - } - } -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/ShopGUIPlusSellCertainTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/ShopGUIPlusSellCertainTaskType.java deleted file mode 100644 index ee1276ec..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/ShopGUIPlusSellCertainTaskType.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types.dependent; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import net.brcdev.shopgui.event.ShopPreTransactionEvent; -import net.brcdev.shopgui.shop.ShopManager; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class ShopGUIPlusSellCertainTaskType extends TaskType { - - public ShopGUIPlusSellCertainTaskType() { - super("shopguiplus_sellcertain", TaskUtils.TASK_ATTRIBUTION_STRING, "Sell a given item from to a ShopGUI+ shop"); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) - TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, false, "amount"); - TaskUtils.configValidateExists(root + ".id", config.get("id"), problems, "id", super.getType()); - return problems; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onMobKill(ShopPreTransactionEvent event) { - if (event.getShopAction() != ShopManager.ShopAction.SELL || event.getShopAction() != ShopManager.ShopAction.SELL_ALL) return; - - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - if (!TaskUtils.validateWorld(event.getPlayer().getWorld().getName(), task)) continue; - - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - String configName = (String) task.getConfigValue("id"); - - if (!event.getShopItem().getId().equals(configName)) { - return; - } - - int amountNeeded = (int) task.getConfigValue("amount"); - - int progressAmount; - if (taskProgress.getProgress() == null) { - progressAmount = 0; - } else { - progressAmount = (int) taskProgress.getProgress(); - } - - taskProgress.setProgress(progressAmount + event.getAmount()); - - if (((int) taskProgress.getProgress()) >= amountNeeded) { - taskProgress.setCompleted(true); - } - } - } - } - } -} diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/uSkyBlockLevelType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/uSkyBlockLevelType.java deleted file mode 100644 index 0aa58d84..00000000 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/uSkyBlockLevelType.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.leonardobishop.quests.quests.tasktypes.types.dependent; - -import com.leonardobishop.quests.QuestsConfigLoader; -import com.leonardobishop.quests.api.QuestsAPI; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.player.questprogressfile.TaskProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; -import com.leonardobishop.quests.quests.tasktypes.TaskType; -import com.leonardobishop.quests.quests.tasktypes.TaskUtils; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import us.talabrek.ultimateskyblock.api.event.uSkyBlockScoreChangedEvent; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public final class uSkyBlockLevelType extends TaskType { - - private List creatorConfigValues = new ArrayList<>(); - - public uSkyBlockLevelType() { - super("uskyblock_level", TaskUtils.TASK_ATTRIBUTION_STRING, "Reach a certain island level for uSkyBlock."); - this.creatorConfigValues.add(new ConfigValue("level", true, "Minimum island level needed.")); - } - - @Override - public List detectProblemsInConfig(String root, HashMap config) { - ArrayList problems = new ArrayList<>(); - if (TaskUtils.configValidateExists(root + ".level", config.get("level"), problems, "level", super.getType())) - TaskUtils.configValidateInt(root + ".level", config.get("level"), problems, false, false, "level"); - return problems; - } - - - @Override - public List getCreatorConfigValues() { - return creatorConfigValues; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onIslandLevel(uSkyBlockScoreChangedEvent event) { - QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); - if (qPlayer == null) { - return; - } - - for (Quest quest : super.getRegisteredQuests()) { - if (qPlayer.hasStartedQuest(quest)) { - QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); - - for (Task task : quest.getTasksOfType(super.getType())) { - TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); - - if (taskProgress.isCompleted()) { - continue; - } - - double islandLevelNeeded = (double) (int) task.getConfigValue("level"); - - taskProgress.setProgress(event.getScore().getScore()); - - if (((double) taskProgress.getProgress()) >= islandLevelNeeded) { - taskProgress.setCompleted(true); - } - } - } - } - } - -} -- cgit v1.2.3-70-g09d2