added combat events

This commit is contained in:
YouHaveTrouble
2021-03-12 02:05:29 +01:00
parent f31536395a
commit 477eb7f5de
7 changed files with 156 additions and 14 deletions
@@ -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;
@@ -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
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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<UUID, PlayerData> 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) {
}
}
@@ -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;
}