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 eu.endermite.togglepvp.util.DatabaseSQLite;
import lombok.Getter; import lombok.Getter;
import org.bstats.bukkit.Metrics; import org.bstats.bukkit.Metrics;
import org.bstats.charts.CustomChart;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.reflections.Reflections; import org.reflections.Reflections;
@@ -74,6 +74,24 @@ public class TogglePvpAPI {
return TogglePvp.getPlugin().getPlayerManager().hasLoginProtection(uuid); 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. * Checks if player has login protection.
* @param player Player to check * @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 { public class PlayerData {
private long cachetime, combattime; private long cachetime, combattime, loginTimestamp, teleportTimestamp;
private boolean pvpEnabled; private boolean pvpEnabled, lastCombatCheck, inCombat;
private boolean lastCombatCheck;
private long loginTimestamp;
private long teleportTimestamp;
public PlayerData(boolean pvpEnabled) { public PlayerData(boolean pvpEnabled) {
this.pvpEnabled = pvpEnabled; this.pvpEnabled = pvpEnabled;
this.combattime = Instant.now().getEpochSecond()-1; this.combattime = Instant.now().getEpochSecond()-1;
this.loginTimestamp = Instant.now().getEpochSecond()-1; this.loginTimestamp = Instant.now().getEpochSecond()-1;
this.teleportTimestamp = Instant.now().getEpochSecond()-1; this.teleportTimestamp = Instant.now().getEpochSecond()-1;
this.inCombat = false;
refreshCachetime(); refreshCachetime();
} }
@@ -71,4 +69,12 @@ public class PlayerData {
public long getTeleportTimestamp() { public long getTeleportTimestamp() {
return teleportTimestamp; return teleportTimestamp;
} }
public boolean isInCombat() {
return inCombat;
}
public void setInCombat(boolean inCombat) {
this.inCombat = inCombat;
}
} }
@@ -1,6 +1,7 @@
package eu.endermite.togglepvp.players; package eu.endermite.togglepvp.players;
import eu.endermite.togglepvp.TogglePvp; import eu.endermite.togglepvp.TogglePvp;
import eu.endermite.togglepvp.api.event.PlayerLeaveCombatEvent;
import eu.endermite.togglepvp.config.ConfigCache; import eu.endermite.togglepvp.config.ConfigCache;
import eu.endermite.togglepvp.util.CombatTimer; import eu.endermite.togglepvp.util.CombatTimer;
import eu.endermite.togglepvp.util.PluginMessages; import eu.endermite.togglepvp.util.PluginMessages;
@@ -29,10 +30,20 @@ public class PlayerManager {
combatTrackerTask = Bukkit.getScheduler().runTaskTimerAsynchronously(TogglePvp.getPlugin(), () -> { combatTrackerTask = Bukkit.getScheduler().runTaskTimerAsynchronously(TogglePvp.getPlugin(), () -> {
for (Map.Entry<UUID, PlayerData> set : playerList.entrySet()) { for (Map.Entry<UUID, PlayerData> set : playerList.entrySet()) {
UUID uuid = set.getKey(); UUID uuid = set.getKey();
PlayerData playerData = set.getValue();
if (!CombatTimer.isInCombat(uuid)) { if (!CombatTimer.isInCombat(uuid)) {
if (set.getValue().getLastCombatCheck()) { if (playerData.getLastCombatCheck()) {
set.getValue().setLastCombatCheck(false); PlayerLeaveCombatEvent playerLeaveCombatEvent = new PlayerLeaveCombatEvent(Bukkit.getPlayer(uuid));
PluginMessages.sendActionBar(uuid, TogglePvp.getPlugin().getConfigCache().getLeaving_combat()); 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 { } else {
set.getValue().setLastCombatCheck(true); set.getValue().setLastCombatCheck(true);
@@ -47,7 +58,11 @@ public class PlayerManager {
public void refreshPlayersCombatTime(UUID uuid) { public void refreshPlayersCombatTime(UUID uuid) {
try { try {
playerList.get(uuid).refreshCombatTime(); PlayerData data = playerList.get(uuid);
if (data == null)
return;
data.refreshCombatTime();
data.setInCombat(true);
} catch (Exception ignored) { } catch (Exception ignored) {
} }
} }
@@ -1,6 +1,10 @@
package eu.endermite.togglepvp.util; package eu.endermite.togglepvp.util;
import eu.endermite.togglepvp.TogglePvp; 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.time.Instant;
import java.util.UUID; import java.util.UUID;
@@ -11,9 +15,15 @@ public class CombatTimer {
long now = Instant.now().getEpochSecond(); long now = Instant.now().getEpochSecond();
long combattime = TogglePvp.getPlugin().getSmartCache().getPlayerData(uuid).getCombattime(); long combattime = TogglePvp.getPlugin().getSmartCache().getPlayerData(uuid).getCombattime();
if (combattime < now) { 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()); PluginMessages.sendActionBar(uuid, TogglePvp.getPlugin().getConfigCache().getEntering_combat());
} }
TogglePvp.getPlugin().getPlayerManager().refreshPlayersCombatTime(uuid);
} catch (Exception ignored) {} } catch (Exception ignored) {}
} }
@@ -24,9 +34,7 @@ public class CombatTimer {
public static boolean isInCombat(UUID uuid) { public static boolean isInCombat(UUID uuid) {
try { try {
long combattimer = TogglePvp.getPlugin().getPlayerManager().getPlayer(uuid).getCombattime(); return TogglePvp.getPlugin().getPlayerManager().getPlayer(uuid).isInCombat();
long now = Instant.now().getEpochSecond();
return combattimer > now;
} catch (Exception e) { } catch (Exception e) {
return false; return false;
} }