diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..30cf57e --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/checkstyle-idea.xml b/.idea/checkstyle-idea.xml new file mode 100644 index 0000000..5065b2d --- /dev/null +++ b/.idea/checkstyle-idea.xml @@ -0,0 +1,15 @@ + + + + 12.1.2 + JavaOnly + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b30f702 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/discord.xml b/.idea/discord.xml new file mode 100644 index 0000000..30bab2a --- /dev/null +++ b/.idea/discord.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..f00fbf1 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..7fb4876 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..9035e2f --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/PVPToggle.iml b/PVPToggle.iml new file mode 100644 index 0000000..aeaaf6b --- /dev/null +++ b/PVPToggle.iml @@ -0,0 +1,16 @@ + + + + + + + + + SPIGOT + + 1 + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..84e0d97 --- /dev/null +++ b/pom.xml @@ -0,0 +1,49 @@ + + + 4.0.0 + + com.github.aasmus + PvPToggle + 2.0 + + + 21 + 21 + + + + + papermc + https://repo.papermc.io/repository/maven-public/ + + + + canvasmc + https://maven.canvasmc.io/snapshots + + + + placeholderapi + https://repo.extendedclip.com/content/repositories/placeholderapi/ + + + + + + io.canvasmc.canvas + canvas-api + 1.21.11-R0.1-SNAPSHOT + provided + + + + me.clip + placeholderapi + 2.12.2 + provided + + + + diff --git a/src/com/github/aasmus/pvptoggle/PvPCommand.java b/src/com/github/aasmus/pvptoggle/PvPCommand.java deleted file mode 100644 index 5c0465c..0000000 --- a/src/com/github/aasmus/pvptoggle/PvPCommand.java +++ /dev/null @@ -1,211 +0,0 @@ -package com.github.aasmus.pvptoggle; - -import org.bukkit.Bukkit; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; - -import com.github.aasmus.pvptoggle.utils.Chat; -import com.github.aasmus.pvptoggle.utils.Util; - -public class PvPCommand implements CommandExecutor { - - @Override - public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { - if(sender instanceof ConsoleCommandSender) { //check if command sender is console - ConsoleCommandSender console = (ConsoleCommandSender) sender; - if(args.length == 0) { - Chat.send(console, "HELP_HEADER"); - Chat.send(console, "HELP_SET_OTHERS"); - } else { - try { - Player other = Bukkit.getPlayerExact(args[1]); - if(other == null) { //make sure the player is online - Chat.send(console, "NO_PLAYER", args[1]); - } else { //set pvp state - Boolean current = PvPToggle.instance.players.get(other.getUniqueId()); - if(args[0].equals("reload")) { - reloadConfig(); - return true; - } else if(args[0].equals("toggle")) { - if(current == true) { - if (Util.setPlayerState(other, false, console)) { - Chat.send(other, "PVP_STATE_ENABLED"); - if (PvPToggle.instance.getConfig().getBoolean("SETTINGS.PARTICLES")) { - Util.particleEffect(other.getPlayer()); - } - if(PvPToggle.instance.getConfig().getBoolean("SETTINGS.NAMETAG")) { - Util.ChangeNametag(other.getPlayer(), "&c"); - } - } - } else { - if (Util.setPlayerState(other, true, console)) { - Chat.send(other, "PVP_STATE_DISABLED"); - } - } - } else if(args[0].equalsIgnoreCase("on")) { - if (Util.setPlayerState(other, false, console)) { - Chat.send(other, "PVP_STATE_ENABLED"); - if (current == true) { - if(PvPToggle.instance.getConfig().getBoolean("SETTINGS.PARTICLES")) { - Util.particleEffect(other.getPlayer()); - } - if(PvPToggle.instance.getConfig().getBoolean("SETTINGS.NAMETAG")) { - Util.ChangeNametag(other.getPlayer(), "&c"); - } - } - } - } else if(args[0].equalsIgnoreCase("off")) { - if (Util.setPlayerState(other, true, console)) { - Chat.send(other, "PVP_STATE_DISABLED"); - if(PvPToggle.instance.getConfig().getBoolean("SETTINGS.NAMETAG")) { - Util.ChangeNametag(other.getPlayer(), "reset"); - } - } - } - current = PvPToggle.instance.players.get(other.getUniqueId()); - Chat.send(console, "PVP_STATE_CHANGED_OTHERS", other.getDisplayName(), current); - } - } catch (Exception e) { - //nothing needs to be done - } - } - } else if(sender instanceof Player) { //check if command sender is player - if(cmd.getName().equalsIgnoreCase("pvp")) { - Player p = (Player) sender; - if(args.length == 0) { - Chat.send(p, "PVP_STATUS", null, PvPToggle.instance.players.get(p.getUniqueId())); - Chat.send(p, "HELP_HEADER"); - Chat.send(p, "HELP_GENERAL_USEAGE"); - if(p.hasPermission("pvptoggle.others")) - Chat.send(p, "HELP_VIEW_OTHERS"); - if(p.hasPermission("pvptoggle.others.set")) - Chat.send(p, "HELP_SET_OTHERS"); - } else if(args.length == 1) { - if(args[0].equals("reload") && p.hasPermission("pvptoggle.reload")) { - reloadConfig(); - return true; - } - if(p.hasPermission("pvptoggle.allow")) { - - if(Util.getCooldown(p) == false || p.hasPermission("pvptoggle.bypass")) { - Boolean current = PvPToggle.instance.players.get(p.getUniqueId()); - if(args[0].equals("toggle")) { - if(current == true) { - Util.setCooldownTime(p); - if (Util.setPlayerState(p, false, p)) { - Chat.send(p, "PVP_STATE_ENABLED"); - if (PvPToggle.instance.getConfig().getBoolean("SETTINGS.PARTICLES")) { - Util.particleEffect(p.getPlayer()); - } - if(PvPToggle.instance.getConfig().getBoolean("SETTINGS.NAMETAG")) { - Util.ChangeNametag(p.getPlayer(), "&c"); } - } - } else { - if (Util.setPlayerState(p, true, p)) { - Chat.send(p, "PVP_STATE_DISABLED"); - } - } - } else if(args[0].equalsIgnoreCase("on")) { - Util.setCooldownTime(p); - if (Util.setPlayerState(p, false, p)) { - Chat.send(p, "PVP_STATE_ENABLED"); - if (current == true) { - if(PvPToggle.instance.getConfig().getBoolean("SETTINGS.PARTICLES")) { - Util.particleEffect(p.getPlayer()); - } - if(PvPToggle.instance.getConfig().getBoolean("SETTINGS.NAMETAG")) { - Util.ChangeNametag(p.getPlayer(), "&c"); - } - } - } - } else if(args[0].equalsIgnoreCase("off")) { - if (Util.setPlayerState(p, true, p)) { - Chat.send(p, "PVP_STATE_DISABLED"); - if(PvPToggle.instance.getConfig().getBoolean("SETTINGS.NAMETAG")) { - Util.ChangeNametag(p.getPlayer(), "reset"); - } - } - } else if(args[0].equalsIgnoreCase("status")) { - Chat.send(p, "PVP_STATUS", null, current); - } else { - if(sender.hasPermission("pvptoggle.others")) { - Player other = Bukkit.getPlayerExact(args[0]); - if(other == null) { - Chat.send(p, "NO_PLAYER", args[0]); - } else { - current = PvPToggle.instance.players.get(other.getUniqueId()); - Chat.send(p, "PVP_STATUS_OTHERS", other.getDisplayName(), current); - } - } else { - if(!args[0].contains("\\")) { - Chat.send(p, "COMMAND_INVALID_PARAMETER", args[0]); - } - } - } - } - - } - } else if(args.length == 2) { - if(sender.hasPermission("pvptoggle.others.set")) { - Player other = Bukkit.getPlayerExact(args[1]); - if(other == null) { - Chat.send(p, "NO_PLAYER", args[1]); - } else { - Boolean current = PvPToggle.instance.players.get(other.getUniqueId()); - if(args[0].equals("toggle")) { - if(current == true) { - if (Util.setPlayerState(other, false, sender)) { - Chat.send(other, "PVP_STATE_ENABLED"); - if (PvPToggle.instance.getConfig().getBoolean("SETTINGS.PARTICLES")) { - Util.particleEffect(other.getPlayer()); - } - if(PvPToggle.instance.getConfig().getBoolean("SETTINGS.NAMETAG")) { - Util.ChangeNametag(p.getPlayer(), "&c"); - } - } - } else { - if (Util.setPlayerState(other, true, sender)) { - Chat.send(other, "PVP_STATE_DISABLED"); - } - } - } else if(args[0].equalsIgnoreCase("on")) { - if (Util.setPlayerState(other, false, sender)) { - if (current == true) { - if(PvPToggle.instance.getConfig().getBoolean("SETTINGS.PARTICLES")) { - Util.particleEffect(other.getPlayer()); - } - if(PvPToggle.instance.getConfig().getBoolean("SETTINGS.NAMETAG")) { - Util.ChangeNametag(p.getPlayer(), "&c"); - } - } - Chat.send(other, "PVP_STATE_ENABLED"); - } - } else if(args[0].equalsIgnoreCase("off")) { - if (Util.setPlayerState(other, true, sender)) { - Chat.send(other, "PVP_STATE_DISABLED"); - if(PvPToggle.instance.getConfig().getBoolean("SETTINGS.NAMETAG")) { - Util.ChangeNametag(other.getPlayer(), "reset"); - } - } - } - current = PvPToggle.instance.players.get(other.getUniqueId()); - Chat.send(p, "PVP_STATE_CHANGED_OTHERS", other.getDisplayName(), current); - } - } else { - Chat.send(p, "COMMAND_NO_PERMISSION"); - } - } - } - return true; - } - return false; - } - - public void reloadConfig() { - PvPToggle.instance.reloadConfig(); - } - -} diff --git a/src/com/github/aasmus/pvptoggle/listeners/PlayerChangeWorld.java b/src/com/github/aasmus/pvptoggle/listeners/PlayerChangeWorld.java deleted file mode 100644 index d41ca1f..0000000 --- a/src/com/github/aasmus/pvptoggle/listeners/PlayerChangeWorld.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.github.aasmus.pvptoggle.listeners; - -import com.github.aasmus.pvptoggle.PvPToggle; -import com.github.aasmus.pvptoggle.utils.Chat; -import com.github.aasmus.pvptoggle.utils.Util; -import org.bukkit.World; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerChangedWorldEvent; - -public class PlayerChangeWorld implements Listener { - @EventHandler - public void onChangeWorld(PlayerChangedWorldEvent event) { - Player player = event.getPlayer(); - World world = player.getWorld(); - boolean playerPvpEnabled = !Util.getPlayerState(player.getUniqueId()); - - // If PVP isn't enabled in the world but the player has it enabled, disable it. - if (!world.getPVP() && playerPvpEnabled) { - Util.setPlayerState(player.getUniqueId(), true); - Chat.send(player, "PVP_WORLD_CHANGE_DISABLED"); - /*if (PvPToggle.instance.getConfig().getBoolean("SETTINGS.PARTICLES")) { - Util.particleEffect(player); - } - if(PvPToggle.instance.getConfig().getBoolean("SETTINGS.NAMETAG")) { - Util.ChangeNametag(player, "&c"); - }*/ - return; - } - - // If PVP is required (i.e. the world has PVP enabled and it is in the blocked worlds) and the player has it disabled, enable it. - if (player.getWorld().getPVP() && PvPToggle.blockedWorlds.contains(world.getName()) && !playerPvpEnabled) { - Util.setPlayerState(player.getUniqueId(), false); - Chat.send(player, "PVP_WORLD_CHANGE_REQUIRED"); - if (PvPToggle.instance.getConfig().getBoolean("SETTINGS.PARTICLES")) { - Util.particleEffect(player); - } - if(PvPToggle.instance.getConfig().getBoolean("SETTINGS.NAMETAG")) { - Util.ChangeNametag(player, "&c"); - } - return; - } - } -} diff --git a/src/com/github/aasmus/pvptoggle/listeners/PlayerJoin.java b/src/com/github/aasmus/pvptoggle/listeners/PlayerJoin.java deleted file mode 100644 index 9e9acbd..0000000 --- a/src/com/github/aasmus/pvptoggle/listeners/PlayerJoin.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.github.aasmus.pvptoggle.listeners; - -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerJoinEvent; - -import com.github.aasmus.pvptoggle.PvPToggle; -import com.github.aasmus.pvptoggle.utils.Util; - -public class PlayerJoin implements Listener { - - public PlayerJoin() { - for(Player p : Bukkit.getOnlinePlayers()) { - if(!PvPToggle.instance.getConfig().getBoolean("SETTINGS.PERSISTENT_PVP_STATE")) { - PvPToggle.instance.players.put(p.getUniqueId(), PvPToggle.instance.getConfig().getBoolean("SETTINGS.DEFAULT_PVP_OFF")); //add player to players hash map and set their pvp state - if(PvPToggle.instance.players.get(p.getUniqueId()) == false) { - if(PvPToggle.instance.getConfig().getBoolean("SETTINGS.PARTICLES")) { - Util.particleEffect(p.getPlayer()); - } - if(PvPToggle.instance.getConfig().getBoolean("SETTINGS.NAMETAG")) { - Util.ChangeNametag(p.getPlayer(), "&c"); - } - } - } else { - PvPToggle.instance.dataUtils.addPlayer(p.getPlayer()); - PvPToggle.instance.players.put(p.getUniqueId(), PvPToggle.instance.dataUtils.GetPlayerPvPState(p.getPlayer())); //add player to players hash map and set their pvp state - if(PvPToggle.instance.players.get(p.getUniqueId()) == false) { - if(PvPToggle.instance.getConfig().getBoolean("SETTINGS.PARTICLES")) { - Util.particleEffect(p.getPlayer()); - } - if(PvPToggle.instance.getConfig().getBoolean("SETTINGS.NAMETAG")) { - Util.ChangeNametag(p.getPlayer(), "&c"); - } - } - } - } - } - - @EventHandler - public void onPlayerJoin(PlayerJoinEvent event) { - Player p = event.getPlayer(); - if(!PvPToggle.instance.getConfig().getBoolean("SETTINGS.PERSISTENT_PVP_STATE")) { - PvPToggle.instance.players.put(p.getUniqueId(), PvPToggle.instance.getConfig().getBoolean("SETTINGS.DEFAULT_PVP_OFF")); //add player to players hash map and set their pvp state - if(PvPToggle.instance.players.get(p.getUniqueId()) == false) { - if(PvPToggle.instance.getConfig().getBoolean("SETTINGS.PARTICLES")) { - Util.particleEffect(p.getPlayer()); - } - if(PvPToggle.instance.getConfig().getBoolean("SETTINGS.NAMETAG")) { - Util.ChangeNametag(p.getPlayer(), "&c"); - } - } - } else { - PvPToggle.instance.dataUtils.addPlayer(p.getPlayer()); - PvPToggle.instance.players.put(p.getUniqueId(), PvPToggle.instance.dataUtils.GetPlayerPvPState(p.getPlayer())); //add player to players hash map and set their pvp state - if(PvPToggle.instance.players.get(p.getUniqueId()) == false) { - if(PvPToggle.instance.getConfig().getBoolean("SETTINGS.PARTICLES")) { - Util.particleEffect(p.getPlayer()); - } - if(PvPToggle.instance.getConfig().getBoolean("SETTINGS.NAMETAG")) { - Util.ChangeNametag(p.getPlayer(), "&c"); - } - } - } - } - -} diff --git a/src/com/github/aasmus/pvptoggle/utils/Util.java b/src/com/github/aasmus/pvptoggle/utils/Util.java deleted file mode 100644 index 7cc2113..0000000 --- a/src/com/github/aasmus/pvptoggle/utils/Util.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.github.aasmus.pvptoggle.utils; - -import java.util.Date; -import java.util.UUID; - -import org.bukkit.*; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; - -import com.github.aasmus.pvptoggle.PvPToggle; -import com.nametagedit.plugin.NametagEdit; - -public class Util { - - private static float radius = .75f; - - public static boolean getPlayerState(UUID uuid){ - Boolean result = PvPToggle.instance.players.get(uuid); - if(result==null) return false; - else return result; - } - - public static void setPlayerState(UUID uuid, boolean state){ - PvPToggle.instance.players.put(uuid,state); - } - - // Set player state while performing checks to make sure it's a valid switch. - public static boolean setPlayerState(Player player, boolean state, CommandSender caller) { - if (player == null) { - return false; - } - - World world = player.getWorld(); - // You can't set the state to false (PVP enabled) if the world doesn't allow it - if (!world.getPVP() && !state) { - if (caller == player) { - Chat.send(caller, "PVP_WORLD_CANNOT_CHANGE_SELF"); - } else { - Chat.send(caller, "PVP_WORLD_CANNOT_CHANGE_OTHERS"); - } - return false; - } - // You can't set the state to true (PVP disabled) if the world requires it - if (world.getPVP() && PvPToggle.blockedWorlds.contains(world.getName()) && state) { - if (caller == player) { - Chat.send(caller, "PVP_WORLD_CANNOT_CHANGE_SELF"); - } else { - Chat.send(caller, "PVP_WORLD_CANNOT_CHANGE_OTHERS"); - } - return false; - } - - setPlayerState(player.getUniqueId(), state); - return true; - } - - public static void setCooldownTime(Player p) { - PvPToggle.instance.cooldowns.put(p.getUniqueId(), new Date()); - } - - public static void removeCooldownTime(Player p) { - PvPToggle.instance.cooldowns.remove(p.getUniqueId()); - } - - public static boolean getCooldown(Player p) { - if(PvPToggle.instance.cooldowns.containsKey(p.getUniqueId())) { - Date lastChange = PvPToggle.instance.cooldowns.get(p.getUniqueId()); - Date currentTime = new Date(); - int seconds = (int) (currentTime.getTime() - lastChange.getTime())/1000; - if(seconds > PvPToggle.instance.getConfig().getInt("SETTINGS.COOLDOWN") || p.hasPermission("pvptoggle.bypass")) { - Util.removeCooldownTime(p); - return false; - } else { - Chat.send(p, "PVP_COOLDOWN", String.valueOf(PvPToggle.instance.getConfig().getInt("SETTINGS.COOLDOWN") - seconds)); - return true; - } - } else { - return false; - } - } - - public static void ChangeNametag(Player p, String color) { - if(PvPToggle.instance.getServer().getPluginManager().isPluginEnabled("NametagEdit")) { - if(color == "reset") { - NametagEdit.getApi().clearNametag(p); - } else { - NametagEdit.getApi().setPrefix(p, color); - } - } - } - - public static void particleEffect(Player p) { - new BukkitRunnable() { - - @Override - public void run() { - if(!p.isOnline() || PvPToggle.instance.players.get(p.getUniqueId()) != false) { - this.cancel(); - } else if(!p.isDead()) { - double angle = 0; - Particle.DustOptions dustOptions = new Particle.DustOptions(Color.RED, 1); - Location location = p.getLocation(); - - - for(int i = 0; i < 25; i++) { - double x = (radius * Math.sin(angle)); - double z = (radius * Math.cos(angle)); - angle += 0.251; - p.getWorld().spawnParticle(Particle.REDSTONE, location.getX()+x, location.getY(), location.getZ()+z, 0, 0, 1, 0, dustOptions); - } - } - - } - - }.runTaskTimer(PvPToggle.instance, 0L, 2L); - } - -} diff --git a/src/main/java/com/github/aasmus/pvptoggle/PvPCommand.java b/src/main/java/com/github/aasmus/pvptoggle/PvPCommand.java new file mode 100644 index 0000000..5bcb4eb --- /dev/null +++ b/src/main/java/com/github/aasmus/pvptoggle/PvPCommand.java @@ -0,0 +1,195 @@ +package com.github.aasmus.pvptoggle; + +import com.github.aasmus.pvptoggle.events.PvPToggleEvent; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; + +import com.github.aasmus.pvptoggle.utils.Chat; +import com.github.aasmus.pvptoggle.utils.Util; +import org.jspecify.annotations.NonNull; + +public class PvPCommand implements CommandExecutor { + + @Override + public boolean onCommand(@NonNull CommandSender sender, @NonNull Command cmd, @NonNull String label, String @NonNull [] args) { + if (sender instanceof ConsoleCommandSender console) { //check if command sender is console + if (args.length == 0) { + Chat.send(console, "HELP_HEADER"); + Chat.send(console, "HELP_SET_OTHERS"); + } else { + try { + Player other = Bukkit.getPlayerExact(args[1]); + if (other == null) { //make sure the player is online + Chat.send(console, "NO_PLAYER", args[1]); + } else { //set pvp state + Boolean current = PvPToggle.instance.players.get(other.getUniqueId()); + if (args[0].equals("reload")) { + reloadConfig(); + return true; + } else if (args[0].equals("toggle")) { + if (current == true) { + if (Util.setPlayerState(other, false, console)) { + Bukkit.getPluginManager().callEvent(new PvPToggleEvent(other)); + Chat.send(other, "PVP_STATE_ENABLED"); + if (PvPToggle.instance.getConfig().getBoolean("SETTINGS.PARTICLES")) { + Util.particleEffect(other.getPlayer()); + } + } + } else { + if (Util.setPlayerState(other, true, console)) { + Bukkit.getPluginManager().callEvent(new PvPToggleEvent(other)); + Chat.send(other, "PVP_STATE_DISABLED"); + } + } + } else if (args[0].equalsIgnoreCase("on")) { + if (Util.setPlayerState(other, false, console)) { + Bukkit.getPluginManager().callEvent(new PvPToggleEvent(other)); + Chat.send(other, "PVP_STATE_ENABLED"); + if (current == true) { + if (PvPToggle.instance.getConfig().getBoolean("SETTINGS.PARTICLES")) { + Util.particleEffect(other.getPlayer()); + } + } + } + } else if (args[0].equalsIgnoreCase("off")) { + if (Util.setPlayerState(other, true, console)) { + Bukkit.getPluginManager().callEvent(new PvPToggleEvent(other)); + Chat.send(other, "PVP_STATE_DISABLED"); + } + } + current = PvPToggle.instance.players.get(other.getUniqueId()); + Chat.send(console, "PVP_STATE_CHANGED_OTHERS", other.getDisplayName(), current); + } + } catch (Exception e) { + //nothing needs to be done + } + } + } else if (sender instanceof Player player) { //check if command sender is player + if (cmd.getName().equalsIgnoreCase("pvp")) { + if (args.length == 0) { + Chat.send(player, "PVP_STATUS", null, PvPToggle.instance.players.get(player.getUniqueId())); + Chat.send(player, "HELP_HEADER"); + Chat.send(player, "HELP_GENERAL_USEAGE"); + if (player.hasPermission("pvptoggle.others")) + Chat.send(player, "HELP_VIEW_OTHERS"); + if (player.hasPermission("pvptoggle.others.set")) + Chat.send(player, "HELP_SET_OTHERS"); + } else if (args.length == 1) { + if (args[0].equals("reload") && player.hasPermission("pvptoggle.reload")) { + reloadConfig(); + return true; + } + + if (player.hasPermission("pvptoggle.allow")) { + if (!Util.getCooldown(player) || player.hasPermission("pvptoggle.bypass")) { + Boolean current = PvPToggle.instance.players.get(player.getUniqueId()); + if (args[0].equals("toggle")) { + if (current == true) { + Util.setCooldownTime(player); + if (Util.setPlayerState(player, false, player)) { + Bukkit.getPluginManager().callEvent(new PvPToggleEvent(player)); + Chat.send(player, "PVP_STATE_ENABLED"); + if (PvPToggle.instance.getConfig().getBoolean("SETTINGS.PARTICLES")) { + Util.particleEffect(player.getPlayer()); + } + } + } else { + if (Util.setPlayerState(player, true, player)) { + Bukkit.getPluginManager().callEvent(new PvPToggleEvent(player)); + Chat.send(player, "PVP_STATE_DISABLED"); + } + } + } else if (args[0].equalsIgnoreCase("on")) { + Util.setCooldownTime(player); + if (Util.setPlayerState(player, false, player)) { + Bukkit.getPluginManager().callEvent(new PvPToggleEvent(player)); + Chat.send(player, "PVP_STATE_ENABLED"); + if (current == true) { + if (PvPToggle.instance.getConfig().getBoolean("SETTINGS.PARTICLES")) { + Util.particleEffect(player.getPlayer()); + } + } + } + } else if (args[0].equalsIgnoreCase("off")) { + if (Util.setPlayerState(player, true, player)) { + Bukkit.getPluginManager().callEvent(new PvPToggleEvent(player)); + Chat.send(player, "PVP_STATE_DISABLED"); + } + } else if (args[0].equalsIgnoreCase("status")) { + Chat.send(player, "PVP_STATUS", null, current); + } else { + if (sender.hasPermission("pvptoggle.others")) { + Player other = Bukkit.getPlayerExact(args[0]); + if (other == null) { + Chat.send(player, "NO_PLAYER", args[0]); + } else { + current = PvPToggle.instance.players.get(other.getUniqueId()); + Chat.send(player, "PVP_STATUS_OTHERS", other.getDisplayName(), current); + } + } else { + if (!args[0].contains("\\")) { + Chat.send(player, "COMMAND_INVALID_PARAMETER", args[0]); + } + } + } + } + } + } else if (args.length == 2) { + if (sender.hasPermission("pvptoggle.others.set")) { + Player other = Bukkit.getPlayerExact(args[1]); + if (other == null) { + Chat.send(player, "NO_PLAYER", args[1]); + } else { + Boolean current = PvPToggle.instance.players.get(other.getUniqueId()); + if (args[0].equals("toggle")) { + if (current == true) { + if (Util.setPlayerState(other, false, sender)) { + Bukkit.getPluginManager().callEvent(new PvPToggleEvent(other)); + Chat.send(other, "PVP_STATE_ENABLED"); + if (PvPToggle.instance.getConfig().getBoolean("SETTINGS.PARTICLES")) { + Util.particleEffect(other.getPlayer()); + } + } + } else { + if (Util.setPlayerState(other, true, sender)) { + Bukkit.getPluginManager().callEvent(new PvPToggleEvent(other)); + Chat.send(other, "PVP_STATE_DISABLED"); + } + } + } else if (args[0].equalsIgnoreCase("on")) { + if (Util.setPlayerState(other, false, sender)) { + Bukkit.getPluginManager().callEvent(new PvPToggleEvent(other)); + if (current == true) { + if (PvPToggle.instance.getConfig().getBoolean("SETTINGS.PARTICLES")) { + Util.particleEffect(other.getPlayer()); + } + } + Chat.send(other, "PVP_STATE_ENABLED"); + } + } else if (args[0].equalsIgnoreCase("off")) { + if (Util.setPlayerState(other, true, sender)) { + Bukkit.getPluginManager().callEvent(new PvPToggleEvent(other)); + Chat.send(other, "PVP_STATE_DISABLED"); + } + } + current = PvPToggle.instance.players.get(other.getUniqueId()); + Chat.send(player, "PVP_STATE_CHANGED_OTHERS", other.getDisplayName(), current); + } + } else { + Chat.send(player, "COMMAND_NO_PERMISSION"); + } + } + } + return true; + } + return false; + } + + public void reloadConfig() { + PvPToggle.instance.reloadConfig(); + } +} diff --git a/src/com/github/aasmus/pvptoggle/PvPToggle.java b/src/main/java/com/github/aasmus/pvptoggle/PvPToggle.java similarity index 71% rename from src/com/github/aasmus/pvptoggle/PvPToggle.java rename to src/main/java/com/github/aasmus/pvptoggle/PvPToggle.java index d07db60..3675c40 100644 --- a/src/com/github/aasmus/pvptoggle/PvPToggle.java +++ b/src/main/java/com/github/aasmus/pvptoggle/PvPToggle.java @@ -1,64 +1,55 @@ package com.github.aasmus.pvptoggle; - import java.io.File; import java.util.Date; -import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.UUID; - +import java.util.concurrent.ConcurrentHashMap; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.event.Listener; import org.bukkit.plugin.java.JavaPlugin; - import com.github.aasmus.pvptoggle.listeners.PlayerJoin; import com.github.aasmus.pvptoggle.listeners.PlayerLeave; import com.github.aasmus.pvptoggle.listeners.PvP; import com.github.aasmus.pvptoggle.listeners.PlayerChangeWorld; import com.github.aasmus.pvptoggle.utils.PersistentData; import com.github.aasmus.pvptoggle.utils.PlaceholderAPIHook; - public class PvPToggle extends JavaPlugin implements Listener { - - public FileConfiguration config; + public static List blockedWorlds; public static PvPToggle instance; - public HashMap players = new HashMap<>(); //False is pvp on True is pvp off - public HashMap cooldowns = new HashMap<>(); - + + public FileConfiguration config; + + public Map players = new ConcurrentHashMap<>(); // False is PvP on True is PvP off + public Map cooldowns = new ConcurrentHashMap<>(); + public PersistentData dataUtils; - + @Override public void onEnable() { instance = this; this.config = getConfig(); - //save config - if(config != null) { - this.saveDefaultConfig(); - } - - File PVPData = new File(getDataFolder(), "Data"); + // Save config + this.saveDefaultConfig(); + File PVPData = new File(getDataFolder(), "Data"); dataUtils = new PersistentData(PVPData); - - //register events + + // Register events getServer().getPluginManager().registerEvents(this, this); Bukkit.getPluginManager().registerEvents(new PlayerJoin(), this); Bukkit.getPluginManager().registerEvents(new PlayerLeave(), this); Bukkit.getPluginManager().registerEvents(new PvP(), this); Bukkit.getPluginManager().registerEvents(new PlayerChangeWorld(), this); - //register command - this.getCommand("pvp").setExecutor(new PvPCommand()); - + // Register command + Objects.requireNonNull(this.getCommand("pvp")).setExecutor(new PvPCommand()); + blockedWorlds = config.getStringList("SETTINGS.BLOCKED_WORLDS"); - - if(Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) { + + if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) { new PlaceholderAPIHook(this).register(); } } - - @Override - public void onDisable() { - - } - } diff --git a/src/main/java/com/github/aasmus/pvptoggle/events/PvPToggleEvent.java b/src/main/java/com/github/aasmus/pvptoggle/events/PvPToggleEvent.java new file mode 100644 index 0000000..4f197d4 --- /dev/null +++ b/src/main/java/com/github/aasmus/pvptoggle/events/PvPToggleEvent.java @@ -0,0 +1,29 @@ +package com.github.aasmus.pvptoggle.events; + +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.bukkit.entity.Player; +import org.jspecify.annotations.NonNull; + +public class PvPToggleEvent extends Event { + + private final Player player; + + public PvPToggleEvent(Player player) { + this.player = player; + } + + private static final HandlerList HANDLERS = new HandlerList(); + + public @NonNull HandlerList getHandlers() { + return HANDLERS; + } + + public static HandlerList getHandlerList() { + return HANDLERS; + } + + public Player getPlayer() { + return this.player; + } +} diff --git a/src/main/java/com/github/aasmus/pvptoggle/listeners/PlayerChangeWorld.java b/src/main/java/com/github/aasmus/pvptoggle/listeners/PlayerChangeWorld.java new file mode 100644 index 0000000..3cf3289 --- /dev/null +++ b/src/main/java/com/github/aasmus/pvptoggle/listeners/PlayerChangeWorld.java @@ -0,0 +1,53 @@ +package com.github.aasmus.pvptoggle.listeners; +import com.github.aasmus.pvptoggle.PvPToggle; +import com.github.aasmus.pvptoggle.events.PvPToggleEvent; +import com.github.aasmus.pvptoggle.utils.Chat; +import com.github.aasmus.pvptoggle.utils.Util; +import io.canvasmc.canvas.event.EntityPostPortalAsyncEvent; +import io.canvasmc.canvas.event.EntityPostTeleportAsyncEvent; +import org.bukkit.Bukkit; +import org.bukkit.GameRules; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +public class PlayerChangeWorld implements Listener { + + @EventHandler + public void onPostTeleport(EntityPostTeleportAsyncEvent event) { + if (!(event.getEntity() instanceof Player player)) return; + World to = event.getTo().getWorld(); + // Only track teleporting that actually change worlds + if (event.getFrom().getWorld() == to) return; + reconcilePvpState(player, to); + } + + @EventHandler + public void onPostPortal(EntityPostPortalAsyncEvent event) { + if (!(event.getEntity() instanceof Player player)) return; + // Portal always changes worlds, but check defensively in case of custom portals + if (event.getFrom() == event.getTo()) return; + reconcilePvpState(player, event.getTo()); + } + + private void reconcilePvpState(Player player, World world) { + boolean playerPvpEnabled = !Util.getPlayerState(player.getUniqueId()); + // If PVP isn't enabled in the world but the player has it enabled, disable it. + if (Boolean.FALSE.equals(world.getGameRuleValue(GameRules.PVP)) && playerPvpEnabled) { + Util.setPlayerState(player.getUniqueId(), true); + Bukkit.getPluginManager().callEvent(new PvPToggleEvent(player)); + Chat.send(player, "PVP_WORLD_CHANGE_DISABLED"); + return; + } + + // If PVP is required (i.e., the world has PVP enabled, and it is in the blocked worlds) and the player has it disabled, enable it. + if (Boolean.TRUE.equals(world.getGameRuleValue(GameRules.PVP)) && PvPToggle.blockedWorlds.contains(world.getName()) && !playerPvpEnabled) { + Util.setPlayerState(player.getUniqueId(), false); + Bukkit.getPluginManager().callEvent(new PvPToggleEvent(player)); + Chat.send(player, "PVP_WORLD_CHANGE_REQUIRED"); + if (PvPToggle.instance.getConfig().getBoolean("SETTINGS.PARTICLES")) { + Util.particleEffect(player); + } + } + } +} diff --git a/src/main/java/com/github/aasmus/pvptoggle/listeners/PlayerJoin.java b/src/main/java/com/github/aasmus/pvptoggle/listeners/PlayerJoin.java new file mode 100644 index 0000000..451a6a6 --- /dev/null +++ b/src/main/java/com/github/aasmus/pvptoggle/listeners/PlayerJoin.java @@ -0,0 +1,50 @@ +package com.github.aasmus.pvptoggle.listeners; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +import com.github.aasmus.pvptoggle.PvPToggle; +import com.github.aasmus.pvptoggle.utils.Util; + +import java.util.ArrayList; +import java.util.Objects; + +public class PlayerJoin implements Listener { + + public PlayerJoin() { + for (Player player : new ArrayList<>(Bukkit.getOnlinePlayers())) { + if (!PvPToggle.instance.getConfig().getBoolean("SETTINGS.PERSISTENT_PVP_STATE")) { + PvPToggle.instance.players.put(player.getUniqueId(), PvPToggle.instance.getConfig().getBoolean("SETTINGS.DEFAULT_PVP_OFF")); //add player to players hash map and set their pvp state + } else { + PvPToggle.instance.dataUtils.addPlayer(Objects.requireNonNull(player.getPlayer())); + PvPToggle.instance.players.put(player.getUniqueId(), PvPToggle.instance.dataUtils.GetPlayerPvPState(player.getPlayer())); //add player to players hash map and set their pvp state + } + + if (PvPToggle.instance.players.get(player.getUniqueId()) == false) { + if (PvPToggle.instance.getConfig().getBoolean("SETTINGS.PARTICLES")) { + Util.particleEffect(player.getPlayer()); + } + } + } + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + Player p = event.getPlayer(); + if (!PvPToggle.instance.getConfig().getBoolean("SETTINGS.PERSISTENT_PVP_STATE")) { + PvPToggle.instance.players.put(p.getUniqueId(), PvPToggle.instance.getConfig().getBoolean("SETTINGS.DEFAULT_PVP_OFF")); //add player to players hash map and set their pvp state + } else { + PvPToggle.instance.dataUtils.addPlayer(Objects.requireNonNull(p.getPlayer())); + PvPToggle.instance.players.put(p.getUniqueId(), PvPToggle.instance.dataUtils.GetPlayerPvPState(p.getPlayer())); //add player to players hash map and set their pvp state + } + + if (PvPToggle.instance.players.get(p.getUniqueId()) == false) { + if (PvPToggle.instance.getConfig().getBoolean("SETTINGS.PARTICLES")) { + Util.particleEffect(p.getPlayer()); + } + } + } +} diff --git a/src/com/github/aasmus/pvptoggle/listeners/PlayerLeave.java b/src/main/java/com/github/aasmus/pvptoggle/listeners/PlayerLeave.java similarity index 86% rename from src/com/github/aasmus/pvptoggle/listeners/PlayerLeave.java rename to src/main/java/com/github/aasmus/pvptoggle/listeners/PlayerLeave.java index b8eaca4..a9882c9 100644 --- a/src/com/github/aasmus/pvptoggle/listeners/PlayerLeave.java +++ b/src/main/java/com/github/aasmus/pvptoggle/listeners/PlayerLeave.java @@ -12,10 +12,10 @@ public class PlayerLeave implements Listener { @EventHandler public void onQuit(PlayerQuitEvent event) { Player p = event.getPlayer(); - if(PvPToggle.instance.getConfig().getBoolean("SETTINGS.PERSISTENT_PVP_STATE")) { + if (PvPToggle.instance.getConfig().getBoolean("SETTINGS.PERSISTENT_PVP_STATE")) { PvPToggle.instance.dataUtils.UpdatePlayerPvPState(p); } + PvPToggle.instance.players.remove(p.getUniqueId()); //remove player from players hash map } - } diff --git a/src/com/github/aasmus/pvptoggle/listeners/PvP.java b/src/main/java/com/github/aasmus/pvptoggle/listeners/PvP.java similarity index 59% rename from src/com/github/aasmus/pvptoggle/listeners/PvP.java rename to src/main/java/com/github/aasmus/pvptoggle/listeners/PvP.java index 8a68ee9..067273b 100644 --- a/src/com/github/aasmus/pvptoggle/listeners/PvP.java +++ b/src/main/java/com/github/aasmus/pvptoggle/listeners/PvP.java @@ -36,11 +36,11 @@ public void onHit(EntityDamageByEntityEvent event) { } //check if attack was a player - if (event.getDamager() instanceof Player && event.getEntity() instanceof Player) { - Player damager = (Player) event.getDamager(); //player who hit - Boolean damagerState = PvPToggle.instance.players.get(damager.getUniqueId()); - Player attacked = (Player) event.getEntity(); //player who was hit - Boolean attackedState = PvPToggle.instance.players.get(attacked.getUniqueId()); + if (event.getDamager() instanceof Player damager && event.getEntity() instanceof Player attacked) { + //player who hit + Boolean damagerState = PvPToggle.instance.players.get(damager.getUniqueId()); + //player who was hit + Boolean attackedState = PvPToggle.instance.players.get(attacked.getUniqueId()); if (damagerState) { event.setCancelled(true); Chat.send(damager, "PVP_DISABLED"); @@ -52,21 +52,19 @@ public void onHit(EntityDamageByEntityEvent event) { Util.setCooldownTime(attacked); } //checks if damage was done by a projectile - } else if (event.getDamager() instanceof Projectile) { - Projectile arrow = (Projectile) event.getDamager(); - if(arrow.getShooter() instanceof Player) { - if(event.getEntity() instanceof Player) { - Player damager = (Player) arrow.getShooter(); - Boolean damagerState = PvPToggle.instance.players.get(damager.getUniqueId()); - Player attacked = (Player) event.getEntity(); - Boolean attackedState = PvPToggle.instance.players.get(attacked.getUniqueId()); - if(damager == attacked) { + } else if (event.getDamager() instanceof Projectile arrow) { + if (arrow.getShooter() instanceof Player damager) { + if (event.getEntity() instanceof Player attacked) { + Boolean damagerState = PvPToggle.instance.players.get(damager.getUniqueId()); + Boolean attackedState = PvPToggle.instance.players.get(attacked.getUniqueId()); + if (damager == attacked) { return; } - if(damagerState) { + + if (damagerState) { event.setCancelled(true); Chat.send(damager, "PVP_DISABLED"); - } else if(attackedState != null && attackedState) { + } else if (attackedState != null && attackedState) { event.setCancelled(true); Chat.send(damager, "PVP_DISABLED_OTHERS", attacked.getDisplayName()); } else { @@ -76,16 +74,14 @@ public void onHit(EntityDamageByEntityEvent event) { } } //checks if damage was done by a potion - } else if(event.getDamager() instanceof ThrownPotion) { - ThrownPotion potion = (ThrownPotion) event.getDamager(); - if (potion.getShooter() instanceof Player && event.getEntity() instanceof Player) { - Player damager = (Player) potion.getShooter(); - Boolean damagerState = PvPToggle.instance.players.get(damager.getUniqueId()); - Player attacked = (Player) event.getEntity(); - Boolean attackedState = PvPToggle.instance.players.get(attacked.getUniqueId()); - if(damager == attacked) { + } else if (event.getDamager() instanceof ThrownPotion potion) { + if (potion.getShooter() instanceof Player damager && event.getEntity() instanceof Player attacked) { + Boolean damagerState = PvPToggle.instance.players.get(damager.getUniqueId()); + Boolean attackedState = PvPToggle.instance.players.get(attacked.getUniqueId()); + if (damager == attacked) { return; } + if (damagerState) { event.setCancelled(true); Chat.send(damager, "PVP_DISABLED"); @@ -97,15 +93,13 @@ public void onHit(EntityDamageByEntityEvent event) { Util.setCooldownTime(attacked); } } - } else if (event.getDamager() instanceof LightningStrike && event.getDamager().getMetadata("TRIDENT").size() >= 1 && event.getEntity() instanceof Player) { - Player attacked = (Player) event.getEntity(); - Boolean attackedState = PvPToggle.instance.players.get(attacked.getUniqueId()); + } else if (event.getDamager() instanceof LightningStrike && !event.getDamager().getMetadata("TRIDENT").isEmpty() && event.getEntity() instanceof Player attacked) { + Boolean attackedState = PvPToggle.instance.players.get(attacked.getUniqueId()); if (attackedState != null && attackedState) { event.setCancelled(true); } - } else if (event.getDamager() instanceof Firework && event.getEntity() instanceof Player) { - Player attacked = (Player) event.getEntity(); - Boolean attackedState = PvPToggle.instance.players.get(attacked.getUniqueId()); + } else if (event.getDamager() instanceof Firework && event.getEntity() instanceof Player attacked) { + Boolean attackedState = PvPToggle.instance.players.get(attacked.getUniqueId()); if (attackedState != null && attackedState) { event.setCancelled(true); } @@ -119,13 +113,10 @@ public void onFlameArrow(EntityCombustByEntityEvent event) { return; } - if(event.getCombuster() instanceof Arrow) { - Arrow arrow = (Arrow) event.getCombuster(); - if(arrow.getShooter() instanceof Player && event.getEntity() instanceof Player) { - Player damager = (Player) arrow.getShooter(); - Boolean damagerState = PvPToggle.instance.players.get(damager.getUniqueId()); - Player attacked = (Player) event.getEntity(); - Boolean attackedState = PvPToggle.instance.players.get(attacked.getUniqueId()); + if (event.getCombuster() instanceof Arrow arrow) { + if (arrow.getShooter() instanceof Player damager && event.getEntity() instanceof Player attacked) { + Boolean damagerState = PvPToggle.instance.players.get(damager.getUniqueId()); + Boolean attackedState = PvPToggle.instance.players.get(attacked.getUniqueId()); if (damagerState) { event.setCancelled(true); } else if (attackedState != null && attackedState) { @@ -145,26 +136,24 @@ public void onPotionSplash(PotionSplashEvent event) { return; } - if(event.getPotion().getShooter() instanceof Player) { - for(LivingEntity entity : event.getAffectedEntities()) { - if(entity instanceof Player) { - Player damager = (Player) event.getPotion().getShooter(); - Boolean damagerState = PvPToggle.instance.players.get(damager.getUniqueId()); - Player attacked = (Player) entity; - Boolean attackedState = PvPToggle.instance.players.get(attacked.getUniqueId()); - if(damager != attacked) { - if(damagerState) { + if (event.getPotion().getShooter() instanceof Player damager) { + for (LivingEntity entity : event.getAffectedEntities()) { + if (entity instanceof Player attacked) { + Boolean damagerState = PvPToggle.instance.players.get(damager.getUniqueId()); + Boolean attackedState = PvPToggle.instance.players.get(attacked.getUniqueId()); + if (damager != attacked) { + if (damagerState) { Collection affected = event.getAffectedEntities(); - for(LivingEntity ent : affected){ - if(ent instanceof Player && ent != damager){ + for (LivingEntity ent : affected) { + if (ent instanceof Player && ent != damager) { event.setIntensity(ent, 0); } } Chat.send(damager, "PVP_DISABLED"); - } else if(attackedState != null && attackedState) { + } else if (attackedState != null && attackedState) { Collection affected = event.getAffectedEntities(); - for(LivingEntity ent : affected){ - if(ent instanceof Player && ent != damager){ + for (LivingEntity ent : affected) { + if (ent instanceof Player && ent != damager) { event.setIntensity(ent, 0); } } @@ -186,18 +175,16 @@ public void onCloudEffects(AreaEffectCloudApplyEvent event) { return; } - if(event.getEntity().getSource() instanceof Player) { + if (event.getEntity().getSource() instanceof Player damager) { Iterator it = event.getAffectedEntities().iterator(); - while(it.hasNext()) { + while (it.hasNext()) { LivingEntity entity = it.next(); - if(entity instanceof Player && entity != null) { - Player damager = (Player) event.getEntity().getSource(); - Boolean damagerState = PvPToggle.instance.players.get(damager.getUniqueId()); - Player attacked = (Player) entity; - Boolean attackedState = PvPToggle.instance.players.get(attacked.getUniqueId()); - if(attackedState != null && attackedState) { + if (entity instanceof Player attacked) { + Boolean damagerState = PvPToggle.instance.players.get(damager.getUniqueId()); + Boolean attackedState = PvPToggle.instance.players.get(attacked.getUniqueId()); + if (attackedState != null && attackedState) { it.remove(); - } else if(damagerState) { + } else if (damagerState) { it.remove(); } else { Util.setCooldownTime(damager); @@ -215,10 +202,9 @@ public void onPlayerFishing (PlayerFishEvent event) { return; } - if (event.getCaught() instanceof Player) { + if (event.getCaught() instanceof Player attacked) { final Player damager = event.getPlayer(); Boolean damagerState = PvPToggle.instance.players.get(damager.getUniqueId()); - final Player attacked = (Player) event.getCaught(); Boolean attackedState = PvPToggle.instance.players.get(attacked.getUniqueId()); if (damager.getInventory().getItemInMainHand().getType() == Material.FISHING_ROD || damager.getInventory().getItemInOffHand().getType() == Material.FISHING_ROD) { if (damagerState) { @@ -237,10 +223,9 @@ public void onPlayerFishing (PlayerFishEvent event) { //Tag lightning strike as from a trident @EventHandler(ignoreCancelled = true) - public void onLightningStrike(LightningStrikeEvent event){ - if(event.getCause() == LightningStrikeEvent.Cause.TRIDENT){ + public void onLightningStrike(LightningStrikeEvent event) { + if (event.getCause() == LightningStrikeEvent.Cause.TRIDENT) { event.getLightning().setMetadata("TRIDENT", new FixedMetadataValue(PvPToggle.instance, event.getLightning().getLocation())); } } - } diff --git a/src/com/github/aasmus/pvptoggle/utils/Chat.java b/src/main/java/com/github/aasmus/pvptoggle/utils/Chat.java similarity index 63% rename from src/com/github/aasmus/pvptoggle/utils/Chat.java rename to src/main/java/com/github/aasmus/pvptoggle/utils/Chat.java index 3f4e08a..9ac8690 100644 --- a/src/com/github/aasmus/pvptoggle/utils/Chat.java +++ b/src/main/java/com/github/aasmus/pvptoggle/utils/Chat.java @@ -11,32 +11,38 @@ public class Chat { // sends message without a parameter public static void send(CommandSender sender, String message) { String msg = PvPToggle.instance.getConfig().getString("MESSAGES." + message); - if(msg.equals("")) - return; - sender.sendMessage(ChatColor.translateAlternateColorCodes('&', msg)); + if (msg != null && msg.isEmpty()) { + return; + } + + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', msg)); } // sends message with a parameter public static void send(CommandSender sender, String message, String parameter) { String msg = PvPToggle.instance.getConfig().getString("MESSAGES." + message); - if(msg.equals("")) - return; - String output = msg.replaceAll("", parameter); + if (msg != null && msg.isEmpty()) { + return; + } + + String output = msg.replaceAll("", parameter); sender.sendMessage(ChatColor.translateAlternateColorCodes('&', output)); } // sends message with a parameter and pvp state public static void send(CommandSender sender, String message, String parameter, Boolean pvpState) { String msg = PvPToggle.instance.getConfig().getString("MESSAGES." + message); - if(msg.equals("")) - return; - String output = msg.replaceAll("", parameter); - if(pvpState == true) { - output = output.replaceAll("", "off"); + if (msg != null && msg.isEmpty()) { + return; + } + + String output = msg.replaceAll("", parameter); + if (pvpState == true) { + output = output.replace("", "off"); } else { - output = output.replaceAll("", "on"); + output = output.replace("", "on"); } + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', output)); } - } diff --git a/src/com/github/aasmus/pvptoggle/utils/PersistentData.java b/src/main/java/com/github/aasmus/pvptoggle/utils/PersistentData.java similarity index 96% rename from src/com/github/aasmus/pvptoggle/utils/PersistentData.java rename to src/main/java/com/github/aasmus/pvptoggle/utils/PersistentData.java index c2f9bb5..06fd23f 100644 --- a/src/com/github/aasmus/pvptoggle/utils/PersistentData.java +++ b/src/main/java/com/github/aasmus/pvptoggle/utils/PersistentData.java @@ -9,18 +9,18 @@ import com.github.aasmus.pvptoggle.PvPToggle; public class PersistentData { - - private File dir; - + + private final File dir; + public PersistentData(File file) { file.mkdir(); this.dir = file; } - + public void addPlayer(Player p) { File file = new File(dir.getPath(), p.getUniqueId() + ".yml"); - - if(!file.exists()) { + + if (!file.exists()) { try { FileConfiguration playerData = YamlConfiguration.loadConfiguration(file); playerData.createSection("PvPState"); @@ -47,5 +47,4 @@ public boolean GetPlayerPvPState(Player p) { FileConfiguration playerData = YamlConfiguration.loadConfiguration(new File(dir.getPath(), p.getUniqueId() + ".yml")); return playerData.getBoolean("PvPState"); } - } diff --git a/src/com/github/aasmus/pvptoggle/utils/PlaceholderAPIHook.java b/src/main/java/com/github/aasmus/pvptoggle/utils/PlaceholderAPIHook.java similarity index 55% rename from src/com/github/aasmus/pvptoggle/utils/PlaceholderAPIHook.java rename to src/main/java/com/github/aasmus/pvptoggle/utils/PlaceholderAPIHook.java index f4c5be2..d401b8a 100644 --- a/src/com/github/aasmus/pvptoggle/utils/PlaceholderAPIHook.java +++ b/src/main/java/com/github/aasmus/pvptoggle/utils/PlaceholderAPIHook.java @@ -4,23 +4,27 @@ import com.github.aasmus.pvptoggle.PvPToggle; import me.clip.placeholderapi.expansion.PlaceholderExpansion; - +import org.jspecify.annotations.NonNull; public class PlaceholderAPIHook extends PlaceholderExpansion { - private PvPToggle plugin; + private final PvPToggle plugin; public PlaceholderAPIHook(PvPToggle plugin) { this.plugin = plugin; } @Override - public String onPlaceholderRequest(Player player, String identifier) { - if(player == null) { return ""; } + public String onPlaceholderRequest(Player player, @NonNull String identifier) { + if (player == null) { + return ""; + } //Placeholder: %pvptoggle_positive_rep% - if(identifier.equals("pvp_state")) { - return PvPToggle.instance.players.get(player.getUniqueId()) ? "&aOff" : "&cOn"; + if (identifier.equals("pvp_state")) { + return PvPToggle.instance.players.get(player.getUniqueId()) + ? PvPToggle.instance.getConfig().getString("MESSAGES.PLACEHOLDER_OFF") + : PvPToggle.instance.getConfig().getString("MESSAGES.PLACEHOLDER_ON"); } return null; @@ -37,19 +41,17 @@ public boolean canRegister() { } @Override - public String getIdentifier() { + public @NonNull String getIdentifier() { return "PvPToggle"; } @Override - public String getAuthor() { + public @NonNull String getAuthor() { return plugin.getDescription().getAuthors().toString(); } - @Override - public String getVersion() { + public @NonNull String getVersion() { return plugin.getDescription().getVersion(); } - } diff --git a/src/main/java/com/github/aasmus/pvptoggle/utils/Util.java b/src/main/java/com/github/aasmus/pvptoggle/utils/Util.java new file mode 100644 index 0000000..b865a60 --- /dev/null +++ b/src/main/java/com/github/aasmus/pvptoggle/utils/Util.java @@ -0,0 +1,99 @@ +package com.github.aasmus.pvptoggle.utils; +import java.util.Date; +import java.util.UUID; +import org.bukkit.*; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import com.github.aasmus.pvptoggle.PvPToggle; + +public class Util { + + private static final float radius = .75f; + + public static boolean getPlayerState(UUID uuid) { + Boolean result = PvPToggle.instance.players.get(uuid); + if (result == null) { + return false; + } else { + return result; + } + } + + public static void setPlayerState(UUID uuid, boolean state) { + PvPToggle.instance.players.put(uuid,state); + } + + // Set player state while performing checks to make sure it's a valid switch. + public static boolean setPlayerState(Player player, boolean state, CommandSender caller) { + if (player == null) { + return false; + } + + World world = player.getWorld(); + // You can't set the state to false (PVP enabled) if the world doesn't allow it + if (Boolean.FALSE.equals(world.getGameRuleValue(GameRules.PVP)) && !state) { + if (caller == player) { + Chat.send(caller, "PVP_WORLD_CANNOT_CHANGE_SELF"); + } else { + Chat.send(caller, "PVP_WORLD_CANNOT_CHANGE_OTHERS"); + } + return false; + } + + // You can't set the state to true (PVP disabled) if the world requires it + if (Boolean.TRUE.equals(world.getGameRuleValue(GameRules.PVP)) && PvPToggle.blockedWorlds.contains(world.getName()) && state) { + if (caller == player) { + Chat.send(caller, "PVP_WORLD_CANNOT_CHANGE_SELF"); + } else { + Chat.send(caller, "PVP_WORLD_CANNOT_CHANGE_OTHERS"); + } + return false; + } + + setPlayerState(player.getUniqueId(), state); + return true; + } + + public static void setCooldownTime(Player player) { + PvPToggle.instance.cooldowns.put(player.getUniqueId(), new Date()); + } + + public static void removeCooldownTime(Player player) { + PvPToggle.instance.cooldowns.remove(player.getUniqueId()); + } + + public static boolean getCooldown(Player player) { + if (PvPToggle.instance.cooldowns.containsKey(player.getUniqueId())) { + Date lastChange = PvPToggle.instance.cooldowns.get(player.getUniqueId()); + Date currentTime = new Date(); + int seconds = (int) (currentTime.getTime() - lastChange.getTime())/1000; + if (seconds > PvPToggle.instance.getConfig().getInt("SETTINGS.COOLDOWN") || player.hasPermission("pvptoggle.bypass")) { + Util.removeCooldownTime(player); + return false; + } else { + Chat.send(player, "PVP_COOLDOWN", String.valueOf(PvPToggle.instance.getConfig().getInt("SETTINGS.COOLDOWN") - seconds)); + return true; + } + } else { + return false; + } + } + + public static void particleEffect(Player player) { + player.getScheduler().runAtFixedRate(PvPToggle.instance, task -> { + if (!player.isOnline() || PvPToggle.instance.players.get(player.getUniqueId()) != false) { + task.cancel(); + } else if (!player.isDead()) { + double angle = 0; + Particle.DustOptions dustOptions = new Particle.DustOptions(Color.RED, 1); + Location location = player.getLocation(); + for (int i = 0; i < 25; i++) { + double x = (radius * Math.sin(angle)); + double z = (radius * Math.cos(angle)); + angle += 0.251; + player.getWorld().spawnParticle(Particle.DUST, location.getX()+x, location.getY(), location.getZ()+z, 0, 0, 1, 0, dustOptions); + } + } + }, null, 1L, 2L); + } +} diff --git a/src/resources/config.yml b/src/main/resources/config.yml similarity index 92% rename from src/resources/config.yml rename to src/main/resources/config.yml index bfbadcd..92cf5e4 100644 --- a/src/resources/config.yml +++ b/src/main/resources/config.yml @@ -9,7 +9,7 @@ SETTINGS: PARTICLES: true ##SHOW PVP on red nametag NAMETAG: false -## Worlds to disable PvP toggling in (i.e. will always use the world's settings) +## Worlds to disable PvP toggling in (i.e., will always use the world's settings) BLOCKED_WORLDS: [] ## goes in place of a player's current pvp state ## goes in place of a player's name or other parameter @@ -32,4 +32,6 @@ MESSAGES: PVP_WORLD_CHANGE_DISABLED: '&aYour pvp has been disabled because the world you entered does not allow pvp.' PVP_WORLD_CHANGE_REQUIRED: '&aYour pvp has been enabled because the world you enter requires pvp.' PVP_WORLD_CANNOT_CHANGE_SELF: '&cYou cannot change pvp state in this world.' - PVP_WORLD_CANNOT_CHANGE_OTHERS: '&cYou cannot change pvp state in that world.' \ No newline at end of file + PVP_WORLD_CANNOT_CHANGE_OTHERS: '&cYou cannot change pvp state in that world.' + PLACEHOLDER_OFF: '&aOff' + PLACEHOLDER_ON: '&cOn' diff --git a/src/resources/plugin.yml b/src/main/resources/plugin.yml similarity index 85% rename from src/resources/plugin.yml rename to src/main/resources/plugin.yml index 40c764d..60f389f 100644 --- a/src/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,10 +1,11 @@ main: com.github.aasmus.pvptoggle.PvPToggle -softdepend: [PlaceholderAPI, NametagEdit] name: PvPToggle -version: 1.7 -api-version: 1.13 -author: aasmus (with modifications by the Red Fusion Team) +version: 2.0 +api-version: '1.13' +folia-supported: true +author: aasmus description: Plugin that allows players to toggle PvP state +softdepend: [ PlaceholderAPI ] commands: pvp: description: used to change PvP state. diff --git a/target/PvPToggle-2.0.jar b/target/PvPToggle-2.0.jar new file mode 100644 index 0000000..9e1880d Binary files /dev/null and b/target/PvPToggle-2.0.jar differ diff --git a/target/classes/com/github/aasmus/pvptoggle/PvPCommand.class b/target/classes/com/github/aasmus/pvptoggle/PvPCommand.class new file mode 100644 index 0000000..b7038ce Binary files /dev/null and b/target/classes/com/github/aasmus/pvptoggle/PvPCommand.class differ diff --git a/target/classes/com/github/aasmus/pvptoggle/PvPToggle.class b/target/classes/com/github/aasmus/pvptoggle/PvPToggle.class new file mode 100644 index 0000000..580ed8c Binary files /dev/null and b/target/classes/com/github/aasmus/pvptoggle/PvPToggle.class differ diff --git a/target/classes/com/github/aasmus/pvptoggle/events/PvPToggleEvent.class b/target/classes/com/github/aasmus/pvptoggle/events/PvPToggleEvent.class new file mode 100644 index 0000000..d6567e3 Binary files /dev/null and b/target/classes/com/github/aasmus/pvptoggle/events/PvPToggleEvent.class differ diff --git a/target/classes/com/github/aasmus/pvptoggle/listeners/PlayerChangeWorld.class b/target/classes/com/github/aasmus/pvptoggle/listeners/PlayerChangeWorld.class new file mode 100644 index 0000000..6369ced Binary files /dev/null and b/target/classes/com/github/aasmus/pvptoggle/listeners/PlayerChangeWorld.class differ diff --git a/target/classes/com/github/aasmus/pvptoggle/listeners/PlayerJoin.class b/target/classes/com/github/aasmus/pvptoggle/listeners/PlayerJoin.class new file mode 100644 index 0000000..4bf95c6 Binary files /dev/null and b/target/classes/com/github/aasmus/pvptoggle/listeners/PlayerJoin.class differ diff --git a/target/classes/com/github/aasmus/pvptoggle/listeners/PlayerLeave.class b/target/classes/com/github/aasmus/pvptoggle/listeners/PlayerLeave.class new file mode 100644 index 0000000..84e74b5 Binary files /dev/null and b/target/classes/com/github/aasmus/pvptoggle/listeners/PlayerLeave.class differ diff --git a/target/classes/com/github/aasmus/pvptoggle/listeners/PvP.class b/target/classes/com/github/aasmus/pvptoggle/listeners/PvP.class new file mode 100644 index 0000000..8902865 Binary files /dev/null and b/target/classes/com/github/aasmus/pvptoggle/listeners/PvP.class differ diff --git a/target/classes/com/github/aasmus/pvptoggle/utils/Chat.class b/target/classes/com/github/aasmus/pvptoggle/utils/Chat.class new file mode 100644 index 0000000..5cde395 Binary files /dev/null and b/target/classes/com/github/aasmus/pvptoggle/utils/Chat.class differ diff --git a/target/classes/com/github/aasmus/pvptoggle/utils/PersistentData.class b/target/classes/com/github/aasmus/pvptoggle/utils/PersistentData.class new file mode 100644 index 0000000..ae4b1dc Binary files /dev/null and b/target/classes/com/github/aasmus/pvptoggle/utils/PersistentData.class differ diff --git a/target/classes/com/github/aasmus/pvptoggle/utils/PlaceholderAPIHook.class b/target/classes/com/github/aasmus/pvptoggle/utils/PlaceholderAPIHook.class new file mode 100644 index 0000000..09d79dc Binary files /dev/null and b/target/classes/com/github/aasmus/pvptoggle/utils/PlaceholderAPIHook.class differ diff --git a/target/classes/com/github/aasmus/pvptoggle/utils/Util.class b/target/classes/com/github/aasmus/pvptoggle/utils/Util.class new file mode 100644 index 0000000..f1caf5a Binary files /dev/null and b/target/classes/com/github/aasmus/pvptoggle/utils/Util.class differ diff --git a/target/classes/config.yml b/target/classes/config.yml new file mode 100644 index 0000000..92cf5e4 --- /dev/null +++ b/target/classes/config.yml @@ -0,0 +1,37 @@ +SETTINGS: +##Do you want the plugin to remember a player's last PVP state when the login + PERSISTENT_PVP_STATE: false +##How much time a player must wait to use /pvp off/toggle (if pvp is on) in seconds after running the command or being in pvp + COOLDOWN: 0 +##True makes pvp off by default. False makes pvp on by default. + DEFAULT_PVP_OFF: true +##Show PVP on particle effects + PARTICLES: true +##SHOW PVP on red nametag + NAMETAG: false +## Worlds to disable PvP toggling in (i.e., will always use the world's settings) + BLOCKED_WORLDS: [] +## goes in place of a player's current pvp state +## goes in place of a player's name or other parameter +MESSAGES: + HELP_HEADER: '&a&lCommands:' + HELP_GENERAL_USEAGE: '&aUse /pvp {toggle|on|off|status} to change/view pvp state.' + HELP_VIEW_OTHERS: '&aUse /pvp to see another players pvp state.' + HELP_SET_OTHERS: '&aUse /pvp {toggle|on|off} to set another players pvp state.' + NO_PLAYER: '&cCould not find a player by the name ' + COMMAND_INVALID_PARAMETER: '&c is an invalid parameter. {toggle|on|off|status}' + COMMAND_NO_PERMISSION: '&cYou do not have permission to set others pvp state.' + PVP_STATE_ENABLED: '&aYour pvp has been enabled!' + PVP_STATE_DISABLED: '&aYour pvp has been disabled!' + PVP_STATE_CHANGED_OTHERS: '&a had their pvp state changed to ' + PVP_STATUS: '&aYour pvp is set to ' + PVP_STATUS_OTHERS: '&a has their pvp ' + PVP_DISABLED: '&cYou have pvp disabled!' + PVP_DISABLED_OTHERS: '&c has pvp disabled!' + PVP_COOLDOWN: '&cToo fast! You can turn off pvp in seconds.' + PVP_WORLD_CHANGE_DISABLED: '&aYour pvp has been disabled because the world you entered does not allow pvp.' + PVP_WORLD_CHANGE_REQUIRED: '&aYour pvp has been enabled because the world you enter requires pvp.' + PVP_WORLD_CANNOT_CHANGE_SELF: '&cYou cannot change pvp state in this world.' + PVP_WORLD_CANNOT_CHANGE_OTHERS: '&cYou cannot change pvp state in that world.' + PLACEHOLDER_OFF: '&aOff' + PLACEHOLDER_ON: '&cOn' diff --git a/target/classes/plugin.yml b/target/classes/plugin.yml new file mode 100644 index 0000000..60f389f --- /dev/null +++ b/target/classes/plugin.yml @@ -0,0 +1,30 @@ +main: com.github.aasmus.pvptoggle.PvPToggle +name: PvPToggle +version: 2.0 +api-version: '1.13' +folia-supported: true +author: aasmus +description: Plugin that allows players to toggle PvP state +softdepend: [ PlaceholderAPI ] +commands: + pvp: + description: used to change PvP state. + usage: /pvp + permission: pvptoggle.allow + permission-message: You don't have the pvptoggle.allow permission node. +permissions: + pvptoggle.allow: + description: allows player to change pvp state + default: true + pvptoggle.others: + description: allows player to see other player's pvp state + default: op + pvptoggle.others.set: + description: allows player to set other players pvp state + default: op + pvptoggle.bypass: + description: allows player to bypass cooldown + default: op + pvptoggle.reload: + description: allows player to reload config + default: op diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties new file mode 100644 index 0000000..12bbf12 --- /dev/null +++ b/target/maven-archiver/pom.properties @@ -0,0 +1,3 @@ +artifactId=PvPToggle +groupId=com.github.aasmus +version=2.0 diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..6a25dd1 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,11 @@ +com/github/aasmus/pvptoggle/PvPToggle.class +com/github/aasmus/pvptoggle/listeners/PlayerChangeWorld.class +com/github/aasmus/pvptoggle/utils/Util.class +com/github/aasmus/pvptoggle/events/PvPToggleEvent.class +com/github/aasmus/pvptoggle/utils/Chat.class +com/github/aasmus/pvptoggle/listeners/PlayerLeave.class +com/github/aasmus/pvptoggle/utils/PersistentData.class +com/github/aasmus/pvptoggle/PvPCommand.class +com/github/aasmus/pvptoggle/listeners/PvP.class +com/github/aasmus/pvptoggle/listeners/PlayerJoin.class +com/github/aasmus/pvptoggle/utils/PlaceholderAPIHook.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..22b8ba4 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,11 @@ +/home/rootbeer/IdeaProjects/PvPToggle/src/main/java/com/github/aasmus/pvptoggle/PvPCommand.java +/home/rootbeer/IdeaProjects/PvPToggle/src/main/java/com/github/aasmus/pvptoggle/PvPToggle.java +/home/rootbeer/IdeaProjects/PvPToggle/src/main/java/com/github/aasmus/pvptoggle/events/PvPToggleEvent.java +/home/rootbeer/IdeaProjects/PvPToggle/src/main/java/com/github/aasmus/pvptoggle/listeners/PlayerChangeWorld.java +/home/rootbeer/IdeaProjects/PvPToggle/src/main/java/com/github/aasmus/pvptoggle/listeners/PlayerJoin.java +/home/rootbeer/IdeaProjects/PvPToggle/src/main/java/com/github/aasmus/pvptoggle/listeners/PlayerLeave.java +/home/rootbeer/IdeaProjects/PvPToggle/src/main/java/com/github/aasmus/pvptoggle/listeners/PvP.java +/home/rootbeer/IdeaProjects/PvPToggle/src/main/java/com/github/aasmus/pvptoggle/utils/Chat.java +/home/rootbeer/IdeaProjects/PvPToggle/src/main/java/com/github/aasmus/pvptoggle/utils/PersistentData.java +/home/rootbeer/IdeaProjects/PvPToggle/src/main/java/com/github/aasmus/pvptoggle/utils/PlaceholderAPIHook.java +/home/rootbeer/IdeaProjects/PvPToggle/src/main/java/com/github/aasmus/pvptoggle/utils/Util.java