From 477eb7f5deead3252d72120732f7b3d88dca1e9d Mon Sep 17 00:00:00 2001 From: YouHaveTrouble Date: Fri, 12 Mar 2021 02:05:29 +0100 Subject: [PATCH] added combat events --- .../eu/endermite/togglepvp/TogglePvp.java | 1 - .../endermite/togglepvp/api/TogglePvpAPI.java | 18 +++++++ .../api/event/PlayerEnterCombatEvent.java | 48 +++++++++++++++++++ .../api/event/PlayerLeaveCombatEvent.java | 48 +++++++++++++++++++ .../togglepvp/players/PlayerData.java | 16 +++++-- .../togglepvp/players/PlayerManager.java | 23 +++++++-- .../endermite/togglepvp/util/CombatTimer.java | 16 +++++-- 7 files changed, 156 insertions(+), 14 deletions(-) create mode 100644 src/main/java/eu/endermite/togglepvp/api/event/PlayerEnterCombatEvent.java create mode 100644 src/main/java/eu/endermite/togglepvp/api/event/PlayerLeaveCombatEvent.java diff --git a/src/main/java/eu/endermite/togglepvp/TogglePvp.java b/src/main/java/eu/endermite/togglepvp/TogglePvp.java index dc6fd25..164f79f 100644 --- a/src/main/java/eu/endermite/togglepvp/TogglePvp.java +++ b/src/main/java/eu/endermite/togglepvp/TogglePvp.java @@ -8,7 +8,6 @@ import eu.endermite.togglepvp.util.Listener; import eu.endermite.togglepvp.util.DatabaseSQLite; import lombok.Getter; import org.bstats.bukkit.Metrics; -import org.bstats.charts.CustomChart; import org.bukkit.command.CommandSender; import org.bukkit.plugin.java.JavaPlugin; import org.reflections.Reflections; diff --git a/src/main/java/eu/endermite/togglepvp/api/TogglePvpAPI.java b/src/main/java/eu/endermite/togglepvp/api/TogglePvpAPI.java index 78da37e..02433ef 100644 --- a/src/main/java/eu/endermite/togglepvp/api/TogglePvpAPI.java +++ b/src/main/java/eu/endermite/togglepvp/api/TogglePvpAPI.java @@ -74,6 +74,24 @@ public class TogglePvpAPI { return TogglePvp.getPlugin().getPlayerManager().hasLoginProtection(uuid); } + /** + * Checks if player has teleport protection. + * @param player Player to check + * @return True if player has teleport protection, false if not + */ + public static boolean hasTeleportProtection(Player player) { + return TogglePvp.getPlugin().getPlayerManager().hasLoginProtection(player.getUniqueId()); + } + + /** + * Checks if player has teleport protection. + * @param uuid UUID of player to check + * @return True if player has teleport protection, false if not + */ + public static boolean hasTeleportProtection(UUID uuid) { + return TogglePvp.getPlugin().getPlayerManager().hasLoginProtection(uuid); + } + /** * Checks if player has login protection. * @param player Player to check diff --git a/src/main/java/eu/endermite/togglepvp/api/event/PlayerEnterCombatEvent.java b/src/main/java/eu/endermite/togglepvp/api/event/PlayerEnterCombatEvent.java new file mode 100644 index 0000000..56b48c4 --- /dev/null +++ b/src/main/java/eu/endermite/togglepvp/api/event/PlayerEnterCombatEvent.java @@ -0,0 +1,48 @@ +package eu.endermite.togglepvp.api.event; + +import eu.endermite.togglepvp.TogglePvp; +import eu.endermite.togglepvp.players.PlayerData; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +/** + * Fired when player enters combat. + */ +public class PlayerEnterCombatEvent extends Event implements Cancellable { + + private static final HandlerList HANDLERS = new HandlerList(); + private final Player player; + private boolean cancelled; + + public PlayerEnterCombatEvent(Player player) { + this.player = player; + this.cancelled = false; + } + + public Player getPlayer() { + return player; + } + + public PlayerData getPlayerData() { + return TogglePvp.getPlugin().getPlayerManager().getPlayer(player.getUniqueId()); + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + cancelled = cancel; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return HANDLERS; + } +} diff --git a/src/main/java/eu/endermite/togglepvp/api/event/PlayerLeaveCombatEvent.java b/src/main/java/eu/endermite/togglepvp/api/event/PlayerLeaveCombatEvent.java new file mode 100644 index 0000000..070e506 --- /dev/null +++ b/src/main/java/eu/endermite/togglepvp/api/event/PlayerLeaveCombatEvent.java @@ -0,0 +1,48 @@ +package eu.endermite.togglepvp.api.event; + +import eu.endermite.togglepvp.TogglePvp; +import eu.endermite.togglepvp.players.PlayerData; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +/** + * Fired when player leaves combat. If cancelled, it will refresh combat timer to the value set in the config. + */ +public class PlayerLeaveCombatEvent extends Event implements Cancellable { + + private static final HandlerList HANDLERS = new HandlerList(); + private final Player player; + private boolean cancelled; + + public PlayerLeaveCombatEvent(Player player) { + this.player = player; + this.cancelled = false; + } + + public Player getPlayer() { + return player; + } + + public PlayerData getPlayerData() { + return TogglePvp.getPlugin().getPlayerManager().getPlayer(player.getUniqueId()); + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + cancelled = cancel; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return HANDLERS; + } +} diff --git a/src/main/java/eu/endermite/togglepvp/players/PlayerData.java b/src/main/java/eu/endermite/togglepvp/players/PlayerData.java index ed9554b..5c4afe5 100644 --- a/src/main/java/eu/endermite/togglepvp/players/PlayerData.java +++ b/src/main/java/eu/endermite/togglepvp/players/PlayerData.java @@ -6,17 +6,15 @@ import java.time.Instant; public class PlayerData { - private long cachetime, combattime; - private boolean pvpEnabled; - private boolean lastCombatCheck; - private long loginTimestamp; - private long teleportTimestamp; + private long cachetime, combattime, loginTimestamp, teleportTimestamp; + private boolean pvpEnabled, lastCombatCheck, inCombat; public PlayerData(boolean pvpEnabled) { this.pvpEnabled = pvpEnabled; this.combattime = Instant.now().getEpochSecond()-1; this.loginTimestamp = Instant.now().getEpochSecond()-1; this.teleportTimestamp = Instant.now().getEpochSecond()-1; + this.inCombat = false; refreshCachetime(); } @@ -71,4 +69,12 @@ public class PlayerData { public long getTeleportTimestamp() { return teleportTimestamp; } + + public boolean isInCombat() { + return inCombat; + } + + public void setInCombat(boolean inCombat) { + this.inCombat = inCombat; + } } diff --git a/src/main/java/eu/endermite/togglepvp/players/PlayerManager.java b/src/main/java/eu/endermite/togglepvp/players/PlayerManager.java index b26c4b5..3f16e69 100644 --- a/src/main/java/eu/endermite/togglepvp/players/PlayerManager.java +++ b/src/main/java/eu/endermite/togglepvp/players/PlayerManager.java @@ -1,6 +1,7 @@ package eu.endermite.togglepvp.players; import eu.endermite.togglepvp.TogglePvp; +import eu.endermite.togglepvp.api.event.PlayerLeaveCombatEvent; import eu.endermite.togglepvp.config.ConfigCache; import eu.endermite.togglepvp.util.CombatTimer; import eu.endermite.togglepvp.util.PluginMessages; @@ -29,10 +30,20 @@ public class PlayerManager { combatTrackerTask = Bukkit.getScheduler().runTaskTimerAsynchronously(TogglePvp.getPlugin(), () -> { for (Map.Entry set : playerList.entrySet()) { UUID uuid = set.getKey(); + PlayerData playerData = set.getValue(); if (!CombatTimer.isInCombat(uuid)) { - if (set.getValue().getLastCombatCheck()) { - set.getValue().setLastCombatCheck(false); - PluginMessages.sendActionBar(uuid, TogglePvp.getPlugin().getConfigCache().getLeaving_combat()); + if (playerData.getLastCombatCheck()) { + PlayerLeaveCombatEvent playerLeaveCombatEvent = new PlayerLeaveCombatEvent(Bukkit.getPlayer(uuid)); + Bukkit.getPluginManager().callEvent(playerLeaveCombatEvent); + + if (playerLeaveCombatEvent.isCancelled()) { + playerData.refreshCombatTime(); + return; + } else { + playerData.setLastCombatCheck(false); + playerData.setInCombat(false); + PluginMessages.sendActionBar(uuid, TogglePvp.getPlugin().getConfigCache().getLeaving_combat()); + } } } else { set.getValue().setLastCombatCheck(true); @@ -47,7 +58,11 @@ public class PlayerManager { public void refreshPlayersCombatTime(UUID uuid) { try { - playerList.get(uuid).refreshCombatTime(); + PlayerData data = playerList.get(uuid); + if (data == null) + return; + data.refreshCombatTime(); + data.setInCombat(true); } catch (Exception ignored) { } } diff --git a/src/main/java/eu/endermite/togglepvp/util/CombatTimer.java b/src/main/java/eu/endermite/togglepvp/util/CombatTimer.java index e63f0e2..3b08b0c 100644 --- a/src/main/java/eu/endermite/togglepvp/util/CombatTimer.java +++ b/src/main/java/eu/endermite/togglepvp/util/CombatTimer.java @@ -1,6 +1,10 @@ package eu.endermite.togglepvp.util; import eu.endermite.togglepvp.TogglePvp; +import eu.endermite.togglepvp.api.event.PlayerEnterCombatEvent; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + import java.time.Instant; import java.util.UUID; @@ -11,9 +15,15 @@ public class CombatTimer { long now = Instant.now().getEpochSecond(); long combattime = TogglePvp.getPlugin().getSmartCache().getPlayerData(uuid).getCombattime(); if (combattime < now) { + Player player = Bukkit.getPlayer(uuid); + PlayerEnterCombatEvent playerEnterCombatEvent = new PlayerEnterCombatEvent(player); + Bukkit.getPluginManager().callEvent(playerEnterCombatEvent); + if (playerEnterCombatEvent.isCancelled()) + return; + + TogglePvp.getPlugin().getPlayerManager().refreshPlayersCombatTime(uuid); PluginMessages.sendActionBar(uuid, TogglePvp.getPlugin().getConfigCache().getEntering_combat()); } - TogglePvp.getPlugin().getPlayerManager().refreshPlayersCombatTime(uuid); } catch (Exception ignored) {} } @@ -24,9 +34,7 @@ public class CombatTimer { public static boolean isInCombat(UUID uuid) { try { - long combattimer = TogglePvp.getPlugin().getPlayerManager().getPlayer(uuid).getCombattime(); - long now = Instant.now().getEpochSecond(); - return combattimer > now; + return TogglePvp.getPlugin().getPlayerManager().getPlayer(uuid).isInCombat(); } catch (Exception e) { return false; }