/* * Copyright (c) 2014 PikaMug and contributors. All rights reserved. * * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN * NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package me.blackvein.quests.listeners; import me.blackvein.quests.Quest; import me.blackvein.quests.Quester; import me.blackvein.quests.Quests; import me.blackvein.quests.enums.ObjectiveType; import me.blackvein.quests.player.IQuester; import me.blackvein.quests.quests.IQuest; import me.blackvein.quests.quests.IStage; import me.blackvein.quests.util.ItemUtil; import me.blackvein.quests.util.Lang; import me.blackvein.quests.util.MiscUtil; import me.blackvein.quests.util.UpdateChecker; import net.citizensnpcs.api.CitizensAPI; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; import org.bukkit.entity.Sheep; import org.bukkit.entity.TNTPrimed; import org.bukkit.entity.Wolf; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityTameEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.inventory.InventoryAction; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryDragEvent; import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerBucketFillEvent; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerFishEvent; import org.bukkit.event.player.PlayerFishEvent.State; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerShearEntityEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentSkipListSet; public class PlayerListener implements Listener { private final Quests plugin; public PlayerListener(final Quests plugin) { this.plugin = plugin; } @EventHandler(priority = EventPriority.HIGHEST) public void onInventoryClickEvent(final InventoryClickEvent event) { final InventoryAction ac = event.getAction(); if (ac.equals(InventoryAction.NOTHING)) { return; } if (ItemUtil.isItem(event.getCurrentItem()) && ItemUtil.isJournal(event.getCurrentItem())) { if (ac.equals(InventoryAction.MOVE_TO_OTHER_INVENTORY) || ac.equals(InventoryAction.DROP_ALL_SLOT) || ac.equals(InventoryAction.DROP_ONE_SLOT)) { event.setCancelled(true); return; } } else if (ItemUtil.isItem(event.getCurrentItem()) && ItemUtil.isJournal(event.getCursor())) { if (ac.equals(InventoryAction.MOVE_TO_OTHER_INVENTORY) || ac.equals(InventoryAction.DROP_ALL_CURSOR) || ac.equals(InventoryAction.DROP_ONE_CURSOR)) { event.setCancelled(true); return; } } else if (ac.equals(InventoryAction.SWAP_WITH_CURSOR) || ac.equals(InventoryAction.HOTBAR_SWAP) || ac.equals(InventoryAction.HOTBAR_MOVE_AND_READD)) { if (event.getHotbarButton() > -1) { final ItemStack item = event.getWhoClicked().getInventory().getItem(event.getHotbarButton()); if (ItemUtil.isItem(item) && ItemUtil.isJournal(item)) { event.setCancelled(true); return; } } } if (ItemUtil.isItem(event.getCurrentItem()) && ItemUtil.isJournal(event.getCurrentItem()) || ItemUtil.isItem(event.getCursor()) && ItemUtil.isJournal(event.getCursor())) { int upper = event.getView().getTopInventory().getSize(); if (event.getView().getTopInventory().getType().equals(InventoryType.CRAFTING)) upper += 4; final int lower = event.getView().getBottomInventory().getSize(); final int relative = event.getRawSlot() - upper; if (relative < 0 || relative >= (lower)) { event.setCancelled(true); return; } } final Quester quester = plugin.getQuester(event.getWhoClicked().getUniqueId()); final Player player = (Player) event.getWhoClicked(); if (event.getView().getTitle().contains(Lang.get(player, "quests"))) { final ItemStack clicked = event.getCurrentItem(); if (ItemUtil.isItem(clicked)) { for (final IQuest quest : plugin.getLoadedQuests()) { final Quest bukkitQuest = (Quest)quest; if (quest.getGUIDisplay() != null) { if (ItemUtil.compareItems(clicked, bukkitQuest.prepareDisplay(quester), false) == 0) { if (quester.canAcceptOffer(quest, true)) { try { quester.takeQuest(quest, false); } catch (final Exception e) { e.printStackTrace(); } } event.getWhoClicked().closeInventory(); break; } } } event.setCancelled(true); } } } @EventHandler(priority = EventPriority.HIGHEST) public void onInventoryDragEvent(final InventoryDragEvent event) { if (ItemUtil.isItem(event.getOldCursor()) && ItemUtil.isJournal(event.getOldCursor()) || ItemUtil.isItem(event.getCursor()) && ItemUtil.isJournal(event.getCursor())) { int upper = event.getView().getTopInventory().getSize(); if (event.getView().getTopInventory().getType().equals(InventoryType.CRAFTING)) upper += 4; final int lower = event.getView().getBottomInventory().getSize(); for (int relative : event.getRawSlots()) { relative -= upper; if (relative < 0 || relative >= (lower)) { event.setCancelled(true); break; } } } } @EventHandler public void onPlayerDropItem(final PlayerDropItemEvent event) { if (ItemUtil.isJournal(event.getItemDrop().getItemStack())) { if (!event.getPlayer().hasPermission("quests.admin.drop")) { event.setCancelled(true); } } } @SuppressWarnings("deprecation") // since 1.13 @EventHandler public void onPlayerInteract(final PlayerInteractEvent event) { EquipmentSlot e = null; try { e = event.getHand(); } catch (final NoSuchMethodError err) { // Do nothing, getHand() not present pre-1.9 } if (e == null || e.equals(EquipmentSlot.HAND)) { // If the event is fired by HAND (main hand) if (ItemUtil.isJournal(event.getPlayer().getItemInHand())) { final Player player = event.getPlayer(); if (event.hasBlock()) { if (event.getClickedBlock() == null) { return; } if (event.getClickedBlock().getType().name().equals("LECTERN") || event.getClickedBlock().getType().name().equals("CHISELED_BOOKSHELF")) { event.setCancelled(true); Lang.send(player, ChatColor.RED + Lang.get(event.getPlayer(), "journalDenied") .replace("", Lang.get(event.getPlayer(), "journalTitle"))); return; } if (plugin.getSettings().canAllowPranks() && event.getClickedBlock().getType().name().contains("PORTAL")) { event.setCancelled(true); Lang.send(player, " " + ChatColor.AQUA + ChatColor.UNDERLINE + "https://www.youtube.com/watch?v=dQw4w9WgXcQ"); return; } } if (plugin.getSettings().canAllowPranks() && event.getPlayer().getInventory().getHelmet() != null && (event.getPlayer().getInventory().getHelmet().getType().name().equals("PUMPKIN") || event.getPlayer().getInventory().getHelmet().getType().name().equals("CARVED_PUMPKIN"))) { if (!event.getAction().equals(Action.RIGHT_CLICK_AIR)) { Lang.send(player, " " + ChatColor.AQUA + ChatColor.UNDERLINE + "https://www.youtube.com/watch?v=v4IC7qaNr7I"); } event.setCancelled(true); return; } } if (plugin.canUseQuests(event.getPlayer().getUniqueId())) { final IQuester quester = plugin.getQuester(event.getPlayer().getUniqueId()); final Player player = event.getPlayer(); if (event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { boolean hasObjective = false; if (!event.isCancelled()) { for (final IQuest quest : plugin.getLoadedQuests()) { if (quester.getCurrentQuestsTemp().containsKey(quest) && quester.getCurrentStage(quest).containsObjective(ObjectiveType.USE_BLOCK)) { hasObjective = true; } } } if (!hasObjective) { if (plugin.getQuestFactory().getSelectedBlockStarts().containsKey(event.getPlayer() .getUniqueId())) { final Block block = event.getClickedBlock(); if (block == null) { return; } final Location loc = block.getLocation(); final Map temp = plugin.getQuestFactory().getSelectedBlockStarts(); temp.put(player.getUniqueId(), block); plugin.getQuestFactory().setSelectedBlockStarts(temp); if (loc.getWorld() != null) { Lang.send(player, ChatColor.GOLD + Lang.get(player, "questSelectedLocation") + " " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + ItemUtil.getName(new ItemStack(block.getType())) + ChatColor.GOLD + ")"); } event.setCancelled(true); } else if (plugin.getActionFactory().getSelectedExplosionLocations().containsKey(event.getPlayer() .getUniqueId())) { final Block block = event.getClickedBlock(); if (block == null) { return; } final Location loc = block.getLocation(); final Map temp = plugin.getActionFactory().getSelectedExplosionLocations(); temp.put(player.getUniqueId(), block); plugin.getActionFactory().setSelectedExplosionLocations(temp); if (loc.getWorld() != null) { Lang.send(player, ChatColor.GOLD + Lang.get(player, "questSelectedLocation") + " " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + ItemUtil.getName(new ItemStack(block.getType())) + ChatColor.GOLD + ")"); } event.setCancelled(true); } else if (plugin.getActionFactory().getSelectedEffectLocations().containsKey(event.getPlayer() .getUniqueId())) { final Block block = event.getClickedBlock(); if (block == null) { return; } final Location loc = block.getLocation(); final Map temp = plugin.getActionFactory().getSelectedEffectLocations(); temp.put(player.getUniqueId(), block); plugin.getActionFactory().setSelectedEffectLocations(temp); if (loc.getWorld() != null) { Lang.send(player, ChatColor.GOLD + Lang.get(player, "questSelectedLocation") + " " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + ItemUtil.getName(new ItemStack(block.getType())) + ChatColor.GOLD + ")"); } event.setCancelled(true); } else if (plugin.getActionFactory().getSelectedMobLocations().containsKey(event.getPlayer() .getUniqueId())) { final Block block = event.getClickedBlock(); if (block == null) { return; } final Location loc = block.getLocation(); final Map temp = plugin.getActionFactory().getSelectedMobLocations(); temp.put(player.getUniqueId(), block); plugin.getActionFactory().setSelectedMobLocations(temp); if (loc.getWorld() != null) { Lang.send(player, ChatColor.GOLD + Lang.get(player, "questSelectedLocation") + " " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + ItemUtil.getName(new ItemStack(block.getType())) + ChatColor.GOLD + ")"); } event.setCancelled(true); } else if (plugin.getActionFactory().getSelectedLightningLocations().containsKey(event.getPlayer() .getUniqueId())) { final Block block = event.getClickedBlock(); if (block == null) { return; } final Location loc = block.getLocation(); final Map temp = plugin.getActionFactory().getSelectedLightningLocations(); temp.put(player.getUniqueId(), block); plugin.getActionFactory().setSelectedLightningLocations(temp); if (loc.getWorld() != null) { Lang.send(player, ChatColor.GOLD + Lang.get(player, "questSelectedLocation") + " " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + ItemUtil.getName(new ItemStack(block.getType())) + ChatColor.GOLD + ")"); } event.setCancelled(true); } else if (plugin.getActionFactory().getSelectedTeleportLocations().containsKey(event.getPlayer() .getUniqueId())) { final Block block = event.getClickedBlock(); if (block == null) { return; } final Location loc = block.getLocation(); final Map temp = plugin.getActionFactory().getSelectedTeleportLocations(); temp.put(player.getUniqueId(), block); plugin.getActionFactory().setSelectedTeleportLocations(temp); if (loc.getWorld() != null) { Lang.send(player, ChatColor.GOLD + Lang.get(player, "questSelectedLocation") + " " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + ItemUtil.getName(new ItemStack(block.getType())) + ChatColor.GOLD + ")"); } event.setCancelled(true); } else if (plugin.getQuestFactory().getSelectedKillLocations().containsKey(event.getPlayer() .getUniqueId())) { final Block block = event.getClickedBlock(); if (block == null) { return; } final Location loc = block.getLocation(); final Map temp = plugin.getQuestFactory().getSelectedKillLocations(); temp.put(player.getUniqueId(), block); plugin.getQuestFactory().setSelectedKillLocations(temp); if (loc.getWorld() != null) { Lang.send(player, ChatColor.GOLD + Lang.get(player, "questSelectedLocation") + " " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + ItemUtil.getName(new ItemStack(block.getType())) + ChatColor.GOLD + ")"); } event.setCancelled(true); } else if (plugin.getQuestFactory().getSelectedReachLocations().containsKey(event.getPlayer() .getUniqueId())) { final Block block = event.getClickedBlock(); if (block == null) { return; } final Location loc = block.getLocation(); final Map temp = plugin.getQuestFactory().getSelectedReachLocations(); temp.put(player.getUniqueId(), block); plugin.getQuestFactory().setSelectedReachLocations(temp); if (loc.getWorld() != null) { Lang.send(player, ChatColor.GOLD + Lang.get(player, "questSelectedLocation") + " " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + ItemUtil.getName(new ItemStack(block.getType())) + ChatColor.GOLD + ")"); } event.setCancelled(true); } else if (!player.isConversing()) { for (final IQuest q : plugin.getLoadedQuests()) { if (q.getBlockStart() != null && event.getClickedBlock() != null) { if (q.getBlockStart().equals(event.getClickedBlock().getLocation())) { if (quester.getCurrentQuestsTemp().size() >= plugin.getSettings().getMaxQuests() && plugin.getSettings().getMaxQuests() > 0) { String msg = Lang.get(player, "questMaxAllowed"); msg = msg.replace("", String .valueOf(plugin.getSettings().getMaxQuests())); Lang.send(player, ChatColor.YELLOW + msg); } else { if (quester.getCompletedQuestsTemp().contains(q)) { if (q.getPlanner().getCooldown() > -1 && (quester.getRemainingCooldown(q)) > 0) { String early = Lang.get(player, "questTooEarly"); early = early.replace("", ChatColor.AQUA + q.getName() + ChatColor.YELLOW); early = early.replace("