/* * Copyright (c) PikaMug and contributors * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT * LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package me.pikamug.quests.listeners; import me.pikamug.quests.quests.BukkitQuest; import me.pikamug.quests.player.BukkitQuester; import me.pikamug.quests.BukkitQuestsPlugin; import me.pikamug.quests.enums.ObjectiveType; import me.pikamug.quests.player.Quester; import me.pikamug.quests.quests.Quest; import me.pikamug.quests.quests.components.Stage; import me.pikamug.quests.util.BukkitItemUtil; import me.pikamug.quests.util.BukkitLang; import me.pikamug.quests.util.BukkitMiscUtil; import me.pikamug.quests.util.BukkitUpdateChecker; 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 BukkitPlayerListener implements Listener { private final BukkitQuestsPlugin plugin; public BukkitPlayerListener(final BukkitQuestsPlugin 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 (BukkitItemUtil.isItem(event.getCurrentItem()) && BukkitItemUtil.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 (BukkitItemUtil.isItem(event.getCurrentItem()) && BukkitItemUtil.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 (BukkitItemUtil.isItem(item) && BukkitItemUtil.isJournal(item)) { event.setCancelled(true); return; } } } if (BukkitItemUtil.isItem(event.getCurrentItem()) && BukkitItemUtil.isJournal(event.getCurrentItem()) || BukkitItemUtil.isItem(event.getCursor()) && BukkitItemUtil.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 BukkitQuester quester = plugin.getQuester(event.getWhoClicked().getUniqueId()); final Player player = (Player) event.getWhoClicked(); if (event.getView().getTitle().contains(BukkitLang.get(player, "quests"))) { final ItemStack clicked = event.getCurrentItem(); if (BukkitItemUtil.isItem(clicked)) { event.setCancelled(true); for (final Quest quest : plugin.getLoadedQuests()) { final BukkitQuest bukkitQuest = (BukkitQuest)quest; if (bukkitQuest.getGUIDisplay() != null) { if (BukkitItemUtil.compareItems(clicked, bukkitQuest.prepareDisplay(quester), false) == 0) { if (quester.canAcceptOffer(quest, true)) { try { quester.takeQuest(quest, false); } catch (final Exception e) { e.printStackTrace(); } } plugin.getServer().getScheduler().runTaskLater(plugin, () -> event.getWhoClicked().closeInventory(), 1L); return; } } } } } } @EventHandler(priority = EventPriority.HIGHEST) public void onInventoryDragEvent(final InventoryDragEvent event) { if (BukkitItemUtil.isItem(event.getOldCursor()) && BukkitItemUtil.isJournal(event.getOldCursor()) || BukkitItemUtil.isItem(event.getCursor()) && BukkitItemUtil.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 (BukkitItemUtil.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 (BukkitItemUtil.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); BukkitLang.send(player, ChatColor.RED + BukkitLang.get(event.getPlayer(), "journalDenied") .replace("", BukkitLang.get(event.getPlayer(), "journalTitle"))); return; } if (plugin.getConfigSettings().canAllowPranks() && event.getClickedBlock().getType().name().contains("PORTAL")) { event.setCancelled(true); BukkitLang.send(player, " " + ChatColor.AQUA + ChatColor.UNDERLINE + "https://www.youtube.com/watch?v=dQw4w9WgXcQ"); return; } } if (plugin.getConfigSettings().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)) { BukkitLang.send(player, " " + ChatColor.AQUA + ChatColor.UNDERLINE + "https://www.youtube.com/watch?v=nJROKaZJgbI"); } event.setCancelled(true); return; } } if (plugin.canUseQuests(event.getPlayer().getUniqueId())) { final Quester 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 Quest quest : plugin.getLoadedQuests()) { if (quester.getCurrentQuests().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) { BukkitLang.send(player, ChatColor.GOLD + BukkitLang.get(player, "questSelectedLocation") + " " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + BukkitItemUtil.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) { BukkitLang.send(player, ChatColor.GOLD + BukkitLang.get(player, "questSelectedLocation") + " " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + BukkitItemUtil.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) { BukkitLang.send(player, ChatColor.GOLD + BukkitLang.get(player, "questSelectedLocation") + " " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + BukkitItemUtil.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) { BukkitLang.send(player, ChatColor.GOLD + BukkitLang.get(player, "questSelectedLocation") + " " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + BukkitItemUtil.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) { BukkitLang.send(player, ChatColor.GOLD + BukkitLang.get(player, "questSelectedLocation") + " " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + BukkitItemUtil.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) { BukkitLang.send(player, ChatColor.GOLD + BukkitLang.get(player, "questSelectedLocation") + " " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + BukkitItemUtil.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) { BukkitLang.send(player, ChatColor.GOLD + BukkitLang.get(player, "questSelectedLocation") + " " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + BukkitItemUtil.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) { BukkitLang.send(player, ChatColor.GOLD + BukkitLang.get(player, "questSelectedLocation") + " " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + BukkitItemUtil.getName(new ItemStack(block.getType())) + ChatColor.GOLD + ")"); } event.setCancelled(true); } else if (!player.isConversing()) { for (final Quest quest : plugin.getLoadedQuests()) { final BukkitQuest bukkitQuest = (BukkitQuest) quest; if (bukkitQuest.getBlockStart() != null && event.getClickedBlock() != null) { if (bukkitQuest.getBlockStart().equals(event.getClickedBlock().getLocation())) { if (quester.getCurrentQuests().size() >= plugin.getConfigSettings().getMaxQuests() && plugin.getConfigSettings().getMaxQuests() > 0) { String msg = BukkitLang.get(player, "questMaxAllowed"); msg = msg.replace("", String .valueOf(plugin.getConfigSettings().getMaxQuests())); BukkitLang.send(player, ChatColor.YELLOW + msg); } else { if (quester.getCompletedQuests().contains(bukkitQuest)) { if (bukkitQuest.getPlanner().getCooldown() > -1 && (quester.getRemainingCooldown(bukkitQuest)) > 0) { String early = BukkitLang.get(player, "questTooEarly"); early = early.replace("", ChatColor.AQUA + bukkitQuest.getName() + ChatColor.YELLOW); early = early.replace("