Remove several game listeners and utility files

The commit includes the deletion of several listeners and utility files. These were mainly related to handling specific game events such as interactions with lava and fireworks, combat commands, and actions related to player pets and mounts. The removal is due to refactoring damage source check system
This commit is contained in:
2024-02-14 20:22:07 +01:00
parent 8df1fe54e4
commit b9e2aefc40
49 changed files with 233 additions and 1763 deletions
@@ -23,7 +23,6 @@ public final class PreventStabby extends JavaPlugin {
@Override
public void onEnable() {
plugin = this;
Util.initData();
reloadPluginConfig();
playerManager = new PlayerManager(this);
damageCheck = new DamageCheck(this);
@@ -1,13 +1,7 @@
package me.youhavetrouble.preventstabby.api;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.players.PlayerData;
import me.youhavetrouble.preventstabby.util.CombatTimer;
import me.youhavetrouble.preventstabby.util.PvpState;
import org.bukkit.entity.Player;
import javax.annotation.Nullable;
import java.util.UUID;
public class PreventStabbyAPI {
@@ -13,7 +13,7 @@ public class GlobalToggleCommand {
public static void globalToggle(CommandSender sender, String[] args) {
Bukkit.getScheduler().runTaskAsynchronously(PreventStabby.getPlugin(), () -> {
if (!PreventStabbyPermission.COMMAND_GLOBAL_TOGGLE.doesCommandSenderHave(sender)) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().getNo_permission());
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().no_permission);
return;
}
@@ -27,15 +27,15 @@ public class GlobalToggleCommand {
switch (pvpState) {
case ENABLED:
PreventStabby.getPlugin().getPlayerManager().setForcedPvpState(PvpState.ENABLED);
PluginMessages.broadcastMessage(PreventStabby.getPlugin().getConfigCache().getForce_pvp_on());
PluginMessages.broadcastMessage(PreventStabby.getPlugin().getConfigCache().force_pvp_on);
break;
case DISABLED:
PreventStabby.getPlugin().getPlayerManager().setForcedPvpState(PvpState.DISABLED);
PluginMessages.broadcastMessage(PreventStabby.getPlugin().getConfigCache().getForce_pvp_off());
PluginMessages.broadcastMessage(PreventStabby.getPlugin().getConfigCache().force_pvp_off);
break;
case NONE:
PreventStabby.getPlugin().getPlayerManager().setForcedPvpState(PvpState.NONE);
PluginMessages.broadcastMessage(PreventStabby.getPlugin().getConfigCache().getForce_pvp_none());
PluginMessages.broadcastMessage(PreventStabby.getPlugin().getConfigCache().force_pvp_none);
break;
default:
PluginMessages.sendMessage(sender, "Try /pvp override <enabled/disabled/none>");
@@ -12,7 +12,7 @@ public class HelpCommand {
Bukkit.getScheduler().runTaskAsynchronously(PreventStabby.getPlugin(), () -> {
if (!PreventStabbyPermission.COMMAND_HELP.doesCommandSenderHave(sender)) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().getNo_permission());
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().no_permission);
return;
}
@@ -28,7 +28,7 @@ public class HelpCommand {
.append(Component.newline())
.append(PluginMessages.MINIMESSAGE.deserialize("<blue>/pvp <aqua><bold>toggle</bold> <white>- toggles PvP status"));
}
PreventStabby.getAudiences().sender(sender).sendMessage(helpComponent);
sender.sendMessage(helpComponent);
});
}
@@ -33,7 +33,7 @@ public class MainCommand implements TabExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!sender.hasPermission("preventstabby.command")) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().getNo_permission());
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().no_permission);
return true;
}
if (args.length == 0) {
@@ -63,7 +63,7 @@ public class MainCommand implements TabExecutor {
GlobalToggleCommand.globalToggle(sender, args);
break;
default:
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().getNo_such_command());
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().no_such_command);
break;
}
return true;
@@ -3,7 +3,7 @@ package me.youhavetrouble.preventstabby.commands;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.api.event.PlayerTogglePvpEvent;
import me.youhavetrouble.preventstabby.config.PreventStabbyPermission;
import me.youhavetrouble.preventstabby.util.CombatTimer;
import me.youhavetrouble.preventstabby.players.PlayerManager;
import me.youhavetrouble.preventstabby.util.PluginMessages;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
@@ -11,46 +11,47 @@ import org.bukkit.entity.Player;
public class PvpToggleCommand {
private static final PlayerManager playerManager = PreventStabby.getPlugin().getPlayerManager();
public static void toggle(CommandSender sender, String[] args) {
Bukkit.getScheduler().runTaskAsynchronously(PreventStabby.getPlugin(), () -> {
if (!PreventStabbyPermission.COMMAND_TOGGLE.doesCommandSenderHave(sender)) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().getNo_permission());
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().no_permission);
return;
}
if (args.length <= 1) {
if (!(sender instanceof Player)) {
if (!(sender instanceof Player player)) {
PluginMessages.sendMessage(sender, "Try /pvp toggle <player>");
return;
}
Player player = (Player) sender;
if (CombatTimer.isInCombat(player.getUniqueId())) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().getCant_do_that_during_combat());
if (playerManager.getPlayer(player.getUniqueId()).isInCombat()) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().cant_do_that_during_combat);
return;
}
boolean currentState = PreventStabby.getPlugin().getPlayerManager().togglePlayerPvpState(player.getUniqueId());
PlayerTogglePvpEvent toggleEvent = new PlayerTogglePvpEvent(player, currentState, true);
Bukkit.getScheduler().runTask(PreventStabby.getPlugin(), () -> {
if (PlayerTogglePvpEvent.getHandlerList().getRegisteredListeners().length > 0) {
Bukkit.getPluginManager().callEvent(toggleEvent);
}
if (!toggleEvent.isSendMessage()) return;
if (currentState) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().getPvp_enabled());
} else {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().getPvp_disabled());
}
playerManager.togglePlayerPvpState(player.getUniqueId()).thenAccept(newState -> {
PlayerTogglePvpEvent toggleEvent = new PlayerTogglePvpEvent(player, newState, true);
Bukkit.getScheduler().runTask(PreventStabby.getPlugin(), () -> {
if (PlayerTogglePvpEvent.getHandlerList().getRegisteredListeners().length > 0) {
Bukkit.getPluginManager().callEvent(toggleEvent);
}
if (!toggleEvent.isSendMessage()) return;
if (newState) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().pvp_enabled);
} else {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().pvp_disabled);
}
});
});
} else if (args.length == 2) {
if (!PreventStabbyPermission.COMMAND_TOGGLE_OTHERS.doesCommandSenderHave(sender)) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().getNo_permission());
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().no_permission);
return;
}
if (sender instanceof Player) {
Player player = (Player) sender;
if (CombatTimer.isInCombat(player.getUniqueId())) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().getCant_do_that_during_combat());
if (sender instanceof Player player) {
if (playerManager.getPlayer(player.getUniqueId()).isInCombat()) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().cant_do_that_during_combat);
return;
}
}
@@ -60,67 +61,65 @@ public class PvpToggleCommand {
PluginMessages.sendMessage(sender, "<red>Player offline.");
return;
}
boolean currentState = PreventStabby.getPlugin().getPlayerManager().togglePlayerPvpState(player.getUniqueId());
PlayerTogglePvpEvent toggleEvent = new PlayerTogglePvpEvent(player, currentState, false);
Bukkit.getScheduler().runTask(PreventStabby.getPlugin(), () -> {
if (PlayerTogglePvpEvent.getHandlerList().getRegisteredListeners().length > 0) {
Bukkit.getPluginManager().callEvent(toggleEvent);
}
if (toggleEvent.isSendMessage()) {
if (currentState) {
PluginMessages.sendMessage(player, PreventStabby.getPlugin().getConfigCache().getPvp_enabled());
} else {
PluginMessages.sendMessage(player, PreventStabby.getPlugin().getConfigCache().getPvp_disabled());
playerManager.togglePlayerPvpState(player.getUniqueId()).thenAccept(newState -> {
PlayerTogglePvpEvent toggleEvent = new PlayerTogglePvpEvent(player, newState, false);
Bukkit.getScheduler().runTask(PreventStabby.getPlugin(), () -> {
if (PlayerTogglePvpEvent.getHandlerList().getRegisteredListeners().length > 0) {
Bukkit.getPluginManager().callEvent(toggleEvent);
}
}
if (toggleEvent.isSendMessage()) {
if (newState) {
PluginMessages.sendMessage(player, PreventStabby.getPlugin().getConfigCache().pvp_enabled);
} else {
PluginMessages.sendMessage(player, PreventStabby.getPlugin().getConfigCache().pvp_disabled);
}
}
String message;
if (newState) {
message = PreventStabby.getPlugin().getConfigCache().pvp_enabled_other;
} else {
message = PreventStabby.getPlugin().getConfigCache().pvp_disabled_other;
}
PluginMessages.sendMessage(sender, PluginMessages.parsePlayerName(player, message));
});
});
String message;
if (currentState) {
message = PreventStabby.getPlugin().getConfigCache().getPvp_enabled_other();
} else {
message = PreventStabby.getPlugin().getConfigCache().getPvp_disabled_other();
}
PluginMessages.sendMessage(sender, PluginMessages.parsePlayerName(player, message));
}
});
}
public static void enable(CommandSender sender, String[] args) {
if (!PreventStabbyPermission.COMMAND_TOGGLE.doesCommandSenderHave(sender)) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().getNo_permission());
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().no_permission);
return;
}
if (args.length == 1) {
if (!(sender instanceof Player)) {
if (!(sender instanceof Player player)) {
PluginMessages.sendMessage(sender, "Try /pvp enable <player>");
return;
}
Player player = (Player) sender;
if (CombatTimer.isInCombat(player.getUniqueId())) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().getCant_do_that_during_combat());
if (playerManager.getPlayer(player.getUniqueId()).isInCombat()) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().cant_do_that_during_combat);
return;
}
PreventStabby.getPlugin().getPlayerManager().setPlayerPvpState(player.getUniqueId(), true);
playerManager.setPlayerPvpState(player.getUniqueId(), true);
PlayerTogglePvpEvent toggleEvent = new PlayerTogglePvpEvent(player, true, true);
Bukkit.getScheduler().runTask(PreventStabby.getPlugin(), () -> {
if (PlayerTogglePvpEvent.getHandlerList().getRegisteredListeners().length > 0) {
Bukkit.getPluginManager().callEvent(toggleEvent);
}
if (toggleEvent.isSendMessage()) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().getPvp_enabled());
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().pvp_enabled);
}
});
} else if (args.length == 2) {
if (!PreventStabbyPermission.COMMAND_TOGGLE_OTHERS.doesCommandSenderHave(sender)) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().getNo_permission());
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().no_permission);
return;
}
if (sender instanceof Player) {
Player player = (Player) sender;
if (CombatTimer.isInCombat(player.getUniqueId())) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().getCant_do_that_during_combat());
if (sender instanceof Player player) {
if (playerManager.getPlayer(player.getUniqueId()).isInCombat()) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().cant_do_that_during_combat);
return;
}
}
@@ -129,16 +128,16 @@ public class PvpToggleCommand {
PluginMessages.sendMessage(sender, "<red>Player offline.");
return;
}
String message = PreventStabby.getPlugin().getConfigCache().getPvp_enabled_other();
String message = PreventStabby.getPlugin().getConfigCache().pvp_enabled_other;
PluginMessages.sendMessage(sender, PluginMessages.parsePlayerName(player, message));
PreventStabby.getPlugin().getPlayerManager().setPlayerPvpState(player.getUniqueId(), true);
playerManager.setPlayerPvpState(player.getUniqueId(), true);
PlayerTogglePvpEvent toggleEvent = new PlayerTogglePvpEvent(player, true, false);
Bukkit.getScheduler().runTask(PreventStabby.getPlugin(), () -> {
if (PlayerTogglePvpEvent.getHandlerList().getRegisteredListeners().length > 0) {
Bukkit.getPluginManager().callEvent(toggleEvent);
}
if (toggleEvent.isSendMessage()) {
PluginMessages.sendMessage(player, PreventStabby.getPlugin().getConfigCache().getPvp_enabled());
PluginMessages.sendMessage(player, PreventStabby.getPlugin().getConfigCache().pvp_enabled);
}
});
} else {
@@ -152,24 +151,23 @@ public class PvpToggleCommand {
public static void disable(CommandSender sender, String[] args) {
if (!PreventStabbyPermission.COMMAND_TOGGLE.doesCommandSenderHave(sender)) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().getNo_permission());
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().no_permission);
return;
}
if (args.length == 1) {
if (sender instanceof Player) {
Player player = (Player) sender;
if (CombatTimer.isInCombat(player.getUniqueId())) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().getCant_do_that_during_combat());
if (sender instanceof Player player) {
if (playerManager.getPlayer(player.getUniqueId()).isInCombat()) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().cant_do_that_during_combat);
return;
}
PreventStabby.getPlugin().getPlayerManager().setPlayerPvpState(player.getUniqueId(), false);
playerManager.setPlayerPvpState(player.getUniqueId(), false);
PlayerTogglePvpEvent toggleEvent = new PlayerTogglePvpEvent(player, false, true);
Bukkit.getScheduler().runTask(PreventStabby.getPlugin(), () -> {
if (PlayerTogglePvpEvent.getHandlerList().getRegisteredListeners().length > 0) {
Bukkit.getPluginManager().callEvent(toggleEvent);
}
if (toggleEvent.isSendMessage()) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().getPvp_disabled());
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().pvp_disabled);
}
});
} else {
@@ -177,13 +175,12 @@ public class PvpToggleCommand {
}
} else if (args.length == 2) {
if (!PreventStabbyPermission.COMMAND_TOGGLE_OTHERS.doesCommandSenderHave(sender)) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().getNo_permission());
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().no_permission);
return;
}
if (sender instanceof Player) {
Player player = (Player) sender;
if (CombatTimer.isInCombat(player.getUniqueId())) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().getCant_do_that_during_combat());
if (sender instanceof Player player) {
if (playerManager.getPlayer(player.getUniqueId()).isInCombat()) {
PluginMessages.sendMessage(sender, PreventStabby.getPlugin().getConfigCache().cant_do_that_during_combat);
return;
}
}
@@ -192,16 +189,16 @@ public class PvpToggleCommand {
PluginMessages.sendMessage(sender, "<red>Player offline.");
return;
}
String message = PreventStabby.getPlugin().getConfigCache().getPvp_disabled_other();
String message = PreventStabby.getPlugin().getConfigCache().pvp_disabled_other;
PluginMessages.sendMessage(sender, PluginMessages.parsePlayerName(player, message));
PreventStabby.getPlugin().getPlayerManager().setPlayerPvpState(player.getUniqueId(), false);
playerManager.setPlayerPvpState(player.getUniqueId(), false);
PlayerTogglePvpEvent toggleEvent = new PlayerTogglePvpEvent(player, false, false);
Bukkit.getScheduler().runTask(PreventStabby.getPlugin(), () -> {
if (PlayerTogglePvpEvent.getHandlerList().getRegisteredListeners().length > 0) {
Bukkit.getPluginManager().callEvent(toggleEvent);
}
if (toggleEvent.isSendMessage()) {
PluginMessages.sendMessage(player, PreventStabby.getPlugin().getConfigCache().getPvp_disabled());
PluginMessages.sendMessage(player, PreventStabby.getPlugin().getConfigCache().pvp_disabled);
}
});
@@ -11,7 +11,7 @@ public class ReloadCommand {
public static void reload(CommandSender sender) {
Bukkit.getScheduler().runTaskAsynchronously(PreventStabby.getPlugin(), () -> {
if (!PreventStabbyPermission.COMMAND_RELOAD.doesCommandSenderHave(sender)) {
PluginMessages.parseMessage(sender, PreventStabby.getPlugin().getConfigCache().getNo_permission());
PluginMessages.parseMessage(sender, PreventStabby.getPlugin().getConfigCache().no_permission);
return;
}
PreventStabby.getPlugin().reloadPluginConfig(sender);
@@ -36,40 +36,39 @@ public class PlaceholderApiHook extends PlaceholderExpansion {
@Override
public String onRequest(OfflinePlayer player, String params) {
switch (params) {
case "pvp":
if (!player.isOnline()) return String.valueOf(false);
return String.valueOf(plugin.getPlayerManager().getPlayer(player.getUniqueId()).isPvpEnabled());
case "combat_time":
return getCombatTimePlaceholder(player.getUniqueId(), player);
case "in_combat":
if (!player.isOnline()) return String.valueOf(false);
return String.valueOf(plugin.getPlayerManager().getPlayer(player.getUniqueId()).isInCombat());
case "pvp_forced":
switch (PreventStabby.getPlugin().getPlayerManager().getForcedPvpState()) {
case NONE:
return legacyComponentSerializer.serialize(PluginMessages.parseMessage(plugin.getConfigCache().getPlaceholder_pvp_forced_none()));
case ENABLED:
return legacyComponentSerializer.serialize(PluginMessages.parseMessage(plugin.getConfigCache().getPlaceholder_pvp_forced_true()));
case DISABLED:
return legacyComponentSerializer.serialize(PluginMessages.parseMessage(plugin.getConfigCache().getPlaceholder_pvp_forced_false()));
}
default:
return null;
}
return switch (params) {
case "pvp" -> {
if (!player.isOnline()) yield String.valueOf(false);
yield String.valueOf(plugin.getPlayerManager().getPlayer(player.getUniqueId()).isPvpEnabled());
}
case "combat_time" -> getCombatTimePlaceholder(player.getUniqueId(), player);
case "in_combat" -> {
if (!player.isOnline()) yield String.valueOf(false);
yield String.valueOf(plugin.getPlayerManager().getPlayer(player.getUniqueId()).isInCombat());
}
case "pvp_forced" -> switch (PreventStabby.getPlugin().getPlayerManager().getForcedPvpState()) {
case NONE ->
legacyComponentSerializer.serialize(PluginMessages.parseMessage(plugin.getConfigCache().placeholder_pvp_forced_none));
case ENABLED ->
legacyComponentSerializer.serialize(PluginMessages.parseMessage(plugin.getConfigCache().placeholder_pvp_forced_true));
case DISABLED ->
legacyComponentSerializer.serialize(PluginMessages.parseMessage(plugin.getConfigCache().placeholder_pvp_forced_false));
};
default -> null;
};
}
private String getCombatTimePlaceholder(UUID uuid, OfflinePlayer player) {
if (!player.isOnline()) {
return legacyComponentSerializer.serialize(PluginMessages.parseMessage(plugin.getConfigCache().getPlaceholder_not_in_combat()));
return legacyComponentSerializer.serialize(PluginMessages.parseMessage(plugin.getConfigCache().placeholder_not_in_combat));
}
long seconds = plugin.getPlayerManager().getPlayer(uuid).getCombatTime();
long seconds = plugin.getPlayerManager().getPlayer(uuid).getSecondsLeftUntilCombatEnd();
if (seconds > 0) {
String msg = plugin.getConfigCache().getPlaceholder_combat_time();
String msg = plugin.getConfigCache().placeholder_combat_time;
msg = msg.replaceAll("%time%", String.valueOf(seconds));
return legacyComponentSerializer.serialize(PluginMessages.parseMessage(msg));
}
return legacyComponentSerializer.serialize(PluginMessages.parseMessage(plugin.getConfigCache().getPlaceholder_not_in_combat()));
return legacyComponentSerializer.serialize(PluginMessages.parseMessage(plugin.getConfigCache().placeholder_not_in_combat));
}
}
@@ -1,27 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.mount;
import me.youhavetrouble.preventstabby.util.Util;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent;
import java.util.UUID;
@PreventStabbyListener
public class MountHitByExplosionListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onMountHitByExplosion(org.bukkit.event.entity.EntityDamageByEntityEvent event) {
if (!(event.getDamager() instanceof Player) || event.getEntity().getPassengers().isEmpty()) return;
if (!event.getCause().equals(EntityDamageEvent.DamageCause.ENTITY_EXPLOSION)) return;
UUID damager = event.getDamager().getUniqueId();
Entity mount = event.getEntity();
if (Util.processMountAttack(damager, mount))
event.setCancelled(true);
}
}
@@ -1,30 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.mount;
import me.youhavetrouble.preventstabby.util.Util;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent;
import java.util.UUID;
@PreventStabbyListener
public class MountHitByFireworkListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onMountHitByFireWork(org.bukkit.event.entity.EntityDamageByEntityEvent event) {
if (!(event.getDamager() instanceof Firework) || event.getEntity().getPassengers().isEmpty()) return;
if (!event.getCause().equals(EntityDamageEvent.DamageCause.ENTITY_EXPLOSION)) return;
Firework firework = (Firework) event.getDamager();
if (!(firework.getShooter() instanceof Player)) return;
UUID damager = ((Player) firework.getShooter()).getUniqueId();
Entity mount = event.getEntity();
if (Util.processMountAttack(damager, mount))
event.setCancelled(true);
}
}
@@ -1,40 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.mount;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import me.youhavetrouble.preventstabby.util.Util;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.potion.PotionEffect;
import java.util.UUID;
@PreventStabbyListener
public class MountHitBySplashPotionListener implements Listener {
/**
* If thrown potion applies negative effects and it's thrown by a player
* it will have no effect on a pet of a player with pvp off
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onMountHitBySplashPotion(org.bukkit.event.entity.PotionSplashEvent event) {
if (!(event.getEntity().getShooter() instanceof Player)) return;
boolean harmful = false;
for (PotionEffect effect : event.getPotion().getEffects()) {
if (Util.isPotionEffectHarmful(effect.getType())) {
harmful = true;
break;
}
}
if (!harmful) return;
UUID damager = ((Player) event.getEntity().getShooter()).getUniqueId();
for (LivingEntity entity : event.getAffectedEntities()) {
if (entity.getPassengers().isEmpty()) continue;
if (Util.processMountAttack(damager, entity))
event.setIntensity(entity, 0);
}
}
}
@@ -1,25 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.mount;
import me.youhavetrouble.preventstabby.util.Util;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import java.util.UUID;
@PreventStabbyListener
public class PlayerAttackMountListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerAttackMount(org.bukkit.event.entity.EntityDamageByEntityEvent event) {
if (!(event.getDamager() instanceof Player) || event.getEntity().getPassengers().isEmpty()) return;
Entity entity = event.getEntity();
UUID damager = event.getDamager().getUniqueId();
if (Util.processMountAttack(damager, entity))
event.setCancelled(true);
}
}
@@ -1,28 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.mount;
import me.youhavetrouble.preventstabby.util.Util;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import java.util.UUID;
@PreventStabbyListener
public class PlayerHitMountWithProjectileListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerHitMountWithProjectile(org.bukkit.event.entity.EntityDamageByEntityEvent event) {
if (!(event.getDamager() instanceof Projectile)) return;
Projectile projectile = (Projectile) event.getDamager();
if (!(projectile.getShooter() instanceof Player) || event.getEntity().getPassengers().isEmpty()) return;
Entity entity = event.getEntity();
UUID damager = event.getDamager().getUniqueId();
if (Util.processMountAttack(damager, entity))
event.setCancelled(true);
}
}
@@ -1,40 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.pets;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.util.CombatTimer;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.entity.Tameable;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent;
import java.util.UUID;
@PreventStabbyListener
public class PetHitByExplosionListener implements Listener {
/**
* Cancels explosion damage for pets with pvp off that is caused by players
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPetHitByExplosion(org.bukkit.event.entity.EntityDamageByEntityEvent event) {
if (!(event.getEntity() instanceof Tameable)) return;
if (!event.getCause().equals(EntityDamageEvent.DamageCause.ENTITY_EXPLOSION)) return;
Tameable tameable = (Tameable) event.getEntity();
if (tameable.getOwner() == null) return;
UUID victim = tameable.getOwner().getUniqueId();
try {
UUID damager = UUID.fromString(event.getDamager().getMetadata("PLAYEREXPLODED").get(0).asString());
if (victim.equals(damager))
return;
if (PreventStabby.getPlugin().getPlayerManager().canDamage(damager, victim, true, false))
CombatTimer.refreshPlayersCombatTime(damager, victim);
else
event.setCancelled(true);
} catch (NullPointerException | IndexOutOfBoundsException ignored) {}
}
}
@@ -1,35 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.pets;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.util.CombatTimer;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.entity.Tameable;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import java.util.UUID;
@PreventStabbyListener
public class PetHitByFireworkListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPetFireworkDamage(org.bukkit.event.entity.EntityDamageByEntityEvent event) {
if (event.getDamager() instanceof Firework && event.getEntity() instanceof Tameable) {
Tameable tameable = (Tameable) event.getEntity();
if (tameable.getOwner() == null) return;
Firework firework = (Firework) event.getDamager();
if (!(firework.getShooter() instanceof Player)) return;
UUID damager = ((Player) firework.getShooter()).getUniqueId();
UUID victim = tameable.getOwner().getUniqueId();
if (victim.equals(damager)) return;
if (PreventStabby.getPlugin().getPlayerManager().canDamage(damager, victim, true, false))
CombatTimer.refreshPlayersCombatTime(damager, victim);
else
event.setCancelled(true);
}
}
}
@@ -1,53 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.pets;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.util.CombatTimer;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import me.youhavetrouble.preventstabby.util.Util;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Tameable;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import java.util.UUID;
@PreventStabbyListener
public class PetHitBySplashPotionListener implements Listener {
/**
* If thrown potion applies negative effects and it's thrown by a player
* it will have no effect on a pet of a player with pvp off
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPetHitBySplashPotion(org.bukkit.event.entity.PotionSplashEvent event) {
if (!(event.getEntity().getShooter() instanceof Player)) return;
boolean harmful = false;
for (PotionEffect effect : event.getPotion().getEffects()) {
if (Util.isPotionEffectHarmful(effect.getType())) {
harmful = true;
break;
}
}
if (!harmful) return;
UUID damager = ((Player) event.getEntity().getShooter()).getUniqueId();
for (Entity entity : event.getAffectedEntities()) {
if (entity instanceof Tameable) {
Tameable tameable = (Tameable) entity;
if (tameable.getOwner() == null) continue;
UUID victim = tameable.getOwner().getUniqueId();
if (victim == damager) return;
if (PreventStabby.getPlugin().getPlayerManager().canDamage(damager, victim, true, false))
CombatTimer.refreshPlayersCombatTime(damager, victim);
else
event.setCancelled(true);
}
}
}
}
@@ -1,32 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.pets;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.util.CombatTimer;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.entity.Tameable;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import java.util.UUID;
@PreventStabbyListener
public class PetLeashListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPetLeash(org.bukkit.event.entity.PlayerLeashEntityEvent event) {
if (event.getEntity() instanceof Tameable) {
Tameable tameable = (Tameable) event.getEntity();
if (tameable.getOwner() == null) return;
UUID damager = event.getPlayer().getUniqueId();
UUID victim = tameable.getOwner().getUniqueId();
if (victim == damager) return;
if (PreventStabby.getPlugin().getPlayerManager().canDamage(damager, victim, true, false))
CombatTimer.refreshPlayersCombatTime(damager, victim);
else
event.setCancelled(true);
}
}
}
@@ -1,38 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.pets;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.util.DamageCheck;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import me.youhavetrouble.preventstabby.util.PvpState;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Tameable;
import org.bukkit.entity.Wolf;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@PreventStabbyListener
public class PetTargettingMountListener implements Listener {
/**
* TODO - this needs to pass canDamage() in the future, for now it just checks forced pvp state directly
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onWolfAttackMount(org.bukkit.event.entity.EntityDamageByEntityEvent event) {
if (PreventStabby.getPlugin().getPlayerManager().getForcedPvpState() == PvpState.ENABLED) return;
if (!(event.getDamager() instanceof Tameable damager) || event.getEntity().getPassengers().isEmpty()) return;
Entity victim = event.getEntity();
if (damager.getOwner() == null) return;
DamageCheck.DamageCheckResult result = PreventStabby.getPlugin().getPlayerManager().canDamage(damager, victim);
if (!result.ableToDamage) {
if (damager instanceof Wolf wolf) {
wolf.setAngry(false);
}
event.setCancelled(true);
}
}
}
@@ -1,32 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.pets;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.entity.Tameable;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@PreventStabbyListener
public class PetTargettingPetListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onWolfAttackWolf(org.bukkit.event.entity.EntityDamageByEntityEvent event) {
if (!(event.getDamager() instanceof Tameable) || !(event.getEntity() instanceof Tameable)) return;
Tameable damager = (Tameable) event.getDamager();
Tameable victim = (Tameable) event.getEntity();
if (damager.getOwner() == null || victim.getOwner() == null) return;
if (!PreventStabby.getPlugin().getPlayerManager()
.canDamage(
damager.getUniqueId(),
victim.getUniqueId(),
false,
false
))
event.setCancelled(true);
}
}
@@ -1,43 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.pets;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.util.CombatTimer;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.entity.Player;
import org.bukkit.entity.Tameable;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityTargetEvent;
import java.util.UUID;
@PreventStabbyListener
public class PetTargettingPlayerListener implements Listener {
/**
* Stops pets with owners targetting players with pvp off
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPetTargetPlayer(EntityTargetEvent event) {
if (!(event.getEntity() instanceof Tameable)) return;
Tameable entity = (Tameable) event.getEntity();
if (!(entity.getOwner() instanceof Player)) return;
if (!(event.getTarget() instanceof Player)) return;
UUID damager = entity.getOwner().getUniqueId();
UUID victim = event.getTarget().getUniqueId();
boolean tempting = event.getReason().equals(EntityTargetEvent.TargetReason.TEMPT);
if (PreventStabby.getPlugin().getPlayerManager().canDamage(damager, victim, !tempting, false)) {
if (tempting) {
event.setCancelled(true);
return;
}
CombatTimer.refreshPlayersCombatTime(damager, victim);
}
else
event.setCancelled(true);
}
}
@@ -1,47 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.pets;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.config.ConfigCache;
import me.youhavetrouble.preventstabby.util.CombatTimer;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.entity.Player;
import org.bukkit.entity.Tameable;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import java.util.UUID;
@PreventStabbyListener
public class PlayerAttackPetListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerAttackPet(EntityDamageByEntityEvent event) {
if (!(event.getDamager() instanceof Player) || !(event.getEntity() instanceof Tameable)) return;
Tameable tameable = (Tameable) event.getEntity();
if (tameable.getOwner() == null) return;
UUID damager = event.getDamager().getUniqueId();
UUID victim = tameable.getOwner().getUniqueId();
if (damager.equals(victim)) return;
ConfigCache config = PreventStabby.getPlugin().getConfigCache();
if (PreventStabby.getPlugin().getPlayerManager()
.canDamage(
damager,
victim,
config.getCannot_attack_pets_attacker(),
config.getCannot_attack_pets_victim(),
false
))
CombatTimer.refreshPlayersCombatTime(damager);
else
event.setCancelled(true);
}
}
@@ -1,51 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.pets;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.config.ConfigCache;
import me.youhavetrouble.preventstabby.util.CombatTimer;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.Tameable;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import java.util.UUID;
@PreventStabbyListener
public class PlayerHitPetWithProjectileListener implements Listener {
/**
* Cancels damage done by projectiles to pets of players with pvp off
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerHitPetWithProjectile(org.bukkit.event.entity.EntityDamageByEntityEvent event) {
if (!(event.getEntity() instanceof Tameable) || !(event.getDamager() instanceof Projectile)) return;
Projectile projectile = (Projectile) event.getDamager();
if (!(projectile.getShooter() instanceof Player)) return;
Tameable tameable = (Tameable) event.getEntity();
if (tameable.getOwner() == null) return;
UUID damager = ((Player) projectile.getShooter()).getUniqueId();
UUID victim = tameable.getOwner().getUniqueId();
if (damager.equals(victim)) return;
ConfigCache config = PreventStabby.getPlugin().getConfigCache();
if (PreventStabby.getPlugin().getPlayerManager()
.canDamage(
damager,
victim,
config.getCannot_attack_pets_attacker(),
config.getCannot_attack_pets_victim(),
false
))
CombatTimer.refreshPlayersCombatTime(damager);
else
event.setCancelled(true);
}
}
@@ -1,26 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.pets;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.entity.Tameable;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@PreventStabbyListener
public class PlayerInteractWithPetListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerInteractWithPet(org.bukkit.event.player.PlayerInteractEntityEvent event) {
if (!PreventStabby.getPlugin().getConfigCache().isOnly_owner_can_interact_with_pet()) return;
if (!(event.getRightClicked() instanceof Tameable)) return;
Tameable tameable = (Tameable) event.getRightClicked();
if (tameable.getOwner() == null) return;
if (tameable.getOwner().getUniqueId().equals(event.getPlayer().getUniqueId())) return;
event.setCancelled(true);
}
}
@@ -1,47 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.player;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.players.PlayerManager;
import me.youhavetrouble.preventstabby.util.CombatTimer;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.entity.Player;
import org.bukkit.entity.Tameable;
import org.bukkit.entity.Wolf;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import java.util.UUID;
@PreventStabbyListener
public class PetAttackPlayerListener implements Listener {
/**
* Pets stop following player with pvp off after trying to hit them
* This is to fix any inconsistancy with pet behavior
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPetAttack(org.bukkit.event.entity.EntityDamageByEntityEvent event) {
if (!(event.getDamager() instanceof Tameable)) return;
Tameable entity = (Tameable) event.getDamager();
if (entity.getOwner() != null && event.getEntity() instanceof Player) {
UUID victim = event.getEntity().getUniqueId();
UUID damager = entity.getOwner().getUniqueId();
PlayerManager playerManager = PreventStabby.getPlugin().getPlayerManager();
if (!playerManager.canDamage(damager, victim, false)) {
if (entity instanceof Wolf) {
Wolf wolf = (Wolf) entity;
wolf.setAngry(false);
}
event.setCancelled(true);
return;
}
CombatTimer.refreshPlayersCombatTime(damager, victim);
}
}
}
@@ -1,35 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.player;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.util.CombatTimer;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import java.util.UUID;
@PreventStabbyListener
public class PlayerAttackListener implements Listener {
/**
* Cancels basic attacks done to player with pvp off
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerAttack(org.bukkit.event.entity.EntityDamageByEntityEvent event) {
Entity damagerEntity = event.getDamager();
Entity victimEntity = event.getEntity();
if (damagerEntity instanceof Player && victimEntity instanceof Player) {
UUID damager = damagerEntity.getUniqueId();
UUID victim = victimEntity.getUniqueId();
if (PreventStabby.getPlugin().getPlayerManager().canDamage(damager, victim, true))
CombatTimer.refreshPlayersCombatTime(damager, victim);
else
event.setCancelled(true);
}
}
}
@@ -1,109 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.player;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.util.CombatTimer;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.entity.EnderCrystal;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.minecart.ExplosiveMinecart;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.metadata.FixedMetadataValue;
import java.util.UUID;
@PreventStabbyListener
public class PlayerHitByExplosionListener implements Listener {
/**
* Cancels explosion damage for players with pvp off that is caused by players
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerHitByExplosion(org.bukkit.event.entity.EntityDamageByEntityEvent event) {
if (event.getEntity() instanceof Player) {
if (!event.getCause().equals(EntityDamageEvent.DamageCause.ENTITY_EXPLOSION)) return;
UUID victim = event.getEntity().getUniqueId();
try {
UUID damager = UUID.fromString(event.getDamager().getMetadata("PLAYEREXPLODED").get(0).asString());
if (victim.equals(damager)) return;
if (PreventStabby.getPlugin().getPlayerManager().canDamage(damager, victim, true))
CombatTimer.refreshPlayersCombatTime(damager, victim);
else
event.setCancelled(true);
} catch (NullPointerException | IndexOutOfBoundsException ignored) { }
}
}
/**
* Tags ender crystal with exploder uuid
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerHitEnderCrystal(org.bukkit.event.entity.EntityDamageByEntityEvent event) {
if (event.getEntity() instanceof EnderCrystal) {
EnderCrystal enderCrystal = (EnderCrystal) event.getEntity();
if (event.getDamager() instanceof Player) {
enderCrystal.setMetadata("PLAYEREXPLODED", new FixedMetadataValue(PreventStabby.getPlugin(), event.getDamager().getUniqueId().toString()));
} else if (event.getDamager() instanceof Projectile) {
Projectile projectile = (Projectile) event.getDamager();
if (projectile.getShooter() instanceof Player) {
Player damager = (Player) projectile.getShooter();
enderCrystal.setMetadata("PLAYEREXPLODED", new FixedMetadataValue(PreventStabby.getPlugin(), damager.getUniqueId().toString()));
}
}
}
}
/**
* Tag ender crystal with destroying players uuid
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerPrimedTnt(org.bukkit.event.entity.ExplosionPrimeEvent event) {
if (event.getEntity() instanceof TNTPrimed) {
TNTPrimed tntPrimed = (TNTPrimed) event.getEntity();
if (tntPrimed.getSource() instanceof Player) {
Player damager = (Player) tntPrimed.getSource();
tntPrimed.setMetadata("PLAYEREXPLODED", new FixedMetadataValue(PreventStabby.getPlugin(), damager.getUniqueId().toString()));
} else if (tntPrimed.getSource() instanceof TNTPrimed) {
try {
TNTPrimed sourceTnt = (TNTPrimed) tntPrimed.getSource();
String damagerUuid = sourceTnt.getMetadata("PLAYEREXPLODED").get(0).asString();
tntPrimed.setMetadata("PLAYEREXPLODED", new FixedMetadataValue(PreventStabby.getPlugin(), damagerUuid));
} catch (NullPointerException ignored) {
}
}
}
}
/**
* Tag TNT minecart with placing player uuid
*/
@SuppressWarnings("deprecation")
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerPlacedTntMinecart(org.bukkit.event.entity.EntityPlaceEvent event) {
if (event.getEntityType().equals(EntityType.MINECART_TNT)) {
if (event.getPlayer() != null) {
event.getEntity().setMetadata("PLAYEREXPLODED", new FixedMetadataValue(PreventStabby.getPlugin(), event.getPlayer().getUniqueId().toString()));
}
}
}
/**
* Tag TNT minecart with uuid of player who last nudged it
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerNudgedTntMinecart(org.bukkit.event.vehicle.VehicleEntityCollisionEvent event) {
if (event.getVehicle() instanceof ExplosiveMinecart && event.getEntity() instanceof Player) {
Player damager = (Player) event.getEntity();
event.getVehicle().setMetadata("PLAYEREXPLODED", new FixedMetadataValue(PreventStabby.getPlugin(), damager.getUniqueId().toString()));
}
}
}
@@ -1,34 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.player;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.util.CombatTimer;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import java.util.UUID;
@PreventStabbyListener
public class PlayerHitByFireworkListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onFireworkDamage(org.bukkit.event.entity.EntityDamageByEntityEvent event) {
if (event.getDamager() instanceof Firework && event.getEntity() instanceof Player) {
UUID victim = event.getEntity().getUniqueId();
Firework firework = (Firework) event.getDamager();
if (firework.getShooter() instanceof Player) {
UUID damager = ((Player) firework.getShooter()).getUniqueId();
if (damager == victim) return;
if (PreventStabby.getPlugin().getPlayerManager().canDamage(damager, victim, true))
CombatTimer.refreshPlayersCombatTime(damager, victim);
else
event.setCancelled(true);
}
}
}
}
@@ -1,59 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.player;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.util.CombatTimer;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.entity.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import java.util.UUID;
@PreventStabbyListener
public class PlayerHitByProjectileListener implements Listener {
/**
* Cancels damage done by projectiles to player with pvp off
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerHitProjectile(org.bukkit.event.entity.EntityDamageByEntityEvent event) {
if (event.getEntity() instanceof Player && event.getDamager() instanceof Projectile) {
Projectile projectile = (Projectile) event.getDamager();
if (projectile.getShooter() instanceof Player) {
UUID damager = ((Player) projectile.getShooter()).getUniqueId();
UUID victim = event.getEntity().getUniqueId();
if (PreventStabby.getPlugin().getConfigCache().isSnowballs_knockback() && event.getDamager() instanceof Snowball) {
if (PreventStabby.getPlugin().getPlayerManager().canDamage(damager, victim, true)) {
((Player) event.getEntity()).damage(0.01, (Entity) projectile.getShooter());
CombatTimer.refreshPlayersCombatTime(damager, victim);
} else {
event.setCancelled(true);
return;
}
} else if (PreventStabby.getPlugin().getConfigCache().isEgg_knockback() && event.getDamager() instanceof Egg) {
if (PreventStabby.getPlugin().getPlayerManager().canDamage(damager, victim, true)) {
((Player) event.getEntity()).damage(0.01, (Entity) projectile.getShooter());
CombatTimer.refreshPlayersCombatTime(damager, victim);
} else {
event.setCancelled(true);
return;
}
}
// Ender pearls and other self-damage
if (damager.equals(victim)) return;
if (event.getDamage() == 0) return;
if (PreventStabby.getPlugin().getPlayerManager().canDamage(damager, victim, true))
CombatTimer.refreshPlayersCombatTime(damager, victim);
else
event.setCancelled(true);
}
}
}
}
@@ -1,48 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.player;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.util.CombatTimer;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import me.youhavetrouble.preventstabby.util.Util;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.potion.PotionEffect;
import java.util.UUID;
@PreventStabbyListener
public class PlayerHitBySplashPotionListener implements Listener {
/**
* If thrown potion is applies negative effects and it's thrown by a player it will have no effect on player with pvp off
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerHitBySplashPotion(org.bukkit.event.entity.PotionSplashEvent event) {
if (!(event.getEntity().getShooter() instanceof Player)) return;
boolean harmful = false;
for (PotionEffect effect : event.getPotion().getEffects()) {
if (Util.isPotionEffectHarmful(effect.getType())) {
harmful = true;
break;
}
}
if (!harmful) return;
UUID damager = ((Player) event.getEntity().getShooter()).getUniqueId();
for (LivingEntity entity : event.getAffectedEntities()) {
if (!(entity instanceof Player)) continue;
UUID victim = entity.getUniqueId();
if (damager == victim) continue;
if (PreventStabby.getPlugin().getPlayerManager().canDamage(damager, victim, true)) {
CombatTimer.refreshPlayersCombatTime(damager, victim);
} else {
event.setIntensity(entity, 0);
}
}
}
}
@@ -1,38 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.toggles;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.players.PlayerManager;
import me.youhavetrouble.preventstabby.util.PluginMessages;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@PreventStabbyListener
public class CombatCommandListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerCommandInCombat(org.bukkit.event.player.PlayerCommandPreprocessEvent event) {
if (!PreventStabby.getPlugin().getConfigCache().isBlock_commands_in_combat())
return;
if (event.getPlayer().hasPermission("toglepvp.combatcommandblock.bypass"))
return;
PlayerManager playerManager = PreventStabby.getPlugin().getPlayerManager();
if (!playerManager.getPlayer(event.getPlayer().getUniqueId()).isInCombat())
return;
String command = event.getMessage().replaceFirst("/", "");
if (!PreventStabby.getPlugin().getConfigCache().getCombatBlockedCommands().contains(command))
return;
event.setCancelled(true);
PluginMessages.sendMessage(event.getPlayer(), PreventStabby.getPlugin().getConfigCache().getCant_do_that_during_combat());
}
}
@@ -1,33 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.toggles;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.players.PlayerManager;
import me.youhavetrouble.preventstabby.util.PluginMessages;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@PreventStabbyListener
public class PlayerTeleportInCombatListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerTeleportInCombat(org.bukkit.event.player.PlayerTeleportEvent event) {
if (!PreventStabby.getPlugin().getConfigCache().isBlock_teleports_in_combat())
return;
PlayerManager playerManager = PreventStabby.getPlugin().getPlayerManager();
if (!playerManager.getPlayer(event.getPlayer().getUniqueId()).isInCombat())
return;
if (event.getPlayer().hasPermission("toglepvp.combatteleportblock.bypass"))
return;
event.setCancelled(true);
PluginMessages.sendMessage(event.getPlayer(), PreventStabby.getPlugin().getConfigCache().getCant_do_that_during_combat());
}
}
@@ -1,61 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.unspecific;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.players.PlayerManager;
import me.youhavetrouble.preventstabby.util.CombatTimer;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import me.youhavetrouble.preventstabby.util.Util;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Tameable;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.AreaEffectCloudApplyEvent;
import org.bukkit.potion.PotionEffectType;
import java.util.Iterator;
import java.util.UUID;
@PreventStabbyListener
public class AreaEffectCloudApplyListener implements Listener {
@EventHandler(ignoreCancelled = true)
public void onCloudEffects(AreaEffectCloudApplyEvent event) {
if (!(event.getEntity().getSource() instanceof Player)) return;
PotionEffectType potionEffectType = event.getEntity().getBasePotionData().getType().getEffectType();
if (potionEffectType == null) return;
if (!Util.isPotionEffectHarmful(potionEffectType)) return;
PlayerManager playerManager = PreventStabby.getPlugin().getPlayerManager();
Iterator<LivingEntity> it = event.getAffectedEntities().iterator();
UUID damager = ((Player) event.getEntity().getSource()).getUniqueId();
while (it.hasNext()) {
LivingEntity entity = it.next();
if (entity instanceof Player) {
UUID victim = entity.getUniqueId();
if (damager == victim) continue;
if (playerManager.canDamage(damager, victim, true))
CombatTimer.refreshPlayersCombatTime(damager, victim);
else
it.remove();
} else if (entity instanceof Tameable) {
Tameable tameable = (Tameable) entity;
if (tameable.getOwner() == null) continue;
UUID victim = tameable.getOwner().getUniqueId();
if (victim == damager) continue;
if (playerManager.canDamage(damager, victim, true, false))
CombatTimer.refreshPlayersCombatTime(damager, victim);
else
it.remove();
}
}
}
}
@@ -1,61 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.unspecific;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.entity.LightningStrike;
import org.bukkit.entity.Player;
import org.bukkit.entity.Tameable;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.weather.LightningStrikeEvent;
import org.bukkit.metadata.FixedMetadataValue;
import java.util.UUID;
/**
* Listen for lightning strikes and tag the trident spawned ones.
* Idea from aasmus' PvPToggle plugin
*/
@PreventStabbyListener
public class EntityHitByLightningListener implements Listener {
/**
* Cancels damage from lightning strike caused by channeling for players with pvp off
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerLightningDamage(org.bukkit.event.entity.EntityDamageByEntityEvent event) {
if (event.getDamager() instanceof LightningStrike && event.getDamager().getMetadata("TRIDENT").size() >= 1) {
if (event.getEntity() instanceof Player) {
UUID victim = event.getEntity().getUniqueId();
if (PreventStabby.getPlugin().getPlayerManager().hasLoginProtection(victim)) {
event.setCancelled(true);
return;
}
if (!PreventStabby.getPlugin().getSmartCache().getPlayerData(victim).isPvpEnabled()) {
event.setCancelled(true);
}
} else if (event.getEntity() instanceof Tameable) {
Tameable victim = (Tameable) event.getEntity();
if (victim.getOwner() != null && !PreventStabby.getPlugin().getSmartCache().getPlayerData(victim.getOwner().getUniqueId()).isPvpEnabled()) {
event.setCancelled(true);
}
}
}
}
/**
* Tags the lightning strike
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onLightningStrike(LightningStrikeEvent event){
if(event.getCause() == LightningStrikeEvent.Cause.TRIDENT){
if (PreventStabby.getPlugin().getConfigCache().isChanneling_enchant_disabled()) {
event.setCancelled(true);
return;
}
event.getLightning().setMetadata("TRIDENT", new FixedMetadataValue(PreventStabby.getPlugin(), event.getLightning().getLocation()));
}
}
}
@@ -1,49 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.unspecific;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.util.CombatTimer;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.entity.Player;
import org.bukkit.entity.Tameable;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import java.util.UUID;
@PreventStabbyListener
public class FishingListener implements Listener {
/**
* Prevents hooking players with disabled pvp with fishing rod
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onFish(org.bukkit.event.player.PlayerFishEvent event) {
if (event.getCaught() instanceof Player) {
if (PreventStabby.getPlugin().getConfigCache().isAllow_fishing_rod_pull()) return;
UUID damager = event.getPlayer().getUniqueId();
UUID victim = event.getCaught().getUniqueId();
if (damager == victim)
return;
if (PreventStabby.getPlugin().getPlayerManager().canDamage(damager, victim, true))
CombatTimer.refreshPlayersCombatTime(damager, victim);
else
event.setCancelled(true);
} else if (event.getCaught() instanceof Tameable) {
Tameable tameable = (Tameable) event.getCaught();
UUID damager = event.getPlayer().getUniqueId();
if (tameable.getOwner() == null)
return;
UUID victim = tameable.getOwner().getUniqueId();
if (damager == victim)
return;
if (PreventStabby.getPlugin().getPlayerManager().canDamage(damager, victim, true, false))
CombatTimer.refreshPlayersCombatTime(damager, victim);
else
event.setCancelled(true);
}
}
}
@@ -1,125 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.unspecific;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.config.ConfigCache;
import me.youhavetrouble.preventstabby.util.BoundingBoxUtil;
import me.youhavetrouble.preventstabby.util.CombatTimer;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Tameable;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.util.BoundingBox;
import java.util.UUID;
@PreventStabbyListener
public class LavaDumpAndIgniteListener implements Listener {
/**
* Prevents dumping lava and pufferfish bucket near players with pvp off
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onLavaDump(org.bukkit.event.player.PlayerBucketEmptyEvent event) {
ConfigCache config = PreventStabby.getPlugin().getConfigCache();
if (!config.isLava_and_fire_stopper_enabled())
return;
if (event.getBucket().equals(Material.LAVA_BUCKET) || event.getBucket().equals(Material.PUFFERFISH_BUCKET)) {
Location location = event.getBlockClicked().getLocation();
UUID damager = event.getPlayer().getUniqueId();
double radius = config.getLava_and_fire_stopper_radius();
BoundingBox boundingBox = BoundingBoxUtil.getBoundingBox(location, radius);
for (Entity entity : location.getWorld().getNearbyEntities(boundingBox)) {
if (entity instanceof Player) {
UUID victim = entity.getUniqueId();
if (victim != damager) {
if (PreventStabby.getPlugin().getPlayerManager().hasLoginProtection(victim, damager)) {
event.setCancelled(true);
return;
}
if (PreventStabby.getPlugin().getPlayerManager().canDamage(damager, victim, true))
CombatTimer.refreshPlayersCombatTime(damager, victim);
else
event.setCancelled(true);
}
} else if (entity instanceof Tameable) {
Tameable tameable = (Tameable) entity;
if (tameable.getOwner() == null) {
return;
}
UUID victim = tameable.getOwner().getUniqueId();
if (PreventStabby.getPlugin().getPlayerManager().hasLoginProtection(victim, damager)) {
event.setCancelled(true);
return;
}
if (PreventStabby.getPlugin().getPlayerManager().canDamage(damager, victim, true))
CombatTimer.refreshPlayersCombatTime(damager, victim);
else
event.setCancelled(true);
}
}
}
}
/**
* Prevents setting blocks on fire near players with pvp off
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onIgnite(org.bukkit.event.block.BlockIgniteEvent event) {
ConfigCache config = PreventStabby.getPlugin().getConfigCache();
if (!config.isLava_and_fire_stopper_enabled())
return;
if (event.getPlayer() == null)
return;
Location location = event.getBlock().getLocation();
UUID damager = event.getPlayer().getUniqueId();
double radius = config.getLava_and_fire_stopper_radius();
BoundingBox boundingBox = BoundingBoxUtil.getBoundingBox(location, radius);
for (Entity entity : location.getWorld().getNearbyEntities(boundingBox)) {
if (entity instanceof Player) {
UUID victim = entity.getUniqueId();
if (victim == damager)
continue;
if (PreventStabby.getPlugin().getPlayerManager().canDamage(damager, victim, true))
CombatTimer.refreshPlayersCombatTime(damager, victim);
else
event.setCancelled(true);
} else if (entity instanceof Tameable) {
Tameable tameable = (Tameable) entity;
if (tameable.getOwner() == null) {
continue;
}
UUID victim = tameable.getOwner().getUniqueId();
if (victim == damager)
continue;
if (PreventStabby.getPlugin().getPlayerManager().canDamage(damager, victim, true, false))
CombatTimer.refreshPlayersCombatTime(damager, victim);
else
event.setCancelled(true);
}
}
}
}
@@ -1,50 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.unspecific;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.entity.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@PreventStabbyListener
public class LightningBlockIgniteListener implements Listener {
/**
* Lightning strikes from channeling enchant won't ignite blocks if player with pvp off is in radius
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBlockIgnite(org.bukkit.event.block.BlockIgniteEvent event) {
if (event.getIgnitingEntity() instanceof LightningStrike && event.getIgnitingEntity().getMetadata("TRIDENT").size() >= 1) {
LightningStrike lightningStrike = (LightningStrike) event.getIgnitingEntity();
for (Entity entity : lightningStrike.getNearbyEntities(2,2,2)) {
if (entity instanceof Player) {
Player victim = (Player) entity;
if (PreventStabby.getPlugin().getPlayerManager().hasLoginProtection(victim.getUniqueId())) {
event.setCancelled(true);
return;
}
if (!PreventStabby.getPlugin().getSmartCache().getPlayerData(victim.getUniqueId()).isPvpEnabled()) {
event.setCancelled(true);
return;
}
} else if (entity instanceof Tameable) {
Tameable victim = (Tameable) entity;
if (victim.getOwner() == null) {
return;
}
if (!PreventStabby.getPlugin().getSmartCache().getPlayerData(victim.getOwner().getUniqueId()).isPvpEnabled()) {
event.setCancelled(true);
return;
}
}
}
}
}
}
@@ -1,64 +0,0 @@
package me.youhavetrouble.preventstabby.listeners.unspecific;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.config.ConfigCache;
import me.youhavetrouble.preventstabby.util.BoundingBoxUtil;
import me.youhavetrouble.preventstabby.util.CombatTimer;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Tameable;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.util.BoundingBox;
import java.util.UUID;
@PreventStabbyListener
public class PlaceWitherRoseListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerWitherRosePlace(org.bukkit.event.block.BlockPlaceEvent event) {
ConfigCache config = PreventStabby.getPlugin().getConfigCache();
if (!config.isLava_and_fire_stopper_enabled())
return;
if (event.getBlock().getType().equals(Material.WITHER_ROSE)) {
Location location = event.getBlockPlaced().getLocation();
double radius = config.getLava_and_fire_stopper_radius();
BoundingBox boundingBox = BoundingBoxUtil.getBoundingBox(location, radius);
for (Entity entity : location.getWorld().getNearbyEntities(boundingBox)) {
if (entity instanceof Player) {
UUID damager = event.getPlayer().getUniqueId();
UUID victim = entity.getUniqueId();
if (victim == damager)
return;
if (PreventStabby.getPlugin().getPlayerManager().canDamage(damager, victim, true))
CombatTimer.refreshPlayersCombatTime(damager, victim);
else
event.setCancelled(true);
} else if (entity instanceof Tameable) {
Tameable tameable = (Tameable) entity;
UUID damager = event.getPlayer().getUniqueId();
if (tameable.getOwner() == null)
return;
UUID victim = tameable.getOwner().getUniqueId();
if (victim == damager)
return;
if (PreventStabby.getPlugin().getPlayerManager().canDamage(damager, victim, true, false))
CombatTimer.refreshPlayersCombatTime(damager, victim);
else
event.setCancelled(true);
}
}
}
}
}
@@ -11,11 +11,12 @@ public class PlayerData {
private final UUID playerUuid;
private long lastAccessTimestamp, combatStartTimestamp, loginTimestamp, teleportTimestamp;
private boolean pvpEnabled;
private boolean pvpEnabled, lastCombatCheck;
public PlayerData(UUID playerUuid, boolean pvpEnabled) {
this.playerUuid = playerUuid;
this.pvpEnabled = pvpEnabled;
this.lastCombatCheck = false;
this.combatStartTimestamp = Long.MIN_VALUE;
this.loginTimestamp = Long.MIN_VALUE;
this.teleportTimestamp = Long.MIN_VALUE;
@@ -29,7 +30,6 @@ public class PlayerData {
/**
* Returns true if player has personal pvp enabled, false otherwise.
* @return True if player has personal pvp enabled, false otherwise.
* @see PlayerManager#getPlayerPvPState(UUID)
*/
public boolean isPvpEnabled() {
return pvpEnabled;
@@ -71,6 +71,14 @@ public class PlayerData {
return combatStartTimestamp;
}
protected boolean getLastCombatCheckState() {
return lastCombatCheck;
}
protected void setLastCombatCheckState(boolean state) {
this.lastCombatCheck = state;
}
/**
* Marks the player as in combat.
*/
@@ -79,6 +87,11 @@ public class PlayerData {
this.combatStartTimestamp = System.currentTimeMillis();
}
protected void markNotInCombat() {
refreshCacheTime();
this.combatStartTimestamp = Long.MIN_VALUE;
}
/**
* Sets the login timestamp for the player.
* @param loginTimestamp The login timestamp to set.
@@ -109,10 +122,19 @@ public class PlayerData {
* @return true if the player is in combat, false otherwise.
*/
public boolean isInCombat() {
refreshCacheTime();
return System.currentTimeMillis() - (combatStartTimestamp + (PreventStabby.getPlugin().getConfigCache().combat_time * 1000)) < 0;
}
/**
* Retrieves the number of seconds left until combat ends for the player.
* @return The number of seconds left until combat ends. -1 if not in combat
*/
public long getSecondsLeftUntilCombatEnd() {
long timeSinceCombatStart = System.currentTimeMillis() - combatStartTimestamp;
long combatTimeConfigured = PreventStabby.getPlugin().getConfigCache().combat_time * 1000;
return (timeSinceCombatStart < combatTimeConfigured) ? (combatTimeConfigured - timeSinceCombatStart) / 1000 : -1;
}
/**
* Checks if the player has login protection.
*
@@ -1,28 +0,0 @@
package me.youhavetrouble.preventstabby.players;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDeathEvent;
@PreventStabbyListener
public class PlayerDeathListener implements Listener {
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onPlayerDeath(EntityDeathEvent event) {
if (!(event.getEntity() instanceof Player)) return;
Player player = (Player) event.getEntity();
PlayerData playerData = PreventStabby.getPlugin().getSmartCache().getPlayerData(player.getUniqueId());
if (playerData == null) return;
playerData.setCombattime(0);
playerData.setLastCombatCheck(false);
playerData.setInCombat(false);
}
}
@@ -2,19 +2,19 @@ package me.youhavetrouble.preventstabby.players;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.util.PluginMessages;
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import java.time.Instant;
import java.util.UUID;
@PreventStabbyListener
public class PlayerJoinAndLeaveListener implements Listener {
public class PlayerListener implements Listener {
/**
* This event is here to get players saved options on join
*/
@@ -29,21 +29,30 @@ public class PlayerJoinAndLeaveListener implements Listener {
* This event is here to save player's data to database
* Also punishes players who log out during combat
*/
@EventHandler
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerLeave(PlayerQuitEvent event) {
Player player = event.getPlayer();
if (!PreventStabby.getPlugin().getConfigCache().punish_for_combat_logout) return;
PlayerData playerData = PreventStabby.getPlugin().getSmartCache().getPlayerData(player.getUniqueId());
PlayerData playerData = PreventStabby.getPlugin().getPlayerManager().getPlayer(player.getUniqueId());
if (!playerData.isInCombat()) return;
player.setHealth(0);
if (!PreventStabby.getPlugin().getConfigCache().punish_for_combat_logout_announce) return;
PluginMessages.broadcastMessage(player, PreventStabby.getPlugin().getConfigCache().punish_for_combat_logout_message);
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onPlayerTeleport(PlayerTeleportEvent event) {
Player player = event.getPlayer();
PlayerData playerData = PreventStabby.getPlugin().getPlayerManager().getPlayer(player.getUniqueId());
playerData.setTeleportTimestamp(Instant.now().getEpochSecond());
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onPlayerDeath(EntityDeathEvent event) {
if (!(event.getEntity() instanceof Player player)) return;
PlayerData playerData = PreventStabby.getPlugin().getPlayerManager().getPlayer(player.getUniqueId());
if (playerData == null) return;
playerData.markNotInCombat();
}
}
@@ -1,10 +1,12 @@
package me.youhavetrouble.preventstabby.players;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.api.event.PlayerEnterCombatEvent;
import me.youhavetrouble.preventstabby.api.event.PlayerLeaveCombatEvent;
import me.youhavetrouble.preventstabby.util.DamageCheck;
import me.youhavetrouble.preventstabby.util.PluginMessages;
import me.youhavetrouble.preventstabby.util.PvpState;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import java.util.UUID;
@@ -21,17 +23,50 @@ public class PlayerManager {
public PlayerManager(PreventStabby plugin) {
this.plugin = plugin;
Bukkit.getAsyncScheduler().runAtFixedRate(plugin, (task) -> {
// Refresh cache timer if player is online
// Check for entries that should be invalidated
playerList.values().removeIf(PlayerData::isCacheExpired);
}, 250, 250, TimeUnit.MILLISECONDS);
Bukkit.getGlobalRegionScheduler().runAtFixedRate(plugin, (task) -> {
for (PlayerData playerData : playerList.values()) {
if (playerData == null) continue;
Player player = Bukkit.getPlayer(playerData.getPlayerUuid());
if (player != null && player.isOnline()) {
playerData.refreshCacheTime();
if (player == null || !player.isOnline()) continue;
playerData.refreshCacheTime(); // Refresh cache timer if player is online
// leaving combat logic
if (playerData.getLastCombatCheckState() && !playerData.isInCombat()) {
PlayerLeaveCombatEvent leaveCombatEvent = null;
if (PlayerLeaveCombatEvent.getHandlerList().getRegisteredListeners().length > 0) {
leaveCombatEvent = new PlayerLeaveCombatEvent(player);
Bukkit.getPluginManager().callEvent(leaveCombatEvent);
}
if (leaveCombatEvent != null && leaveCombatEvent.isCancelled()) {
playerData.markInCombat();
playerData.setLastCombatCheckState(playerData.isInCombat());
continue;
}
PluginMessages.sendActionBar(player, plugin.getConfigCache().leaving_combat);
playerData.setLastCombatCheckState(playerData.isInCombat());
continue;
}
// entering combat logic
if (!playerData.getLastCombatCheckState() && playerData.isInCombat()) {
PlayerEnterCombatEvent enterCombatEvent = null;
if (PlayerEnterCombatEvent.getHandlerList().getRegisteredListeners().length > 0) {
enterCombatEvent = new PlayerEnterCombatEvent(player);
Bukkit.getPluginManager().callEvent(enterCombatEvent);
}
if (enterCombatEvent != null && enterCombatEvent.isCancelled()) {
playerData.markNotInCombat();
playerData.setLastCombatCheckState(playerData.isInCombat());
continue;
}
PluginMessages.sendActionBar(player, plugin.getConfigCache().entering_combat);
playerData.setLastCombatCheckState(playerData.isInCombat());
continue;
}
}
// Check for entries that should be invalidated
playerList.values().removeIf(PlayerData::isCacheExpired);
},250, 250, TimeUnit.MILLISECONDS);
}, 1, 1);
}
/**
@@ -57,30 +92,12 @@ public class PlayerManager {
* @return A {@link DamageCheck.DamageCheckResult} object containing the result of the damage check.
*/
public DamageCheck.DamageCheckResult canDamage(Entity attacker, Entity victim) {
DamageCheck damageCheck = PreventStabby.getPlugin().getDamageUtil();
DamageCheck damageCheck = plugin.getDamageUtil();
return damageCheck.canDamage(attacker, victim);
}
/**
* Determines whether the given players have any form of protection enabled, including login and teleport protection.
*
* @param players The players to check for protection.
* @return true if any of the players have protection enabled, false otherwise.
* @see PlayerData#isProtected()
*/
public boolean hasProtection(OfflinePlayer... players) {
for (OfflinePlayer offlinePlayer : players) {
UUID uuid = offlinePlayer.getUniqueId();
PlayerData playerData = playerList.get(uuid);
if (playerData == null) continue;
if (playerData.isProtected()) return true;
}
return false;
}
/**
* Returns current forced pvp state.
*
* @return Current forced pvp state.
*/
public PvpState getForcedPvpState() {
@@ -89,13 +106,18 @@ public class PlayerManager {
/**
* Sets current forced pvp state.
*
* @param forcedPvpState New forced pvp state.
*/
public void setForcedPvpState(PvpState forcedPvpState) {
this.pvpForcedState = forcedPvpState;
}
/**
* Retrieves the PlayerData object for the player with the provided UUID. Returns new default if there isn't data.
*
* @param uuid The UUID of the player.
* @return The PlayerData object associated with the player.
*/
public CompletableFuture<PlayerData> getPlayerData(UUID uuid) {
// Try to get data from cache and refresh it
PlayerData data = getPlayer(uuid);
@@ -105,15 +127,13 @@ public class PlayerManager {
}
// Get data from database or provide default
return CompletableFuture.supplyAsync(() -> {
PlayerData playerData = PreventStabby.getPlugin().getSqLite().getPlayerInfo(uuid);
PlayerData playerData = plugin.getSqLite().getPlayerInfo(uuid);
if (playerData == null) {
playerData = new PlayerData(uuid, false);
}
PreventStabby.getPlugin().getPlayerManager().addPlayer(uuid, playerData);
plugin.getPlayerManager().addPlayer(uuid, playerData);
return playerData;
});
}
public void setPlayerPvpState(UUID uuid, boolean state) {
@@ -122,6 +142,13 @@ public class PlayerManager {
getPlayer(uuid).setPvpEnabled(state);
}
// Update the database aswell
PreventStabby.getPlugin().getSqLite().updatePlayerInfo(uuid, new PlayerData(uuid, state));
plugin.getSqLite().updatePlayerInfo(uuid, new PlayerData(uuid, state));
}
public CompletableFuture<Boolean> togglePlayerPvpState(UUID uuid) {
return getPlayerData(uuid).thenApply(playerData -> {
playerData.setPvpEnabled(!playerData.isPvpEnabled());
return playerData.isPvpEnabled();
});
}
}
@@ -1,21 +0,0 @@
package me.youhavetrouble.preventstabby.players;
import me.youhavetrouble.preventstabby.PreventStabby;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerTeleportEvent;
import java.time.Instant;
public class PlayerTeleportListener implements Listener {
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onPlayerTeleport(PlayerTeleportEvent event) {
Player player = event.getPlayer();
PlayerData playerData = PreventStabby.getPlugin().getPlayerManager().getPlayer(player.getUniqueId());
playerData.setTeleportTimestamp(Instant.now().getEpochSecond());
}
}
@@ -1,22 +0,0 @@
package me.youhavetrouble.preventstabby.util;
import org.bukkit.Location;
import org.bukkit.util.BoundingBox;
public class BoundingBoxUtil {
public static BoundingBox getBoundingBox(Location location, double radius) {
double x1 = location.getX()+radius;
double y1 = location.getY()+radius;
double z1 = location.getZ()+radius;
double x2 = location.getX()-radius;
double y2 = location.getY()-radius;
double z2 = location.getZ()-radius;
return new BoundingBox(x1, y1, z1, x2, y2, z2);
}
}
@@ -1,49 +0,0 @@
package me.youhavetrouble.preventstabby.util;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.api.event.PlayerEnterCombatEvent;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import java.time.Instant;
import java.util.UUID;
public class CombatTimer {
public static void refreshPlayersCombatTime(UUID uuid) {
try {
long combattime = PreventStabby.getPlugin().getSmartCache().getPlayerData(uuid).getCombatTime();
Player player = Bukkit.getPlayer(uuid);
if (player == null || !player.isOnline()) return;
PlayerEnterCombatEvent playerEnterCombatEvent = new PlayerEnterCombatEvent(player);
Bukkit.getScheduler().runTask(PreventStabby.getPlugin(), () -> {
if (PlayerEnterCombatEvent.getHandlerList().getRegisteredListeners().length > 0) {
Bukkit.getPluginManager().callEvent(playerEnterCombatEvent);
if (playerEnterCombatEvent.isCancelled()) return;
}
PreventStabby.getPlugin().getPlayerManager().refreshPlayersCombatTime(uuid);
if (combattime <= 0) {
PluginMessages.sendActionBar(uuid, PreventStabby.getPlugin().getConfigCache().getEntering_combat());
}
});
} catch (Exception ignored) {
}
}
public static void refreshPlayersCombatTime(UUID... uuid) {
for (UUID id : uuid) {
refreshPlayersCombatTime(id);
}
}
public static boolean isInCombat(UUID uuid) {
try {
return PreventStabby.getPlugin().getPlayerManager().getPlayer(uuid).getCombatTime() >= Instant.now().getEpochSecond();
} catch (Exception e) {
return false;
}
}
}
@@ -24,12 +24,18 @@ public class DamageCheck {
Target attackerData = getUuidOfActualPlayer(attacker);
Target victimData = getUuidOfActualPlayer(victim);
if (attackerData == null || victimData == null) return new DamageCheckResult(true, null, null);
return canDamage(attackerData.playerUuid, victimData.playerUuid, victimData.classifier);
}
PlayerData attackerPlayerData = PreventStabby.getPlugin().getPlayerManager().getPlayer(attackerData.playerUuid);
PlayerData victimPlayerData = PreventStabby.getPlugin().getPlayerManager().getPlayer(victimData.playerUuid);
public DamageCheckResult canDamage(UUID attackerId, UUID victimId, EntityClassifier victimClassifier) {
if (attackerId == null || victimId == null) return new DamageCheckResult(true, null, null);
PlayerData attackerPlayerData = PreventStabby.getPlugin().getPlayerManager().getPlayer(attackerId);
PlayerData victimPlayerData = PreventStabby.getPlugin().getPlayerManager().getPlayer(victimId);
if (attackerPlayerData.isProtected()) {
String message = switch (victimData.classifier) {
String message = switch (victimClassifier) {
case PLAYER -> config.cannotAttackTeleportOrSpawnProtectionAttacker;
case PET -> config.cannotAttackPetsTeleportOrSpawnProtectionAttacker;
case MOUNT -> config.cannotAttackMountsTeleportOrSpawnProtectionAttacker;
@@ -39,7 +45,7 @@ public class DamageCheck {
}
if (victimPlayerData.isProtected()) {
String message = null;
if (victimData.classifier == EntityClassifier.PLAYER) {
if (victimClassifier == EntityClassifier.PLAYER) {
message = config.cannotAttackTeleportOrSpawnProtectionVictim;
}
return new DamageCheckResult(false, message, null);
@@ -50,7 +56,6 @@ public class DamageCheck {
case ENABLED -> new DamageCheckResult(true, null, null);
default -> new DamageCheckResult(true, null, null);
};
}
/**
@@ -60,7 +65,7 @@ public class DamageCheck {
* @return UUID of the actual player, null if not found
*/
@Nullable
private Target getUuidOfActualPlayer(@NotNull Entity entity) {
public Target getUuidOfActualPlayer(@NotNull Entity entity) {
if (entity instanceof Player) return new Target(entity.getUniqueId(), EntityClassifier.PLAYER);
// Get shooter of projectile
@@ -18,9 +18,10 @@ public class DatabaseSQLite {
this.url = url;
this.folder = folder;
this.logger = logger;
createDatabaseFile();
}
public void createDatabaseFile() {
private void createDatabaseFile() {
this.folder.mkdir();
try (Connection conn = DriverManager.getConnection(url)) {
if (conn == null) return;
@@ -34,30 +35,14 @@ public class DatabaseSQLite {
}
}
public boolean testConnection() {
try (Connection conn = DriverManager.getConnection(url)) {
logger.info("Connection to SQLite has been established.");
if (conn != null) return true;
} catch (SQLException exception) {
exception.printStackTrace();
}
return false;
}
public PlayerData getPlayerInfo(UUID uuid) {
try (Connection conn = DriverManager.getConnection(url)) {
try {
PreparedStatement insertnewuser = conn.prepareStatement("INSERT OR IGNORE INTO `players` (player_uuid, pvpenabled) VALUES (?, ?)");
insertnewuser.setString(1, uuid.toString());
insertnewuser.setBoolean(2, PreventStabby.getPlugin().getConfigCache().isPvp_enabled_by_default());
insertnewuser.executeUpdate();
} catch (SQLException e) {
if (e.getErrorCode() != 19) {
e.printStackTrace();
}
}
PreparedStatement statement = conn.prepareStatement("SELECT * FROM `players` WHERE `player_uuid` = ?");
PreparedStatement statement = conn.prepareStatement(
"INSERT OR IGNORE INTO `players` (player_uuid, pvpenabled) VALUES (?, ?); SELECT * FROM `players` WHERE `player_uuid` = ?;"
);
statement.setString(1, uuid.toString());
statement.setBoolean(2, PreventStabby.getPlugin().getConfigCache().pvp_enabled_by_default);
statement.setString(3, uuid.toString());
statement.executeQuery();
ResultSet result = statement.getResultSet();
boolean state = result.getBoolean("pvpenabled");
@@ -2,7 +2,6 @@ package me.youhavetrouble.preventstabby.util;
import me.clip.placeholderapi.PlaceholderAPI;
import me.youhavetrouble.preventstabby.PreventStabby;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
@@ -15,7 +14,6 @@ import java.util.UUID;
public class PluginMessages {
public static final MiniMessage MINIMESSAGE = MiniMessage.miniMessage();
private static final BukkitAudiences audiences = PreventStabby.getAudiences();
public static Component parseMessage(String message) {
message = makeColorsWork('&', message);
@@ -24,8 +22,7 @@ public class PluginMessages {
}
public static Component parseMessage(CommandSender sender,String message) {
if (sender instanceof Player && isPlaceholderApiEnabled()) {
Player player = (Player) sender;
if (sender instanceof Player player && isPlaceholderApiEnabled()) {
message = PlaceholderAPI.setPlaceholders(player, message);
}
return parseMessage(message);
@@ -37,13 +34,13 @@ public class PluginMessages {
public static void sendMessage(CommandSender sender, String message) {
if ("".equals(message)) return;
audiences.sender(sender).sendMessage(parseMessage(sender, message));
sender.sendMessage(parseMessage(sender, message));
}
public static void sendActionBar(Player player, String message) {
if ("".equals(message)) return;
Component parsedMessage = parseMessage(player, message);
audiences.player(player).sendActionBar(parsedMessage);
player.sendActionBar(parsedMessage);
}
public static void sendActionBar(UUID uuid, String message) {
@@ -64,12 +61,12 @@ public class PluginMessages {
if (PreventStabby.getPlugin().getServer().getPluginManager().getPlugin("PlaceholderAPI") != null) {
message = PlaceholderAPI.setPlaceholders(player, message);
}
audiences.all().sendMessage(parseMessage(message));
Bukkit.broadcast(parseMessage(message));
}
public static void broadcastMessage(String message) {
if ("".equals(message)) return;
audiences.all().sendMessage(parseMessage(message));
Bukkit.broadcast(parseMessage(message));
}
/**
@@ -1,11 +0,0 @@
package me.youhavetrouble.preventstabby.util;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface PreventStabbyListener {}
@@ -1,73 +0,0 @@
package me.youhavetrouble.preventstabby.util;
import me.youhavetrouble.preventstabby.PreventStabby;
import me.youhavetrouble.preventstabby.config.ConfigCache;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffectType;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
public class Util {
private static final HashSet<PotionEffectType> harmfulPotions = new HashSet<>();
public static void initData() {
harmfulPotions.add(PotionEffectType.BLINDNESS);
harmfulPotions.add(PotionEffectType.CONFUSION);
harmfulPotions.add(PotionEffectType.HARM);
harmfulPotions.add(PotionEffectType.HUNGER);
harmfulPotions.add(PotionEffectType.POISON);
harmfulPotions.add(PotionEffectType.SLOW_DIGGING);
harmfulPotions.add(PotionEffectType.WEAKNESS);
harmfulPotions.add(PotionEffectType.SLOW);
harmfulPotions.add(PotionEffectType.WITHER);
}
/**
* @param attacker Player attacking the mount
* @param mount Entity being ridden
* @return true if event should be cancelled
*/
public static boolean processMountAttack(UUID attacker, Entity mount) {
// Don't cancel attacks on players that have passengers
if (mount instanceof Player) return false;
ConfigCache config = PreventStabby.getPlugin().getConfigCache();
Set<UUID> playerPassengersWithPvpEnabled = new HashSet<>();
boolean hasPlayerPassengers = false;
for (Entity passenger : mount.getPassengers()) {
if (!(passenger instanceof Player)) continue;
Player player = (Player) passenger;
hasPlayerPassengers = true;
if (PreventStabby.getPlugin().getPlayerManager().getPlayerPvPState(player.getUniqueId()))
playerPassengersWithPvpEnabled.add(player.getUniqueId());
}
if (!hasPlayerPassengers) return false;
if (!PreventStabby.getPlugin().getPlayerManager().getPlayerPvPState(attacker)) {
PluginMessages.sendActionBar(attacker, config.getCannot_attack_mounts_attacker());
return true;
}
if (playerPassengersWithPvpEnabled.isEmpty()) {
PluginMessages.sendActionBar(attacker, config.getCannot_attack_mounts_victim());
return true;
}
playerPassengersWithPvpEnabled.forEach(CombatTimer::refreshPlayersCombatTime);
CombatTimer.refreshPlayersCombatTime(attacker);
return false;
}
public static boolean isPotionEffectHarmful(PotionEffectType effect) {
return harmfulPotions.contains(effect);
}
}