diff --git a/src/main/java/me/knighthat/apis/events/BlockEvent.java b/src/main/java/me/knighthat/apis/events/BlockEvent.java new file mode 100644 index 0000000..7b55cd4 --- /dev/null +++ b/src/main/java/me/knighthat/apis/events/BlockEvent.java @@ -0,0 +1,34 @@ +package me.knighthat.apis.events; + +import lombok.Getter; +import lombok.NonNull; +import me.wonka01.ServerQuests.ServerQuests; +import me.wonka01.ServerQuests.enums.ObjectiveType; +import org.bukkit.block.Block; +import org.bukkit.entity.HumanEntity; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.metadata.MetadataValue; + +@Getter +public abstract class BlockEvent extends MaterialEvent { + + private final @NonNull String state; + private final @NonNull MetadataValue metadata; + + protected BlockEvent(ServerQuests plugin, @NonNull ObjectiveType objectiveType, @NonNull String state) { + + super(plugin, objectiveType); + this.state = state; + this.metadata = new FixedMetadataValue(plugin, true); + } + + protected void attemptToUpdate(@NonNull org.bukkit.event.block.BlockEvent event, @NonNull HumanEntity breaker) { + + if (!event.getBlock().hasMetadata(state)) { + + Block block = event.getBlock(); + super.attemptToUpdate(breaker, block.getType()); + block.setMetadata(state, metadata); + } + } +} diff --git a/src/main/java/me/knighthat/apis/events/EntityEvent.java b/src/main/java/me/knighthat/apis/events/EntityEvent.java new file mode 100644 index 0000000..9b6a1d0 --- /dev/null +++ b/src/main/java/me/knighthat/apis/events/EntityEvent.java @@ -0,0 +1,40 @@ +package me.knighthat.apis.events; + +import lombok.NonNull; +import me.knighthat.apis.utils.Utils; +import me.wonka01.ServerQuests.ServerQuests; +import me.wonka01.ServerQuests.enums.ObjectiveType; +import me.wonka01.ServerQuests.questcomponents.QuestController; +import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Range; + +import java.util.List; + +public abstract class EntityEvent extends EventBase { + + protected EntityEvent(ServerQuests plugin, @NonNull ObjectiveType objectiveType) { + super(plugin, objectiveType); + } + + protected boolean attemptToUpdate(@NonNull HumanEntity player, @NonNull V value) { + return attemptToUpdate(player, value, 1); + } + + protected boolean attemptToUpdate(@NonNull HumanEntity player, @NonNull V value, + @Range(from = 0, to = Long.MAX_VALUE) int amount) { + + for (QuestController ctrl : super.getControllers()) { + + List entities = ctrl.getEventConstraints().getMobNames(); + if (entities.isEmpty() || Utils.contains(entities, value)) { + + super.update(ctrl, (Player) player, amount); + return true; + } + } + + return false; + } +} diff --git a/src/main/java/me/knighthat/apis/events/EventBase.java b/src/main/java/me/knighthat/apis/events/EventBase.java new file mode 100644 index 0000000..7604bc7 --- /dev/null +++ b/src/main/java/me/knighthat/apis/events/EventBase.java @@ -0,0 +1,64 @@ +package me.knighthat.apis.events; + +import lombok.Getter; +import lombok.NonNull; +import me.knighthat.apis.utils.Utils; +import me.wonka01.ServerQuests.ServerQuests; +import me.wonka01.ServerQuests.enums.ObjectiveType; +import me.wonka01.ServerQuests.questcomponents.ActiveQuests; +import me.wonka01.ServerQuests.questcomponents.QuestController; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.Listener; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Getter +public abstract class EventBase implements Listener { + + private final ServerQuests plugin; + private final ObjectiveType objectiveType; + + protected EventBase(ServerQuests plugin, @NonNull ObjectiveType objectiveType) { + + this.plugin = plugin; + this.objectiveType = objectiveType; + + plugin.getServer().getPluginManager().registerEvents(this, plugin); + } + + public abstract void event(T event); + + protected @NonNull ActiveQuests getActiveQuests() { + return plugin.config().getActiveQuests(); + } + + protected @NonNull List getControllers() { + + Stream result = getActiveQuests().getActiveQuestsList().stream(); + return result.filter(ins -> ins.getObjective().equals(this.objectiveType)).collect(Collectors.toList()); + } + + protected void update(@NonNull QuestController controller, @NonNull Player player, double amount) { + + if (!isWorldAllowed(controller, player.getWorld())) return; + + if (controller.updateQuest(amount, player)) + controller.endQuest(); + } + + private boolean isWorldAllowed(@NonNull QuestController controller, @NonNull World world) { + + List worlds = controller.getEventConstraints().getWorlds(); + return worlds.isEmpty() || Utils.contains(worlds, world.getName()); + } + + protected void update(@NonNull Player player) { + + for (QuestController ctrl : getControllers()) + update(ctrl, player, 1); + } +} diff --git a/src/main/java/me/knighthat/apis/events/MaterialEvent.java b/src/main/java/me/knighthat/apis/events/MaterialEvent.java new file mode 100644 index 0000000..46d69a5 --- /dev/null +++ b/src/main/java/me/knighthat/apis/events/MaterialEvent.java @@ -0,0 +1,40 @@ +package me.knighthat.apis.events; + +import lombok.NonNull; +import me.knighthat.apis.utils.Utils; +import me.wonka01.ServerQuests.ServerQuests; +import me.wonka01.ServerQuests.enums.ObjectiveType; +import me.wonka01.ServerQuests.questcomponents.QuestController; +import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Range; + +import java.util.List; + +public abstract class MaterialEvent extends EventBase { + + protected MaterialEvent(ServerQuests plugin, @NonNull ObjectiveType objectiveType) { + super(plugin, objectiveType); + } + + protected boolean attemptToUpdate(@NonNull HumanEntity player, @NonNull V value) { + return attemptToUpdate(player, value, 1); + } + + protected boolean attemptToUpdate(@NonNull HumanEntity player, @NonNull V value, + @Range(from = 0, to = Long.MAX_VALUE) int amount) { + + for (QuestController ctrl : super.getControllers()) { + + List materials = ctrl.getEventConstraints().getMaterialNames(); + if (materials.isEmpty() || Utils.contains(materials, value)) { + + super.update(ctrl, (Player) player, amount); + return true; + } + } + + return false; + } +} diff --git a/src/main/java/me/knighthat/apis/menus/Menu.java b/src/main/java/me/knighthat/apis/menus/Menu.java index 73cdefc..46e8997 100644 --- a/src/main/java/me/knighthat/apis/menus/Menu.java +++ b/src/main/java/me/knighthat/apis/menus/Menu.java @@ -3,11 +3,11 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.NonNull; +import me.knighthat.apis.utils.Colorization; import me.wonka01.ServerQuests.ServerQuests; import me.wonka01.ServerQuests.questcomponents.ActiveQuests; import me.wonka01.ServerQuests.questcomponents.QuestController; import me.wonka01.ServerQuests.questcomponents.QuestData; -import me.knighthat.apis.utils.Colorization; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -45,6 +45,7 @@ protected Menu(ServerQuests plugin, @NonNull Player owner, @NonNull String title String title = plugin.messages().string(titlePath); this.inventory = Bukkit.createInventory(this, slots, title); + } protected void setBorder() { diff --git a/src/main/java/me/knighthat/apis/menus/MenuEvents.java b/src/main/java/me/knighthat/apis/menus/MenuEvents.java index 658d1a8..d3b44aa 100644 --- a/src/main/java/me/knighthat/apis/menus/MenuEvents.java +++ b/src/main/java/me/knighthat/apis/menus/MenuEvents.java @@ -12,15 +12,15 @@ public class MenuEvents implements Listener { @EventHandler public void inventoryClickEvent(InventoryClickEvent event) { - Inventory topInventory = event.getView().getTopInventory(); - if (topInventory.getHolder() instanceof Menu) { + Inventory clicked = event.getClickedInventory(); - Menu menu = (Menu) topInventory.getHolder(); + if (clicked.getHolder() instanceof Menu) { + + Menu menu = (Menu) clicked.getHolder(); event.setCancelled(true); - if (event.getCurrentItem() != null) - menu.onItemClick(event); + menu.onItemClick(event); } } diff --git a/src/main/java/me/wonka01/ServerQuests/ServerQuests.java b/src/main/java/me/wonka01/ServerQuests/ServerQuests.java index 6a5cea9..5570394 100644 --- a/src/main/java/me/wonka01/ServerQuests/ServerQuests.java +++ b/src/main/java/me/wonka01/ServerQuests/ServerQuests.java @@ -7,13 +7,16 @@ import me.knighthat.apis.menus.MenuEvents; import me.wonka01.ServerQuests.commands.CommandManager; import me.wonka01.ServerQuests.configuration.JsonQuestSave; -import me.wonka01.ServerQuests.events.*; -import me.wonka01.ServerQuests.questcomponents.ActiveQuests; +import me.wonka01.ServerQuests.events.entities.*; +import me.wonka01.ServerQuests.events.materials.ConsumeEvent; +import me.wonka01.ServerQuests.events.materials.CraftingEvent; +import me.wonka01.ServerQuests.events.materials.EnchantEvent; +import me.wonka01.ServerQuests.events.materials.blocks.BreakEvent; +import me.wonka01.ServerQuests.events.materials.blocks.PlaceEvent; import me.wonka01.ServerQuests.questcomponents.bossbar.BarManager; import me.wonka01.placeholders.CommunityQuestsPlaceholders; import net.milkbowl.vault.economy.Economy; import org.bukkit.Bukkit; - import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.java.JavaPlugin; @@ -79,20 +82,22 @@ private boolean setupEconomy() { } private void registerQuestEvents() { - ActiveQuests activeQuests = config.getActiveQuests(); + + new MobKillEvent(this); + new BreakEvent(this); + new CraftingEvent(this); + new KillPlayerEvent(this); + new MilkingEvent(this); + new PlaceEvent(this); + new ProjectileKillEvent(this); + new ShearEvent(this); + new TameEvent(this); + new ConsumeEvent(this); + new CatchFishEvent(this); + new EnchantEvent(this); + new NPCInteractEvent(this); + getServer().getPluginManager().registerEvents(new BarManager(), this); - getServer().getPluginManager().registerEvents(new BreakEvent(activeQuests), this); - getServer().getPluginManager().registerEvents(new CatchFishEvent(activeQuests), this); - getServer().getPluginManager().registerEvents(new KillPlayerEvent(activeQuests), this); - getServer().getPluginManager().registerEvents(new MobKillEvent(activeQuests), this); - getServer().getPluginManager().registerEvents(new ProjectileKillEvent(activeQuests), this); - getServer().getPluginManager().registerEvents(new PlaceEvent(activeQuests), this); - getServer().getPluginManager().registerEvents(new ShearEvent(activeQuests), this); - getServer().getPluginManager().registerEvents(new TameEvent(activeQuests), this); - getServer().getPluginManager().registerEvents(new MilkCowEvent(activeQuests), this); - getServer().getPluginManager().registerEvents(new CraftItemQuestEvent(activeQuests), this); - getServer().getPluginManager().registerEvents(new ConsumeItemQuestEvent(activeQuests), this); - getServer().getPluginManager().registerEvents(new EnchantItemQuestEvent(activeQuests), this); } private void registerGuiEvents() { diff --git a/src/main/java/me/wonka01/ServerQuests/commands/MoneyCommand.java b/src/main/java/me/wonka01/ServerQuests/commands/MoneyCommand.java index ec8e4c3..1a67fc3 100644 --- a/src/main/java/me/wonka01/ServerQuests/commands/MoneyCommand.java +++ b/src/main/java/me/wonka01/ServerQuests/commands/MoneyCommand.java @@ -3,11 +3,18 @@ import lombok.NonNull; import me.knighthat.apis.commands.PluginCommand; import me.wonka01.ServerQuests.ServerQuests; -import me.wonka01.ServerQuests.events.MoneyQuest; +import me.wonka01.ServerQuests.enums.ObjectiveType; import me.wonka01.ServerQuests.questcomponents.ActiveQuests; +import me.wonka01.ServerQuests.questcomponents.QuestController; +import net.milkbowl.vault.economy.Economy; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Range; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class MoneyCommand extends PluginCommand { @@ -36,10 +43,9 @@ public void execute(@NonNull CommandSender sender, @NotNull @NonNull String[] ar } try { - double money = Double.parseDouble(args[1]); - MoneyQuest moneyQuest = new MoneyQuest(ActiveQuests.getActiveQuestsInstance(), getPlugin().getEconomy()); - if (!moneyQuest.tryAddItemsToQuest(money, player)) { + double money = Double.parseDouble(args[1]); + if (!deposit(money, player)) { String noActiveDonateQuests = getPlugin().messages().message("noActiveDonateQuests"); player.sendMessage(noActiveDonateQuests); } @@ -48,4 +54,42 @@ public void execute(@NonNull CommandSender sender, @NotNull @NonNull String[] ar player.sendMessage(message); } } + + private boolean deposit(@Range(from = 0, to = Long.MAX_VALUE) double amount, @NonNull Player player) { + + Economy economy = getPlugin().getEconomy(); + boolean canWithdraw = false; + double money = amount; + + for (QuestController ctrl : this.getControllers()) { + + int goal = ctrl.getQuestData().getQuestGoal(); + double completed = ctrl.getQuestData().getAmountCompleted(); + + if (goal > 0 && (completed + amount) > goal) { + + money = amount - completed - goal; + economy.depositPlayer(player, completed + money - goal); + } + + canWithdraw = true; + + if (ctrl.updateQuest(money, player)) + ctrl.endQuest(); + } + + if (canWithdraw) + economy.withdrawPlayer(player, money); + + + return canWithdraw; + } + + private @NonNull List getControllers() { + + ActiveQuests activeQuests = ActiveQuests.getActiveQuestsInstance(); + Stream result = activeQuests.getActiveQuestsList().stream(); + result = result.filter(ins -> ins.getObjective().equals(ObjectiveType.GIVE_MONEY)); + return result.collect(Collectors.toList()); + } } diff --git a/src/main/java/me/wonka01/ServerQuests/enums/ObjectiveType.java b/src/main/java/me/wonka01/ServerQuests/enums/ObjectiveType.java index 84ebe4f..10d9815 100644 --- a/src/main/java/me/wonka01/ServerQuests/enums/ObjectiveType.java +++ b/src/main/java/me/wonka01/ServerQuests/enums/ObjectiveType.java @@ -13,7 +13,7 @@ public enum ObjectiveType { PROJ_KILL("projectilekill", Material.BOW), BLOCK_PLACE("blockplace", Material.DIRT), SHEAR("shear", Material.SHEARS), - TAME("team", Material.BONE), + TAME("tame", Material.BONE), GUI("donate", Material.MILK_BUCKET), MILK_COW("milkcow", Material.CHEST), CRAFT_ITEM("craftitem", Material.CHAINMAIL_HELMET), diff --git a/src/main/java/me/wonka01/ServerQuests/events/BreakEvent.java b/src/main/java/me/wonka01/ServerQuests/events/BreakEvent.java deleted file mode 100644 index f7f8c38..0000000 --- a/src/main/java/me/wonka01/ServerQuests/events/BreakEvent.java +++ /dev/null @@ -1,45 +0,0 @@ -package me.wonka01.ServerQuests.events; - -import me.knighthat.apis.utils.Utils; -import me.wonka01.ServerQuests.ServerQuests; -import me.wonka01.ServerQuests.enums.ObjectiveType; -import me.wonka01.ServerQuests.questcomponents.ActiveQuests; -import me.wonka01.ServerQuests.questcomponents.QuestController; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.metadata.FixedMetadataValue; -import org.bukkit.metadata.MetadataValue; -import org.bukkit.plugin.java.JavaPlugin; - -import java.util.List; - -public class BreakEvent extends QuestListener implements Listener { - - private final String BROKEN = "BROKEN"; - private final MetadataValue meta = new FixedMetadataValue(JavaPlugin.getPlugin(ServerQuests.class), true); - - - public BreakEvent(ActiveQuests activeQuests) { - super(activeQuests); - } - - @EventHandler - public void onBlockBreakEvent(BlockBreakEvent event) { - if (event.getBlock().hasMetadata(BROKEN)) { - return; - } - - - List controllers = tryGetControllersOfEventType(ObjectiveType.BLOCK_BREAK); - for (QuestController controller : controllers) { - List materials = controller.getEventConstraints().getMaterialNames(); - - if (materials.isEmpty() || Utils.contains(materials, event.getBlock().getType())) { - event.getBlock().setMetadata(BROKEN, meta); - updateQuest(controller, event.getPlayer(), 1); - break; - } - } - } -} diff --git a/src/main/java/me/wonka01/ServerQuests/events/CatchFishEvent.java b/src/main/java/me/wonka01/ServerQuests/events/CatchFishEvent.java deleted file mode 100644 index a747a86..0000000 --- a/src/main/java/me/wonka01/ServerQuests/events/CatchFishEvent.java +++ /dev/null @@ -1,32 +0,0 @@ -package me.wonka01.ServerQuests.events; - -import me.knighthat.apis.utils.Utils; -import me.wonka01.ServerQuests.enums.ObjectiveType; -import me.wonka01.ServerQuests.questcomponents.ActiveQuests; -import me.wonka01.ServerQuests.questcomponents.QuestController; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerFishEvent; - -import java.util.List; - -public class CatchFishEvent extends QuestListener implements Listener { - - public CatchFishEvent(ActiveQuests activeQuests) { - super(activeQuests); - } - - @EventHandler - public void onCatchFish(PlayerFishEvent event) { - if (event.getState() == PlayerFishEvent.State.CAUGHT_FISH) { - List controllers = tryGetControllersOfEventType(ObjectiveType.CATCH_FISH); - String fishName = event.getCaught().getName(); - - for (QuestController controller : controllers) { - List entities = controller.getEventConstraints().getMobNames(); - if(entities.isEmpty() || Utils.contains(entities, fishName)) - updateQuest(controller, event.getPlayer(), 1); - } - } - } -} diff --git a/src/main/java/me/wonka01/ServerQuests/events/ConsumeItemQuestEvent.java b/src/main/java/me/wonka01/ServerQuests/events/ConsumeItemQuestEvent.java deleted file mode 100644 index acdeced..0000000 --- a/src/main/java/me/wonka01/ServerQuests/events/ConsumeItemQuestEvent.java +++ /dev/null @@ -1,32 +0,0 @@ -package me.wonka01.ServerQuests.events; - -import me.knighthat.apis.utils.Utils; -import me.wonka01.ServerQuests.enums.ObjectiveType; -import me.wonka01.ServerQuests.questcomponents.ActiveQuests; -import me.wonka01.ServerQuests.questcomponents.QuestController; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerItemConsumeEvent; - -import java.util.List; - -public class ConsumeItemQuestEvent extends QuestListener implements Listener { - - public ConsumeItemQuestEvent(ActiveQuests activeQuests) { - super(activeQuests); - } - - @EventHandler - public void onConsumeItem(PlayerItemConsumeEvent event) { - Player player = event.getPlayer(); - - List controllers = tryGetControllersOfEventType(ObjectiveType.CONSUME_ITEM); - for (QuestController controller : controllers) { - List materials = controller.getEventConstraints().getMaterialNames(); - - if (materials.isEmpty() || Utils.contains(materials, event.getItem().getType())) - updateQuest(controller, player, 1); - } - } -} diff --git a/src/main/java/me/wonka01/ServerQuests/events/CraftItemQuestEvent.java b/src/main/java/me/wonka01/ServerQuests/events/CraftItemQuestEvent.java deleted file mode 100644 index 5abaa5c..0000000 --- a/src/main/java/me/wonka01/ServerQuests/events/CraftItemQuestEvent.java +++ /dev/null @@ -1,34 +0,0 @@ -package me.wonka01.ServerQuests.events; - -import me.knighthat.apis.utils.Utils; -import me.wonka01.ServerQuests.enums.ObjectiveType; -import me.wonka01.ServerQuests.questcomponents.ActiveQuests; -import me.wonka01.ServerQuests.questcomponents.QuestController; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.CraftItemEvent; - -import java.util.List; - -public class CraftItemQuestEvent extends QuestListener implements Listener { - - public CraftItemQuestEvent(ActiveQuests activeQuests) { - super(activeQuests); - } - - @EventHandler - public void onCraftItem(CraftItemEvent event) { - Player player = (Player) event.getWhoClicked(); - - int amount = event.getRecipe().getResult().getAmount(); - - List controllers = tryGetControllersOfEventType(ObjectiveType.CRAFT_ITEM); - for (QuestController controller : controllers) { - List materials = controller.getEventConstraints().getMaterialNames(); - - if (materials.isEmpty() || Utils.contains(materials, event.getRecipe().getResult().getType())) - updateQuest(controller, player, amount); - } - } -} diff --git a/src/main/java/me/wonka01/ServerQuests/events/EnchantItemQuestEvent.java b/src/main/java/me/wonka01/ServerQuests/events/EnchantItemQuestEvent.java deleted file mode 100644 index 527c9b0..0000000 --- a/src/main/java/me/wonka01/ServerQuests/events/EnchantItemQuestEvent.java +++ /dev/null @@ -1,35 +0,0 @@ -package me.wonka01.ServerQuests.events; - -import me.knighthat.apis.utils.Utils; -import me.wonka01.ServerQuests.enums.ObjectiveType; -import me.wonka01.ServerQuests.questcomponents.ActiveQuests; -import me.wonka01.ServerQuests.questcomponents.QuestController; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.enchantment.EnchantItemEvent; - -import java.util.List; - -public class EnchantItemQuestEvent extends QuestListener implements Listener { - - public EnchantItemQuestEvent(ActiveQuests activeQuests) { - super(activeQuests); - } - - @EventHandler - public void onEnchantItem(EnchantItemEvent event) { - Player player = event.getEnchanter(); - - String materialName = event.getItem().getType().toString(); - - List controllers = tryGetControllersOfEventType(ObjectiveType.ENCHANT_ITEM); - for (QuestController controller : controllers) { - List materials = controller.getEventConstraints().getMaterialNames(); - - if (materials.isEmpty() || Utils.contains(materials, materialName)) { - updateQuest(controller, player, 1); - } - } - } -} diff --git a/src/main/java/me/wonka01/ServerQuests/events/GuiEvent.java b/src/main/java/me/wonka01/ServerQuests/events/GuiEvent.java deleted file mode 100644 index d69f986..0000000 --- a/src/main/java/me/wonka01/ServerQuests/events/GuiEvent.java +++ /dev/null @@ -1,40 +0,0 @@ -package me.wonka01.ServerQuests.events; - -import me.knighthat.apis.utils.Utils; -import me.wonka01.ServerQuests.enums.ObjectiveType; -import me.wonka01.ServerQuests.questcomponents.ActiveQuests; -import me.wonka01.ServerQuests.questcomponents.QuestController; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -import java.util.List; - -public class GuiEvent extends QuestListener { - - public GuiEvent(ActiveQuests activeQuests) { - super(activeQuests); - } - - public boolean tryAddItemsToQuest(ItemStack itemsToAdd, Player player) { - List controllers = tryGetControllersOfEventType(ObjectiveType.GUI); - boolean isItemUsed = false; - for (QuestController controller : controllers) { - - List materials = controller.getEventConstraints().getMaterialNames(); - int goal = controller.getQuestData().getQuestGoal(); - int completed = controller.getQuestData().getQuestGoal(); - - if (materials.isEmpty() || Utils.contains(materials, itemsToAdd.getType())) { - if (goal > 0 && completed + itemsToAdd.getAmount() > goal) { - int difference = completed + itemsToAdd.getAmount() - goal; - ItemStack itemsToReturn = new ItemStack(itemsToAdd.getType(), difference); - player.getInventory().addItem(itemsToReturn); - } - - updateQuest(controller, player, itemsToAdd.getAmount()); - isItemUsed = true; - } - } - return isItemUsed; - } -} diff --git a/src/main/java/me/wonka01/ServerQuests/events/KillPlayerEvent.java b/src/main/java/me/wonka01/ServerQuests/events/KillPlayerEvent.java deleted file mode 100644 index 877ac01..0000000 --- a/src/main/java/me/wonka01/ServerQuests/events/KillPlayerEvent.java +++ /dev/null @@ -1,32 +0,0 @@ -package me.wonka01.ServerQuests.events; - -import me.wonka01.ServerQuests.enums.ObjectiveType; -import me.wonka01.ServerQuests.questcomponents.ActiveQuests; -import me.wonka01.ServerQuests.questcomponents.QuestController; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.PlayerDeathEvent; - -import java.util.List; - -public class KillPlayerEvent extends QuestListener implements Listener { - - public KillPlayerEvent(ActiveQuests activeQuests) { - super(activeQuests); - } - - @EventHandler - public void onKillPlayer(PlayerDeathEvent event) { - - Player killer = event.getEntity().getKiller(); - if (killer == null) { - return; - } - - List controllers = tryGetControllersOfEventType(ObjectiveType.PLAYER_KILL); - for (QuestController controller : controllers) { - updateQuest(controller, killer, 1); - } - } -} diff --git a/src/main/java/me/wonka01/ServerQuests/events/MilkCowEvent.java b/src/main/java/me/wonka01/ServerQuests/events/MilkCowEvent.java deleted file mode 100644 index e32fead..0000000 --- a/src/main/java/me/wonka01/ServerQuests/events/MilkCowEvent.java +++ /dev/null @@ -1,34 +0,0 @@ -package me.wonka01.ServerQuests.events; - -import me.wonka01.ServerQuests.enums.ObjectiveType; -import me.wonka01.ServerQuests.questcomponents.ActiveQuests; -import me.wonka01.ServerQuests.questcomponents.QuestController; -import org.bukkit.Material; -import org.bukkit.entity.Cow; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerInteractEntityEvent; - -import java.util.List; - -public class MilkCowEvent extends QuestListener implements Listener { - - public MilkCowEvent(ActiveQuests activeQuests) { - super(activeQuests); - } - - @EventHandler - public void onPlayerMilkCow(PlayerInteractEntityEvent event) { - Player player = event.getPlayer(); - Entity cow = event.getRightClicked(); - if (!(cow instanceof Cow) || !(player.getInventory().getItemInMainHand().getType().equals(Material.BUCKET))) { - return; - } - List controllers = tryGetControllersOfEventType(ObjectiveType.MILK_COW); - for (QuestController controller : controllers) { - updateQuest(controller, player, 1); - } - } -} diff --git a/src/main/java/me/wonka01/ServerQuests/events/MobKillEvent.java b/src/main/java/me/wonka01/ServerQuests/events/MobKillEvent.java deleted file mode 100644 index 4158615..0000000 --- a/src/main/java/me/wonka01/ServerQuests/events/MobKillEvent.java +++ /dev/null @@ -1,37 +0,0 @@ -package me.wonka01.ServerQuests.events; - -import me.knighthat.apis.utils.Utils; -import me.wonka01.ServerQuests.enums.ObjectiveType; -import me.wonka01.ServerQuests.questcomponents.ActiveQuests; -import me.wonka01.ServerQuests.questcomponents.QuestController; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDeathEvent; - -import java.util.List; - -public class MobKillEvent extends QuestListener implements Listener { - - public MobKillEvent(ActiveQuests activeQuests) { - super(activeQuests); - } - - @EventHandler - public void OnPlayerKillMob(EntityDeathEvent event) { - - LivingEntity entity = event.getEntity(); - Player killer = entity.getKiller(); - if (killer == null) { - return; - } - - List controllers = tryGetControllersOfEventType(ObjectiveType.MOB_KILL); - for (QuestController controller : controllers) { - List mobTypes = controller.getEventConstraints().getMobNames(); - if(mobTypes.isEmpty() || Utils.contains(mobTypes, entity.getType())) - updateQuest(controller, killer, 1); - } - } -} diff --git a/src/main/java/me/wonka01/ServerQuests/events/MoneyQuest.java b/src/main/java/me/wonka01/ServerQuests/events/MoneyQuest.java deleted file mode 100644 index 3443a6d..0000000 --- a/src/main/java/me/wonka01/ServerQuests/events/MoneyQuest.java +++ /dev/null @@ -1,40 +0,0 @@ -package me.wonka01.ServerQuests.events; - -import me.wonka01.ServerQuests.enums.ObjectiveType; -import me.wonka01.ServerQuests.questcomponents.ActiveQuests; -import me.wonka01.ServerQuests.questcomponents.QuestController; -import net.milkbowl.vault.economy.Economy; -import org.bukkit.entity.Player; - -import java.util.List; - -public class MoneyQuest extends QuestListener { - private Economy economy; - public MoneyQuest(ActiveQuests activeQuests, Economy economy) { - super(activeQuests); - this.economy = economy; - } - - public boolean tryAddItemsToQuest(double money, Player player) { - List controllers = tryGetControllersOfEventType(ObjectiveType.GIVE_MONEY); - boolean hasMoneyQuest = false; - double amountToAdd = money; - - for (QuestController controller : controllers) { - int goal = controller.getQuestData().getQuestGoal(); - double completed = controller.getQuestData().getAmountCompleted(); - if (goal > 0 && completed + (int)money > goal) { - amountToAdd = money - completed + goal; - double difference = completed + money - goal; - economy.depositPlayer(player, difference); - } - - updateQuest(controller, player, amountToAdd); - hasMoneyQuest = true; - } - if(hasMoneyQuest) { - economy.withdrawPlayer(player, amountToAdd); - } - return hasMoneyQuest; - } -} diff --git a/src/main/java/me/wonka01/ServerQuests/events/NPCInteractEvent.java b/src/main/java/me/wonka01/ServerQuests/events/NPCInteractEvent.java deleted file mode 100644 index 198a9ed..0000000 --- a/src/main/java/me/wonka01/ServerQuests/events/NPCInteractEvent.java +++ /dev/null @@ -1,16 +0,0 @@ -package me.wonka01.ServerQuests.events; - -import me.wonka01.ServerQuests.enums.ObjectiveType; -import me.wonka01.ServerQuests.questcomponents.ActiveQuests; -import org.bukkit.event.Listener; - -public class NPCInteractEvent extends QuestListener implements Listener { - - private final ObjectiveType TYPE = ObjectiveType.MOB_KILL; - - public NPCInteractEvent(ActiveQuests activeQuests) { - - super(activeQuests); - } - -} diff --git a/src/main/java/me/wonka01/ServerQuests/events/PlaceEvent.java b/src/main/java/me/wonka01/ServerQuests/events/PlaceEvent.java deleted file mode 100644 index 6351c5c..0000000 --- a/src/main/java/me/wonka01/ServerQuests/events/PlaceEvent.java +++ /dev/null @@ -1,44 +0,0 @@ -package me.wonka01.ServerQuests.events; - -import me.knighthat.apis.utils.Utils; -import me.wonka01.ServerQuests.ServerQuests; -import me.wonka01.ServerQuests.enums.ObjectiveType; -import me.wonka01.ServerQuests.questcomponents.ActiveQuests; -import me.wonka01.ServerQuests.questcomponents.QuestController; -import org.bukkit.block.Block; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.metadata.FixedMetadataValue; -import org.bukkit.metadata.MetadataValue; -import org.bukkit.plugin.java.JavaPlugin; - -import java.util.List; - - -public class PlaceEvent extends QuestListener implements Listener { - - private final String PLACED = "PLACED"; - private final MetadataValue meta = new FixedMetadataValue(JavaPlugin.getPlugin(ServerQuests.class), true); - - public PlaceEvent(ActiveQuests activeQuests) { - super(activeQuests); - } - - @EventHandler - public void onBlockPlace(BlockPlaceEvent event) { - Block block = event.getBlock(); - if (block.hasMetadata(PLACED)) { - return; - } - - List controllers = tryGetControllersOfEventType(ObjectiveType.BLOCK_PLACE); - for (QuestController controller : controllers) { - List materials = controller.getEventConstraints().getMaterialNames(); - if (materials.isEmpty() || Utils.contains(materials, block.getType())) { - updateQuest(controller, event.getPlayer(), 1); - block.setMetadata(PLACED, meta); - } - } - } -} diff --git a/src/main/java/me/wonka01/ServerQuests/events/ProjectileKillEvent.java b/src/main/java/me/wonka01/ServerQuests/events/ProjectileKillEvent.java deleted file mode 100644 index b95b5b8..0000000 --- a/src/main/java/me/wonka01/ServerQuests/events/ProjectileKillEvent.java +++ /dev/null @@ -1,48 +0,0 @@ -package me.wonka01.ServerQuests.events; - -import me.knighthat.apis.utils.Utils; -import me.wonka01.ServerQuests.enums.ObjectiveType; -import me.wonka01.ServerQuests.questcomponents.ActiveQuests; -import me.wonka01.ServerQuests.questcomponents.QuestController; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.entity.Projectile; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDeathEvent; - -import java.util.List; - -public class ProjectileKillEvent extends QuestListener implements Listener { - - public ProjectileKillEvent(ActiveQuests activeQuests) { - super(activeQuests); - } - - @EventHandler - public void onProjectileKill(EntityDeathEvent event) { - if (!(event.getEntity().getLastDamageCause() instanceof EntityDamageByEntityEvent)) { - return; - } - - EntityDamageByEntityEvent damageEvent = (EntityDamageByEntityEvent) event.getEntity().getLastDamageCause(); - Entity damager = damageEvent.getDamager(); - - if (damager instanceof Projectile) { - Projectile projectile = (Projectile) damager; - if (projectile.getShooter() != null && projectile.getShooter() instanceof Player) { - Player player = (Player) projectile.getShooter(); - - List controllers = tryGetControllersOfEventType(ObjectiveType.PROJ_KILL); - for (QuestController controller : controllers) { - List entities = controller.getEventConstraints().getMobNames(); - if(entities.isEmpty() || Utils.contains(entities, event.getEntity().getType())) - updateQuest(controller, player, 1); - } - } - } - - } - -} diff --git a/src/main/java/me/wonka01/ServerQuests/events/QuestListener.java b/src/main/java/me/wonka01/ServerQuests/events/QuestListener.java deleted file mode 100644 index 7b96bd0..0000000 --- a/src/main/java/me/wonka01/ServerQuests/events/QuestListener.java +++ /dev/null @@ -1,41 +0,0 @@ -package me.wonka01.ServerQuests.events; - -import me.wonka01.ServerQuests.enums.ObjectiveType; -import me.wonka01.ServerQuests.questcomponents.ActiveQuests; -import me.wonka01.ServerQuests.questcomponents.QuestController; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public abstract class QuestListener { - protected ActiveQuests activeQuests; - - public QuestListener(ActiveQuests activeQuests) { - this.activeQuests = activeQuests; - } - - protected void updateQuest(QuestController controller, Player player, double amount) { - if (!isEnabledInWorld(controller.getEventConstraints().getWorlds(), player.getWorld().getName())) { - return; - } - controller.updateQuest(amount, player); - if (controller.getQuestData().isGoalComplete()) { - controller.endQuest(); - } - } - - protected List tryGetControllersOfEventType(ObjectiveType type) { - List controllers = new ArrayList<>(); - for (QuestController controller : activeQuests.getActiveQuestsList()) { - if (controller.getObjective().equals(type)) { - controllers.add(controller); - } - } - return controllers; - } - - private boolean isEnabledInWorld(List worldList, String world) { - return worldList.isEmpty() || worldList.contains(world); - } -} diff --git a/src/main/java/me/wonka01/ServerQuests/events/ShearEvent.java b/src/main/java/me/wonka01/ServerQuests/events/ShearEvent.java deleted file mode 100644 index 8481c22..0000000 --- a/src/main/java/me/wonka01/ServerQuests/events/ShearEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package me.wonka01.ServerQuests.events; - -import me.wonka01.ServerQuests.enums.ObjectiveType; -import me.wonka01.ServerQuests.questcomponents.ActiveQuests; -import me.wonka01.ServerQuests.questcomponents.QuestController; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerShearEntityEvent; - -import java.util.List; - -public class ShearEvent extends QuestListener implements Listener { - - public ShearEvent(ActiveQuests activeQuests) { - super(activeQuests); - } - - @EventHandler - public void onSheer(PlayerShearEntityEvent shearEvent) { - List controllers = tryGetControllersOfEventType(ObjectiveType.SHEAR); - for (QuestController controller : controllers) { - updateQuest(controller, shearEvent.getPlayer(), 1); - } - } -} diff --git a/src/main/java/me/wonka01/ServerQuests/events/TameEvent.java b/src/main/java/me/wonka01/ServerQuests/events/TameEvent.java deleted file mode 100644 index 9632c34..0000000 --- a/src/main/java/me/wonka01/ServerQuests/events/TameEvent.java +++ /dev/null @@ -1,27 +0,0 @@ -package me.wonka01.ServerQuests.events; - -import me.wonka01.ServerQuests.enums.ObjectiveType; -import me.wonka01.ServerQuests.questcomponents.ActiveQuests; -import me.wonka01.ServerQuests.questcomponents.QuestController; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityTameEvent; - -import java.util.List; - -public class TameEvent extends QuestListener implements Listener { - public TameEvent(ActiveQuests activeQuests) { - super(activeQuests); - } - - @EventHandler - public void onTameEvent(EntityTameEvent tameEvent) { - if (tameEvent.getOwner() instanceof Player) { - List controllers = tryGetControllersOfEventType(ObjectiveType.TAME); - for (QuestController controller : controllers) { - updateQuest(controller, (Player) tameEvent.getOwner(), 1); - } - } - } -} diff --git a/src/main/java/me/wonka01/ServerQuests/events/entities/CatchFishEvent.java b/src/main/java/me/wonka01/ServerQuests/events/entities/CatchFishEvent.java new file mode 100644 index 0000000..13054d6 --- /dev/null +++ b/src/main/java/me/wonka01/ServerQuests/events/entities/CatchFishEvent.java @@ -0,0 +1,29 @@ +package me.wonka01.ServerQuests.events.entities; + +import me.knighthat.apis.events.EntityEvent; +import me.wonka01.ServerQuests.ServerQuests; +import me.wonka01.ServerQuests.enums.ObjectiveType; +import org.bukkit.entity.Item; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerFishEvent; +import org.bukkit.inventory.ItemStack; + +public class CatchFishEvent extends EntityEvent { + + public CatchFishEvent(ServerQuests plugin) { + super(plugin, ObjectiveType.CATCH_FISH); + } + + @Override + @EventHandler + public void event(PlayerFishEvent event) { + + if (event.getCaught() == null || !event.getState().equals(PlayerFishEvent.State.CAUGHT_FISH)) + return; + + Item caught = (Item) event.getCaught(); + ItemStack converted = caught.getItemStack(); + + super.attemptToUpdate(event.getPlayer(), converted.getType()); + } +} diff --git a/src/main/java/me/wonka01/ServerQuests/events/entities/KillPlayerEvent.java b/src/main/java/me/wonka01/ServerQuests/events/entities/KillPlayerEvent.java new file mode 100644 index 0000000..ef34058 --- /dev/null +++ b/src/main/java/me/wonka01/ServerQuests/events/entities/KillPlayerEvent.java @@ -0,0 +1,23 @@ +package me.wonka01.ServerQuests.events.entities; + +import me.knighthat.apis.events.EntityEvent; +import me.wonka01.ServerQuests.ServerQuests; +import me.wonka01.ServerQuests.enums.ObjectiveType; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.PlayerDeathEvent; + +public class KillPlayerEvent extends EntityEvent { + + public KillPlayerEvent(ServerQuests plugin) { + super(plugin, ObjectiveType.PLAYER_KILL); + } + + @Override + public void event(PlayerDeathEvent event) { + + Player killer = event.getEntity().getKiller(); + if (killer == null) return; + + super.attemptToUpdate(killer, event.getEntity().getType()); + } +} diff --git a/src/main/java/me/wonka01/ServerQuests/events/entities/MilkingEvent.java b/src/main/java/me/wonka01/ServerQuests/events/entities/MilkingEvent.java new file mode 100644 index 0000000..41634c3 --- /dev/null +++ b/src/main/java/me/wonka01/ServerQuests/events/entities/MilkingEvent.java @@ -0,0 +1,28 @@ +package me.wonka01.ServerQuests.events.entities; + +import me.knighthat.apis.events.EntityEvent; +import me.wonka01.ServerQuests.ServerQuests; +import me.wonka01.ServerQuests.enums.ObjectiveType; +import org.bukkit.Material; +import org.bukkit.entity.Cow; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerInteractAtEntityEvent; + +public class MilkingEvent extends EntityEvent { + + public MilkingEvent(ServerQuests plugin) { + super(plugin, ObjectiveType.MILK_COW); + } + + @Override + @EventHandler + public void event(PlayerInteractAtEntityEvent event) { + + + if (!(event.getRightClicked() instanceof Cow && + event.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.BUCKET))) + return; + + super.attemptToUpdate(event.getPlayer(), event.getRightClicked().getType()); + } +} diff --git a/src/main/java/me/wonka01/ServerQuests/events/entities/MobKillEvent.java b/src/main/java/me/wonka01/ServerQuests/events/entities/MobKillEvent.java new file mode 100644 index 0000000..dc273e7 --- /dev/null +++ b/src/main/java/me/wonka01/ServerQuests/events/entities/MobKillEvent.java @@ -0,0 +1,26 @@ +package me.wonka01.ServerQuests.events.entities; + +import me.knighthat.apis.events.EntityEvent; +import me.wonka01.ServerQuests.ServerQuests; +import me.wonka01.ServerQuests.enums.ObjectiveType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityDeathEvent; + +public class MobKillEvent extends EntityEvent { + + public MobKillEvent(ServerQuests plugin) { + super(plugin, ObjectiveType.MOB_KILL); + } + + @Override + @EventHandler + public void event(EntityDeathEvent event) { + + Player killer = event.getEntity().getKiller(); + if (killer == null) + return; + + super.attemptToUpdate(killer, event.getEntityType()); + } +} diff --git a/src/main/java/me/wonka01/ServerQuests/events/entities/NPCInteractEvent.java b/src/main/java/me/wonka01/ServerQuests/events/entities/NPCInteractEvent.java new file mode 100644 index 0000000..b7b8571 --- /dev/null +++ b/src/main/java/me/wonka01/ServerQuests/events/entities/NPCInteractEvent.java @@ -0,0 +1,20 @@ +package me.wonka01.ServerQuests.events.entities; + +import me.knighthat.apis.events.EntityEvent; +import me.wonka01.ServerQuests.ServerQuests; +import me.wonka01.ServerQuests.enums.ObjectiveType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerInteractAtEntityEvent; + +public class NPCInteractEvent extends EntityEvent { + + public NPCInteractEvent(ServerQuests plugin) { + super(plugin, ObjectiveType.MOB_KILL); + } + + @Override + @EventHandler + public void event(PlayerInteractAtEntityEvent event) { + + } +} diff --git a/src/main/java/me/wonka01/ServerQuests/events/entities/ProjectileKillEvent.java b/src/main/java/me/wonka01/ServerQuests/events/entities/ProjectileKillEvent.java new file mode 100644 index 0000000..c6dfb02 --- /dev/null +++ b/src/main/java/me/wonka01/ServerQuests/events/entities/ProjectileKillEvent.java @@ -0,0 +1,41 @@ +package me.wonka01.ServerQuests.events.entities; + +import me.knighthat.apis.events.EntityEvent; +import me.wonka01.ServerQuests.ServerQuests; +import me.wonka01.ServerQuests.enums.ObjectiveType; +import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityDeathEvent; + +public class ProjectileKillEvent extends EntityEvent { + + public ProjectileKillEvent(ServerQuests plugin) { + super(plugin, ObjectiveType.PROJ_KILL); + } + + @Override + @EventHandler + public void event(EntityDeathEvent event) { + + try { + + LivingEntity target = event.getEntity(); + + if (!target.getLastDamageCause().getCause().equals(EntityDamageEvent.DamageCause.PROJECTILE)) + return; + + EntityDamageByEntityEvent e = (EntityDamageByEntityEvent) target.getLastDamageCause(); + Projectile projectile = (Projectile) e.getDamager(); + if (!(projectile.getShooter() instanceof Player)) return; + + super.attemptToUpdate((HumanEntity) projectile.getShooter(), target.getType()); + + } catch (NullPointerException ignored) { + } + } +} diff --git a/src/main/java/me/wonka01/ServerQuests/events/entities/ShearEvent.java b/src/main/java/me/wonka01/ServerQuests/events/entities/ShearEvent.java new file mode 100644 index 0000000..69778b1 --- /dev/null +++ b/src/main/java/me/wonka01/ServerQuests/events/entities/ShearEvent.java @@ -0,0 +1,20 @@ +package me.wonka01.ServerQuests.events.entities; + +import me.knighthat.apis.events.EntityEvent; +import me.wonka01.ServerQuests.ServerQuests; +import me.wonka01.ServerQuests.enums.ObjectiveType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerShearEntityEvent; + +public class ShearEvent extends EntityEvent { + + public ShearEvent(ServerQuests plugin) { + super(plugin, ObjectiveType.SHEAR); + } + + @Override + @EventHandler + public void event(PlayerShearEntityEvent event) { + super.update(event.getPlayer()); + } +} diff --git a/src/main/java/me/wonka01/ServerQuests/events/entities/TameEvent.java b/src/main/java/me/wonka01/ServerQuests/events/entities/TameEvent.java new file mode 100644 index 0000000..0ba0150 --- /dev/null +++ b/src/main/java/me/wonka01/ServerQuests/events/entities/TameEvent.java @@ -0,0 +1,21 @@ +package me.wonka01.ServerQuests.events.entities; + +import me.knighthat.apis.events.EntityEvent; +import me.wonka01.ServerQuests.ServerQuests; +import me.wonka01.ServerQuests.enums.ObjectiveType; +import org.bukkit.entity.HumanEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityTameEvent; + +public class TameEvent extends EntityEvent { + + public TameEvent(ServerQuests plugin) { + super(plugin, ObjectiveType.TAME); + } + + @Override + @EventHandler + public void event(EntityTameEvent event) { + super.attemptToUpdate((HumanEntity) event.getOwner(), event.getEntity().getType()); + } +} diff --git a/src/main/java/me/wonka01/ServerQuests/events/materials/ConsumeEvent.java b/src/main/java/me/wonka01/ServerQuests/events/materials/ConsumeEvent.java new file mode 100644 index 0000000..906c68d --- /dev/null +++ b/src/main/java/me/wonka01/ServerQuests/events/materials/ConsumeEvent.java @@ -0,0 +1,20 @@ +package me.wonka01.ServerQuests.events.materials; + +import me.knighthat.apis.events.MaterialEvent; +import me.wonka01.ServerQuests.ServerQuests; +import me.wonka01.ServerQuests.enums.ObjectiveType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerItemConsumeEvent; + +public class ConsumeEvent extends MaterialEvent { + + public ConsumeEvent(ServerQuests plugin) { + super(plugin, ObjectiveType.CONSUME_ITEM); + } + + @Override + @EventHandler + public void event(PlayerItemConsumeEvent event) { + super.attemptToUpdate(event.getPlayer(), event.getItem().getType()); + } +} diff --git a/src/main/java/me/wonka01/ServerQuests/events/materials/CraftingEvent.java b/src/main/java/me/wonka01/ServerQuests/events/materials/CraftingEvent.java new file mode 100644 index 0000000..9c4a021 --- /dev/null +++ b/src/main/java/me/wonka01/ServerQuests/events/materials/CraftingEvent.java @@ -0,0 +1,25 @@ +package me.wonka01.ServerQuests.events.materials; + +import me.knighthat.apis.events.MaterialEvent; +import me.wonka01.ServerQuests.ServerQuests; +import me.wonka01.ServerQuests.enums.ObjectiveType; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.inventory.CraftItemEvent; + +public class CraftingEvent extends MaterialEvent { + + public CraftingEvent(ServerQuests plugin) { + super(plugin, ObjectiveType.CRAFT_ITEM); + } + + @Override + @EventHandler + public void event(CraftItemEvent event) { + + int resultAmount = event.getRecipe().getResult().getAmount(); + Material resultType = event.getRecipe().getResult().getType(); + + super.attemptToUpdate(event.getWhoClicked(), resultType, resultAmount); + } +} diff --git a/src/main/java/me/wonka01/ServerQuests/events/materials/EnchantEvent.java b/src/main/java/me/wonka01/ServerQuests/events/materials/EnchantEvent.java new file mode 100644 index 0000000..4bca674 --- /dev/null +++ b/src/main/java/me/wonka01/ServerQuests/events/materials/EnchantEvent.java @@ -0,0 +1,20 @@ +package me.wonka01.ServerQuests.events.materials; + +import me.knighthat.apis.events.MaterialEvent; +import me.wonka01.ServerQuests.ServerQuests; +import me.wonka01.ServerQuests.enums.ObjectiveType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.enchantment.EnchantItemEvent; + +public class EnchantEvent extends MaterialEvent { + + public EnchantEvent(ServerQuests plugin) { + super(plugin, ObjectiveType.ENCHANT_ITEM); + } + + @Override + @EventHandler + public void event(EnchantItemEvent event) { + super.attemptToUpdate(event.getEnchanter(), event.getItem().getType()); + } +} diff --git a/src/main/java/me/wonka01/ServerQuests/events/materials/blocks/BreakEvent.java b/src/main/java/me/wonka01/ServerQuests/events/materials/blocks/BreakEvent.java new file mode 100644 index 0000000..4b3412e --- /dev/null +++ b/src/main/java/me/wonka01/ServerQuests/events/materials/blocks/BreakEvent.java @@ -0,0 +1,21 @@ +package me.wonka01.ServerQuests.events.materials.blocks; + +import me.knighthat.apis.events.BlockEvent; +import me.wonka01.ServerQuests.ServerQuests; +import me.wonka01.ServerQuests.enums.ObjectiveType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.block.BlockBreakEvent; + +public class BreakEvent extends BlockEvent { + + + public BreakEvent(ServerQuests plugin) { + super(plugin, ObjectiveType.BLOCK_BREAK, "BROKEN"); + } + + @Override + @EventHandler + public void event(BlockBreakEvent event) { + super.attemptToUpdate(event, event.getPlayer()); + } +} diff --git a/src/main/java/me/wonka01/ServerQuests/events/materials/blocks/PlaceEvent.java b/src/main/java/me/wonka01/ServerQuests/events/materials/blocks/PlaceEvent.java new file mode 100644 index 0000000..7aacdac --- /dev/null +++ b/src/main/java/me/wonka01/ServerQuests/events/materials/blocks/PlaceEvent.java @@ -0,0 +1,20 @@ +package me.wonka01.ServerQuests.events.materials.blocks; + +import me.knighthat.apis.events.BlockEvent; +import me.wonka01.ServerQuests.ServerQuests; +import me.wonka01.ServerQuests.enums.ObjectiveType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.block.BlockPlaceEvent; + +public class PlaceEvent extends BlockEvent { + + public PlaceEvent(ServerQuests plugin) { + super(plugin, ObjectiveType.BLOCK_PLACE, "PLACED"); + } + + @Override + @EventHandler + public void event(BlockPlaceEvent event) { + super.attemptToUpdate(event, event.getPlayer()); + } +} diff --git a/src/main/java/me/wonka01/ServerQuests/gui/DonateMenu.java b/src/main/java/me/wonka01/ServerQuests/gui/DonateMenu.java index 75e04a6..33b3297 100644 --- a/src/main/java/me/wonka01/ServerQuests/gui/DonateMenu.java +++ b/src/main/java/me/wonka01/ServerQuests/gui/DonateMenu.java @@ -1,17 +1,31 @@ package me.wonka01.ServerQuests.gui; +import lombok.Getter; import lombok.NonNull; import me.knighthat.apis.menus.Menu; +import me.knighthat.apis.utils.Utils; import me.wonka01.ServerQuests.ServerQuests; -import me.wonka01.ServerQuests.events.GuiEvent; +import me.wonka01.ServerQuests.enums.ObjectiveType; import me.wonka01.ServerQuests.questcomponents.ActiveQuests; +import me.wonka01.ServerQuests.questcomponents.QuestController; +import me.wonka01.ServerQuests.questcomponents.QuestData; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryAction; import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; public class DonateMenu extends Menu { + @Getter private final int inputSlot = 22; private @NonNull Material borderItem; @@ -19,13 +33,13 @@ public DonateMenu(ServerQuests plugin, @NonNull Player owner) { super(plugin, owner, "donateMenu", 45); borderItem = Material.getMaterial(getPlugin().getConfig().getString("donateMenuItem")); - if(borderItem == null) { + if (borderItem == null) { borderItem = Material.DIAMOND_BLOCK; } } @Override - protected void setContents() { + protected void setBorder() { ItemStack item = super.createItemStack(borderItem, " "); for (int slot = 0; slot < getSlots(); slot++) @@ -35,50 +49,119 @@ protected void setContents() { @Override protected void onItemClick(@NonNull InventoryClickEvent event) { - String cannotDonate = getPlugin().messages().message("cantDonateItem"); - GuiEvent handler = new GuiEvent(ActiveQuests.getActiveQuestsInstance()); - ItemStack atCursor = event.getCursor().clone(); - if (event.getRawSlot() > getSlots()) - event.setCancelled(false); + InventoryAction action = event.getAction(); + switch (action) { + + case PLACE_SOME: + case PLACE_ALL: + case PLACE_ONE: + + if (event.getSlot() == inputSlot) + new BukkitRunnable() { + @Override + public void run() { + + ItemStack putDown = getInventory().getItem(getInputSlot()); + boolean isAcceptable = false; + + for (QuestController ctrl : getControllers()) { + + QuestData data = ctrl.getQuestData(); + double total = data.getAmountCompleted() + putDown.getAmount(); + int goal = data.getQuestGoal(); + + List requirements = ctrl.getEventConstraints().getMaterialNames(); + if (requirements.isEmpty() || Utils.contains(requirements, putDown.getType())) { + + int remaining = 0; - switch (event.getAction()) { + if (total > goal) { + + int diff = (int) total - goal; + remaining = diff; + + ItemStack toCursor = event.getCursor().clone(); + toCursor.setAmount(toCursor.getAmount() + diff); + + getOwner().setItemOnCursor(toCursor); + } + + updateQuest(ctrl, putDown); + isAcceptable = true; + + putDown.setAmount(remaining); + getOwner().updateInventory(); + } + } + + if (!isAcceptable) { + + String cannotDonate = getPlugin().messages().message("cantDonateItem"); + getOwner().sendMessage(cannotDonate); + } + + } + }.runTaskLater(getPlugin(), 3); case PICKUP_ALL: case PICKUP_HALF: case PICKUP_ONE: case PICKUP_SOME: + if (event.getSlot() == inputSlot) { + break; + } else return; + + default: + return; + } + event.setCancelled(false); + } - if (event.getClickedInventory() != null) - if (!event.getClickedInventory().equals(getInventory())) - event.setCancelled(false); - break; + @Override + protected void onClose(@NonNull InventoryCloseEvent event) { - case PLACE_ALL: + ItemStack leftover = getInventory().getItem(getInputSlot()); + if (leftover == null) return; - if (event.getCursor() != null) - if (handler.tryAddItemsToQuest(atCursor, getOwner())) { + PlayerInventory inventory = getOwner().getInventory(); + if (inventory.firstEmpty() > -1) { - getOwner().setItemOnCursor(new ItemStack(Material.AIR)); - } else { + Map items = inventory.addItem(leftover); + items.forEach((slot, item) -> dropIt(item)); + } else + dropIt(leftover); + } - getOwner().sendMessage(cannotDonate); - } - break; + private void dropIt(@NonNull ItemStack item) { + getOwner().getWorld().dropItemNaturally(getOwner().getLocation(), item); + } - case PLACE_ONE: + @Override + public @NonNull List getControllers() { - if (event.getCursor() != null) { - atCursor.setAmount(atCursor.getAmount() - 1); - if (handler.tryAddItemsToQuest(atCursor, getOwner())) { - getOwner().setItemOnCursor(atCursor); - } else { - getOwner().sendMessage(cannotDonate); - } - } - default: - break; - } + List controllers = new ArrayList<>(); + + ActiveQuests activeQuests = getPlugin().config().getActiveQuests(); + for (QuestController ctrl : activeQuests.getActiveQuestsList()) + if (ctrl.getObjective().equals(ObjectiveType.GUI)) + controllers.add(ctrl); + + return controllers; + } + + private void updateQuest(@NonNull QuestController ctrl, @NonNull ItemStack item) { + + if (!isWorldAllowed(ctrl, getOwner().getWorld())) + return; + + if (ctrl.updateQuest(item.getAmount(), getOwner())) + ctrl.endQuest(); + } + + private boolean isWorldAllowed(@NonNull QuestController ctrl, @NonNull World world) { + List worlds = ctrl.getEventConstraints().getWorlds(); + return worlds.isEmpty() || Utils.contains(worlds, world.getName()); } } diff --git a/src/main/java/me/wonka01/ServerQuests/questcomponents/QuestController.java b/src/main/java/me/wonka01/ServerQuests/questcomponents/QuestController.java index 7ad0178..e0f1f9d 100644 --- a/src/main/java/me/wonka01/ServerQuests/questcomponents/QuestController.java +++ b/src/main/java/me/wonka01/ServerQuests/questcomponents/QuestController.java @@ -40,7 +40,7 @@ public QuestController(ServerQuests plugin, QuestData questData, QuestBar questB } } - public void updateQuest(double count, Player player) { + public boolean updateQuest(double count, Player player) { double amountToAdd = count; if (questData.hasGoal()) { @@ -53,6 +53,8 @@ public void updateQuest(double count, Player player) { playerComponent.savePlayerAction(player, amountToAdd); updateBossBar(); sendPlayerMessage(player); + + return getQuestData().isGoalComplete(); } public void endQuest() {