package dev.selena.glitchmc.lootlake; import com.mewin.WGRegionEvents.events.RegionEnterEvent; import com.mewin.WGRegionEvents.events.RegionLeaveEvent; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; import dev.selena.glitchmc.lootlake.utils.Utils; import net.minecraft.server.v1_8_R3.EntityFishingHook; import com.sk89q.worldguard.protection.managers.RegionManager; import com.sk89q.worldguard.protection.regions.ProtectedRegion; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Entity; import org.bukkit.entity.FishHook; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerFishEvent; import org.bukkit.event.player.PlayerFishEvent.State; import org.bukkit.event.player.PlayerItemHeldEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; import java.lang.reflect.Field; import java.util.*; import java.util.concurrent.ThreadLocalRandom; public class FishingEventListener implements Listener { BukkitTask checkTimes; private static Field fishCatchTime; private String lastFishingTitle, lastFishingSubTitle; private final String fishingTitle = LootLakeCoreClass.getInstance().getConfig().getString("titles.success.title"); private final String fishingSubTitle = LootLakeCoreClass.getInstance().getConfig().getString("titles.success.subTitle"); public FishingEventListener() { try { fishCatchTime = EntityFishingHook.class.getDeclaredField("aw"); fishCatchTime.setAccessible(true); } catch (NoSuchFieldException e) { e.printStackTrace(); } } @SuppressWarnings("deprecation") public void checkFishingTimes() { checkTimes = new BukkitRunnable() { @Override public void run() { for (UUID uuid : plugin.fishingTimes.keySet()) { Player player = plugin.getServer().getPlayer(uuid); if (player == null) return; if (plugin.fishingTimes.get(uuid) - System.currentTimeMillis() <= 0) { if (plugin.playerFishingState.get(uuid).equals("CAUGHT_FISH")) { String missedTitle = plugin.utils.color(plugin.getConfig().getString("titles.missed.title")); String missedSubTitle = plugin.utils.color(plugin.getConfig().getString("titles.missed.subTitle")); player.resetTitle(); player.sendTitle(missedTitle, missedSubTitle); player.setTitleTimes(0, Integer.MAX_VALUE, 0); plugin.playerFishingState.put(uuid, "FAILED_ATTEMPT"); } else if (!plugin.playerFishingState.get(uuid).equals("FAILED_ATTEMPT")) { plugin.playerFishingState.put(uuid, "CAUGHT_FISH"); String hookedTitle = plugin.utils.color(plugin.getConfig().getString("titles.caught.title")); String hookedSubTitle = plugin.utils.color(plugin.getConfig().getString("titles.caught.subTitle")); player.resetTitle(); player.sendTitle(hookedTitle, hookedSubTitle); player.setTitleTimes(0, 60, 0); if (plugin.getConfig().getBoolean("playSound.enabled")) { player.playSound(player.getLocation(), Sound.valueOf(plugin.getConfig().getString("playSound.sound")), Float.parseFloat(plugin.getConfig().getString("playSound.volume")), Float.parseFloat(plugin.getConfig().getString("playSound.pitch"))); } } } } } }.runTaskTimerAsynchronously(plugin, 20, 60); } public HashMap messagePlayers; LootLakeCoreClass plugin = LootLakeCoreClass.getInstance(); @EventHandler public void onFish(PlayerFishEvent event) { System.out.println("TEST"); WorldGuardPlugin wg = WorldGuardPlugin.inst(); Player player = (Player) event.getHook().getShooter(); RegionManager rm = wg.getRegionManager(player.getWorld()); List regions = plugin.getConfig().getStringList("regions"); boolean fishingRegion = false; String currentRegion = null; for (String loopRegion : regions) { ProtectedRegion region = rm.getRegion(loopRegion); if (region != null && region.contains(player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ())) { fishingRegion = true; currentRegion = loopRegion; } } System.out.println("fishing region & currentRegion not empty"); if (fishingRegion && !currentRegion.isEmpty()) { System.out.println(true); event.setExpToDrop(0); // Get random time between 10 and 20 seconds for fishing. setFishingTime(event.getHook(), ThreadLocalRandom.current().nextInt(10, 13)); State state = event.getState(); event.getHook().setBounce(false); if (plugin.playerFishingState.containsKey(player.getUniqueId())) { String playerState = plugin.playerFishingState.get(player.getUniqueId()); if (event.getCaught() != null && !playerState.equals("CAUGHT_FISH")) { Entity caught = event.getCaught(); if (!(caught instanceof LivingEntity)) caught.remove(); state = State.FAILED_ATTEMPT; } else { state = !plugin.playerFishingState.get(player.getUniqueId()).equals("FISHING") ? State.valueOf(playerState) : state; } } if (event.getCaught() != null) { Entity caught = event.getCaught(); if (!(caught instanceof LivingEntity)) caught.remove(); } switch (state) { case FISHING: String title = plugin.utils.color(plugin.getConfig().getString("titles.fishing.title")); String subTitle = plugin.utils.color(plugin.getConfig().getString("titles.fishing.subTitle")); player.resetTitle(); player.sendTitle(title, subTitle); player.setTitleTimes(0, Integer.MAX_VALUE, 0); this.lastFishingTitle = title; this.lastFishingSubTitle = subTitle; Random random = new Random(); int rng = (random.nextInt(60 - 10) + 10) * 1000; plugin.fishingTimes.put(player.getUniqueId(), System.currentTimeMillis() + rng); plugin.playerFishingState.put(player.getUniqueId(), "FISHING"); break; case CAUGHT_FISH: ItemStack rewardItem = null; plugin.fishingTimes.remove(player.getUniqueId()); plugin.playerFishingState.remove(player.getUniqueId()); // generate the section for the reward String reward = plugin.utils.generateReward(currentRegion); ConfigurationSection rewardSection = plugin.utils.getRewardsFile() .getConfigurationSection(reward); String name = null; if (rewardSection.getString("name") != null) name = plugin.utils.color(rewardSection.getString("name")); // create the item if it is custom if (rewardSection.contains("customItem")) { String[] typeInfo = rewardSection.getString("customItem.type").split(":"); ItemStack item = new ItemStack(Material.matchMaterial(typeInfo[0])); if (typeInfo.length == 2) item.setDurability(Short.parseShort(typeInfo[1])); ItemMeta itemMeta = item.getItemMeta(); if (name != null) itemMeta.setDisplayName(name); List lore = new ArrayList<>(); for (String loreLine : rewardSection.getStringList("customItem.lore")) { lore.add(plugin.utils.color(loreLine)); } itemMeta.setLore(lore); if (rewardSection.contains("customItem.enchants")) { for (String enchantAndLevel : rewardSection.getStringList("customItem.enchants")) { String[] args = enchantAndLevel.split(":"); String enchant = args[0]; int level = Integer.parseInt(args[1]); itemMeta.addEnchant(Enchantment.getByName(enchant), level, true); } } if (rewardSection.getBoolean("customItem.glowing")) { itemMeta.addEnchant(Enchantment.WATER_WORKER, 1, true); itemMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS); } if (rewardSection.contains("customItem.amount")) item.setAmount(rewardSection.getInt("customItem.amount")); item.setItemMeta(itemMeta); // player.getInventory().addItem(item); rewardItem = item; } LootCatchEvent lootEvent = new LootCatchEvent(player, rewardItem, rewardSection.contains("commands") ? rewardSection.getStringList("commands").toArray(new String[0]) : null, rewardSection); Bukkit.getServer().getPluginManager().callEvent(lootEvent); break; default: String otherTitle = plugin.utils.color(plugin.getConfig().getString("titles.failed.title")); String otherSubTitle = plugin.utils.color(plugin.getConfig().getString("titles.failed.subTitle")); player.resetTitle(); player.sendTitle(otherTitle, otherSubTitle); player.setTitleTimes(0, 60, 0); this.lastFishingTitle = otherTitle; this.lastFishingSubTitle = otherSubTitle; plugin.fishingTimes.remove(player.getUniqueId()); plugin.playerFishingState.remove(player.getUniqueId()); new BukkitRunnable() { @Override public void run() { if (player.getItemInHand() != null && player.getItemInHand().getType() == Material.FISHING_ROD && !(plugin.playerFishingState.containsKey(player.getUniqueId()) && plugin.playerFishingState.get(player.getUniqueId()).equals("FISHING"))) { String awaitTitle = plugin.utils .color(plugin.getConfig().getString("titles.awaitFishing.title")); String awaitSubTitle = plugin.utils .color(plugin.getConfig().getString("titles.awaitFishing.subTitle")); player.sendTitle(awaitTitle, awaitSubTitle); player.setTitleTimes(0, Integer.MAX_VALUE, 0); } } }.runTaskLater(plugin, 50); break; } } } @EventHandler public void lootCatch(LootCatchEvent event) { Player player = event.getPlayer(); ConfigurationSection config = event.getConfig(); String name = ""; if (config.getString("name") != null) name = plugin.utils.color(config.getString("name")); if (event.getCommandRewards() != null) { for (String command : event.getCommandRewards()) { plugin.getServer().dispatchCommand(plugin.getServer().getConsoleSender(), command.replace("%player%", event.getPlayer().getName())); } } if (config.contains("sendPlayerMessage")) { player.sendMessage( plugin.utils.color(config.getString("sendPlayerMessage").replace("%name%", name))); } if (config.contains("announcement")) { plugin.getServer().broadcastMessage(plugin.utils.color(config.getString("announcement") .replace("%name%", name).replace("%player%", player.getName()))); } String caughtTitle = plugin.utils .color(plugin.getConfig().getString("titles.success.title").replace("%reward%", name)); String caughtSubTitle = plugin.utils .color(plugin.getConfig().getString("titles.success.subTitle").replace("%reward%", name)); player.resetTitle(); player.sendTitle(caughtTitle, caughtSubTitle); this.lastFishingTitle = plugin.getConfig().getString("titles.success.title"); this.lastFishingSubTitle = plugin.getConfig().getString("titles.success.subTitle"); player.setTitleTimes(0, 60, 0); new BukkitRunnable() { @Override public void run() { if (!(lastFishingSubTitle.equals(fishingSubTitle) && lastFishingTitle.equals(fishingTitle))) this.cancel(); else if (player.getItemInHand() != null && player.getItemInHand().getType() == Material.FISHING_ROD) { String awaitTitle = plugin.utils .color(plugin.getConfig().getString("titles.awaitFishing.title")); String awaitSubTitle = plugin.utils .color(plugin.getConfig().getString("titles.awaitFishing.subTitle")); player.sendTitle(awaitTitle, awaitSubTitle); player.setTitleTimes(0, Integer.MAX_VALUE, 0); } } }.runTaskLater(plugin, 50); player.getInventory().addItem(event.getReward()); } @SuppressWarnings("deprecation") @EventHandler public void rodHeld(PlayerItemHeldEvent event) { Player player = event.getPlayer(); if (player.getInventory().getItem(event.getNewSlot()) != null && player.getInventory().getItem(event.getNewSlot()).getType() == Material.FISHING_ROD) { WorldGuardPlugin wg = WorldGuardPlugin.inst(); RegionManager rm = wg.getRegionManager(player.getWorld()); List regions = plugin.getConfig().getStringList("regions"); boolean fishingRegion = false; for (String loopRegion : regions) { ProtectedRegion region = rm.getRegion(loopRegion); if (region != null && region.contains(player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ())) fishingRegion = true; } if (fishingRegion) { player.resetTitle(); String title = plugin.utils.color(plugin.getConfig().getString("titles.awaitFishing.title")); String subTitle = plugin.utils.color(plugin.getConfig().getString("titles.awaitFishing.subTitle")); player.sendTitle(title, subTitle); player.setTitleTimes(0, Integer.MAX_VALUE, 0); } } else { if (plugin.playerFishingState.containsKey(player.getUniqueId())) { plugin.playerFishingState.remove(player.getUniqueId()); } if (plugin.fishingTimes.containsKey(player.getUniqueId())) plugin.fishingTimes.remove(player.getUniqueId()); WorldGuardPlugin wg = WorldGuardPlugin.inst(); RegionManager rm = wg.getRegionManager(player.getWorld()); List regions = plugin.getConfig().getStringList("regions"); boolean fishingRegion = false; for (String loopRegion : regions) { ProtectedRegion region = rm.getRegion(loopRegion); if (region != null && region.contains(player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ())) fishingRegion = true; } if (fishingRegion) { player.sendTitle("", ""); } } } @SuppressWarnings("deprecation") @EventHandler public void regionLeave(RegionLeaveEvent event) { if (Utils.getRegions().contains(event.getRegion().getId())) { event.getPlayer().sendTitle("", ""); } } @SuppressWarnings("deprecation") @EventHandler public void regionEnter(RegionEnterEvent event) { if (Utils.getRegions().contains(event.getRegion().getId())) { Player player = event.getPlayer(); if (player.getItemInHand() != null && player.getItemInHand().getType() == Material.FISHING_ROD && !(plugin.playerFishingState.containsKey(player.getUniqueId()) && plugin.playerFishingState.get(player.getUniqueId()).equals("FISHING"))) { String title = plugin.utils.color(plugin.getConfig().getString("titles.awaitFishing.title")); String subTitle = plugin.utils.color(plugin.getConfig().getString("titles.awaitFishing.subTitle")); player.sendTitle(title, subTitle); player.setTitleTimes(0, Integer.MAX_VALUE, 0); } } } public static void setFishingTime(FishHook hook, int time) { final EntityFishingHook hookCopy = (EntityFishingHook) ((CraftEntity) hook).getHandle(); try { fishCatchTime.setInt(hookCopy, time * 20); } catch (IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } } @EventHandler public void test(PlayerMoveEvent event) { System.out.println("GAY"); } }