Prevent lava fishing and the start of lava fishing from having multiple active instances per player

This commit is contained in:
Teriuihi 2023-09-28 01:48:21 +02:00
parent dc6a233c1b
commit 173324c68f
2 changed files with 56 additions and 23 deletions

View File

@ -13,9 +13,7 @@ import com.alttd.fishingevent.util.Logger;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.Item; import org.bukkit.entity.Item;
@ -23,6 +21,7 @@ import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerFishEvent; import org.bukkit.event.player.PlayerFishEvent;
import org.bukkit.event.player.PlayerItemHeldEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.Damageable;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
@ -37,6 +36,7 @@ public class CatchFish implements Listener {
private final EventManager eventManager = EventManager.getInstance(); private final EventManager eventManager = EventManager.getInstance();
private final FishingEvent fishingEvent; private final FishingEvent fishingEvent;
private final HashMap<UUID, LavaFishing> activeLavaFishers = new HashMap<>(); private final HashMap<UUID, LavaFishing> activeLavaFishers = new HashMap<>();
private final HashMap<UUID, BukkitRunnable> activeFishers = new HashMap<>();
public CatchFish(FishingEvent fishingEvent, Logger logger, FishGenerator waterFishGenerator, PointsManagement pointsManagement) { public CatchFish(FishingEvent fishingEvent, Logger logger, FishGenerator waterFishGenerator, PointsManagement pointsManagement) {
this.fishingEvent = fishingEvent; this.fishingEvent = fishingEvent;
@ -46,6 +46,21 @@ public class CatchFish implements Listener {
logger.debug("Registered PlayerFishEvent listener"); logger.debug("Registered PlayerFishEvent listener");
} }
@EventHandler
public void onItemSwitch(PlayerItemHeldEvent event) {
Player player = event.getPlayer();
if (player.getInventory().getItem(event.getNewSlot()) != null) {
return;
}
UUID uuid = player.getUniqueId();
stopLavaFishStart(uuid);
LavaFishing lavaFishing = activeLavaFishers.get(uuid);
if (lavaFishing == null)
return;
lavaFishing.cancel();
activeLavaFishers.remove(uuid);
}
@EventHandler @EventHandler
public void onPlayerFish(PlayerFishEvent event) { public void onPlayerFish(PlayerFishEvent event) {
if (!eventManager.isRunning()) { if (!eventManager.isRunning()) {
@ -58,11 +73,14 @@ public class CatchFish implements Listener {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
UUID uuid = player.getUniqueId();
if (event.getState().equals(PlayerFishEvent.State.FISHING)) { if (event.getState().equals(PlayerFishEvent.State.FISHING)) {
//if fishing rod in lava continue else return BukkitRunnable bukkitRunnable = new BukkitRunnable() {
new BukkitRunnable() {
@Override @Override
public void run() { public void run() {
if (activeFishers.containsKey(uuid)) {
activeFishers.get(uuid).cancel();
}
if (event.getHook().getLocation().getBlock().getType().equals(Material.LAVA)) { if (event.getHook().getLocation().getBlock().getType().equals(Material.LAVA)) {
player.sendActionBar(MiniMessage.miniMessage().deserialize("<gold>You are now fishing in lava...</gold>")); //TODO move to config player.sendActionBar(MiniMessage.miniMessage().deserialize("<gold>You are now fishing in lava...</gold>")); //TODO move to config
Optional<ItemStack> optionalFishingRod = getFishingRod(player); Optional<ItemStack> optionalFishingRod = getFishingRod(player);
@ -74,17 +92,18 @@ public class CatchFish implements Listener {
int lure = itemStack.getEnchantmentLevel(Enchantment.LURE); int lure = itemStack.getEnchantmentLevel(Enchantment.LURE);
int fireProtection = itemStack.getEnchantmentLevel(Enchantment.PROTECTION_FIRE); int fireProtection = itemStack.getEnchantmentLevel(Enchantment.PROTECTION_FIRE);
LavaFishing lavaFishing = new LavaFishing(lure, fireProtection, player, logger, event.getHook().getLocation()); LavaFishing lavaFishing = new LavaFishing(lure, fireProtection, player, logger, event.getHook().getLocation());
activeLavaFishers.put(player.getUniqueId(), lavaFishing); activeLavaFishers.put(uuid, lavaFishing);
lavaFishing.runTaskTimerAsynchronously(fishingEvent, 1, 1); lavaFishing.runTaskTimerAsynchronously(fishingEvent, 1, 1);
logger.debug("in lava above"); logger.debug("in lava above");
} else } else
logger.debug("Not in lava"); logger.debug("Not in lava");
// logger.debug("% might have caught a lava fish", event.getPlayer().getName());
// handleLavaFishCaught(event);
} }
}.runTaskLater(fishingEvent, 50); };
activeFishers.put(uuid, bukkitRunnable);
bukkitRunnable.runTaskLater(fishingEvent, 50);
} else if (event.getState().equals(PlayerFishEvent.State.CAUGHT_FISH)) { } else if (event.getState().equals(PlayerFishEvent.State.CAUGHT_FISH)) {
stopLavaFishStart(uuid);
if (event.getCaught() == null) { if (event.getCaught() == null) {
logger.debug("% caught a water fish but it was null", player.getName()); logger.debug("% caught a water fish but it was null", player.getName());
return; return;
@ -92,14 +111,24 @@ public class CatchFish implements Listener {
logger.debug("% caught a water fish", player.getName()); logger.debug("% caught a water fish", player.getName());
handleFishCaught(event); handleFishCaught(event);
} else if (event.getState().equals(PlayerFishEvent.State.IN_GROUND)) { } else if (event.getState().equals(PlayerFishEvent.State.IN_GROUND)) {
stopLavaFishStart(uuid);
logger.debug("% reeled in fishing rod that was in the ground", player.getName()); logger.debug("% reeled in fishing rod that was in the ground", player.getName());
handleLavaFishCaught(event); handleLavaFishCaught(event);
} else { } else {
stopLavaFishStart(uuid);
logger.debug("Registered different fish state [%]", event.getState().toString()); logger.debug("Registered different fish state [%]", event.getState().toString());
} }
} }
private void stopLavaFishStart(UUID uuid) {
if (!activeFishers.containsKey(uuid)) {
activeFishers.remove(uuid);
return;
}
activeFishers.get(uuid).cancel();
}
private boolean fishingRodBroken(Player player) { private boolean fishingRodBroken(Player player) {
Optional<ItemStack> optionalFishingROd = getFishingRod(player); Optional<ItemStack> optionalFishingROd = getFishingRod(player);
if (optionalFishingROd.isEmpty()) { if (optionalFishingROd.isEmpty()) {
@ -121,14 +150,6 @@ public class CatchFish implements Listener {
.findFirst(); .findFirst();
} }
private void handleLavaFish(PlayerFishEvent event) {
Location location = event.getHook().getLocation();
Block block = location.getWorld().getBlockAt(location.getBlockX(), location.getBlockY() + 1, location.getBlockZ());
if (!block.isLiquid())
return;
//TODO get fish and start timer for it
}
private void handleLavaFishCaught(PlayerFishEvent event) { private void handleLavaFishCaught(PlayerFishEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
LavaFishing lavaFishing = activeLavaFishers.get(player.getUniqueId()); LavaFishing lavaFishing = activeLavaFishers.get(player.getUniqueId());

View File

@ -11,16 +11,19 @@ import org.bukkit.inventory.PlayerInventory;
import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.Damageable;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import java.util.HashMap;
import java.util.Random; import java.util.Random;
import java.util.UUID;
public class LavaFishing extends BukkitRunnable { public class LavaFishing extends BukkitRunnable {
private static HashMap<UUID, LavaFishing> activeFishers = new HashMap<>();
private int timeUntilHooked; private int timeUntilHooked;
private int timeUntilLured; private int timeUntilLured;
private final int lure; private final int lure;
private final int fireProtection; private final int fireProtection;
private final int minWaitTime = 100; private final int minWaitTime = 60;
private final int maxWaitTime = 600; private final int maxWaitTime = 500;
private boolean isBiting; private boolean isBiting;
private int timeUntilHookDamage; private int timeUntilHookDamage;
private boolean shouldDamageHook; private boolean shouldDamageHook;
@ -30,12 +33,17 @@ public class LavaFishing extends BukkitRunnable {
private final Location hookLocation; private final Location hookLocation;
public LavaFishing(int lure, int fireProtection, Player player, Logger logger, Location hookLocation) { public LavaFishing(int lure, int fireProtection, Player player, Logger logger, Location hookLocation) {
UUID uuid = player.getUniqueId();
if (activeFishers.containsKey(uuid)) {
activeFishers.get(uuid).cancel();
}
activeFishers.put(uuid, this);
this.lure = lure; this.lure = lure;
this.fireProtection = Math.min(5, fireProtection); this.fireProtection = Math.min(5, fireProtection);
this.player = player; this.player = player;
this.logger = logger; this.logger = logger;
this.hookLocation = hookLocation; this.hookLocation = hookLocation;
this.shouldDamageHook = fireProtection >= 5; this.shouldDamageHook = fireProtection < 5;
resetTimeUntilHookDamage(); resetTimeUntilHookDamage();
resetTimeUntilLured(); resetTimeUntilLured();
} }
@ -43,16 +51,19 @@ public class LavaFishing extends BukkitRunnable {
private void resetTimeUntilLured() { private void resetTimeUntilLured() {
isBiting = false; isBiting = false;
this.timeUntilLured = random.nextInt(minWaitTime, maxWaitTime); this.timeUntilLured = random.nextInt(minWaitTime, maxWaitTime);
this.timeUntilLured = Math.max(timeUntilLured - this.lure * 100, minWaitTime); this.timeUntilLured = Math.max(timeUntilLured - this.lure * 50, minWaitTime);
} }
private void damageHook() { private void damageHook() {
if (!shouldDamageHook) if (!shouldDamageHook) {
logger.debug("Rod should not be damaged for this player");
return; return;
}
if (timeUntilHookDamage > 0) { if (timeUntilHookDamage > 0) {
timeUntilHookDamage--; timeUntilHookDamage--;
return; return;
} }
logger.debug("Damaging hook...");
resetTimeUntilHookDamage(); resetTimeUntilHookDamage();
PlayerInventory inventory = player.getInventory(); PlayerInventory inventory = player.getInventory();
int fishingRodSlot = findFishingRodSlot(inventory); int fishingRodSlot = findFishingRodSlot(inventory);
@ -67,6 +78,7 @@ public class LavaFishing extends BukkitRunnable {
} }
if (item.getItemMeta() instanceof Damageable damageable) { if (item.getItemMeta() instanceof Damageable damageable) {
int damage = damageable.getDamage(); int damage = damageable.getDamage();
logger.debug("Setting rod damage to %", String.valueOf(damage));
damageable.setDamage(Math.min(++damage, 63)); damageable.setDamage(Math.min(++damage, 63));
item.setItemMeta(damageable); item.setItemMeta(damageable);
} else { } else {
@ -88,7 +100,7 @@ public class LavaFishing extends BukkitRunnable {
} }
private void resetTimeUntilHookDamage() { private void resetTimeUntilHookDamage() {
timeUntilHookDamage = random.nextInt(fireProtection, 5 + fireProtection); timeUntilHookDamage = random.nextInt(fireProtection * 5, 20 + fireProtection * 5);
} }
private void spawnLavaParticles() { private void spawnLavaParticles() {
@ -123,7 +135,7 @@ public class LavaFishing extends BukkitRunnable {
if (this.timeUntilHooked > 0) { if (this.timeUntilHooked > 0) {
this.timeUntilHooked--; this.timeUntilHooked--;
if (timeUntilHooked % 5 == 0) if (timeUntilHooked % 5 == 0)
logger.debug("Time until hooked: %", String.valueOf(timeUntilLured)); logger.debug("Time until hooked: %", String.valueOf(timeUntilHooked));
if (this.timeUntilHooked % 5 == 0) if (this.timeUntilHooked % 5 == 0)
spawnLavaParticles(); spawnLavaParticles();
return; return;