diff --git a/server/src/main/java/dev/plex/command/impl/ToggleCMD.java b/server/src/main/java/dev/plex/command/impl/ToggleCMD.java index d152967..28ebc3b 100644 --- a/server/src/main/java/dev/plex/command/impl/ToggleCMD.java +++ b/server/src/main/java/dev/plex/command/impl/ToggleCMD.java @@ -32,6 +32,7 @@ public class ToggleCMD extends PlexCommand sender.sendMessage(PlexUtils.mmDeserialize(" - Fluidspread" + status("fluidspread"))); sender.sendMessage(PlexUtils.mmDeserialize(" - Drops" + status("drops"))); sender.sendMessage(PlexUtils.mmDeserialize(" - Redstone" + status("redstone"))); + sender.sendMessage(PlexUtils.mmDeserialize(" - PVP" + status("pvp"))); sender.sendMessage(PlexUtils.mmDeserialize(" - Chat" + status("chat"))); return null; } @@ -53,6 +54,10 @@ public class ToggleCMD extends PlexCommand { return toggle("redstone"); } + case "pvp" -> + { + return toggle("pvp"); + } case "chat" -> { PlexUtils.broadcast(PlexUtils.messageComponent("chatToggled", sender.getName(), plugin.toggles.getBoolean("chat") ? "off" : "on")); diff --git a/server/src/main/java/dev/plex/listener/impl/TogglesListener.java b/server/src/main/java/dev/plex/listener/impl/TogglesListener.java index 5196d29..801770e 100644 --- a/server/src/main/java/dev/plex/listener/impl/TogglesListener.java +++ b/server/src/main/java/dev/plex/listener/impl/TogglesListener.java @@ -4,23 +4,26 @@ import dev.plex.Plex; import dev.plex.listener.PlexListener; import dev.plex.util.PlexUtils; import io.papermc.paper.event.player.AsyncChatEvent; +import io.papermc.paper.event.player.PrePlayerAttackEntityEvent; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.entity.Player; +import org.bukkit.entity.ThrownPotion; import org.bukkit.event.EventHandler; import org.bukkit.event.block.BlockExplodeEvent; import org.bukkit.event.block.BlockFromToEvent; import org.bukkit.event.block.BlockRedstoneEvent; -import org.bukkit.event.entity.EntityExplodeEvent; -import org.bukkit.event.entity.ExplosionPrimeEvent; +import org.bukkit.event.entity.*; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.projectiles.ProjectileSource; import java.util.List; public class TogglesListener extends PlexListener { List commands = plugin.commands.getStringList("block_on_mute"); + @EventHandler public void onExplosionPrime(ExplosionPrimeEvent event) { @@ -32,7 +35,8 @@ public class TogglesListener extends PlexListener } @EventHandler - public void onBlockExplode(BlockExplodeEvent event) { + public void onBlockExplode(BlockExplodeEvent event) + { if (!plugin.toggles.getBoolean("explosions")) { event.getBlock().breakNaturally(); @@ -97,10 +101,12 @@ public class TogglesListener extends PlexListener for (String command : commands) { Command cmd = Bukkit.getCommandMap().getCommand(command); - if (cmd == null) { + if (cmd == null) + { return; } - if (cmd.getAliases().contains(message.toLowerCase())) { + if (cmd.getAliases().contains(message.toLowerCase())) + { event.getPlayer().sendMessage(PlexUtils.messageComponent("chatIsOff")); event.setCancelled(true); return; @@ -110,6 +116,56 @@ public class TogglesListener extends PlexListener } + @EventHandler + public void onPlayerAttack(PrePlayerAttackEntityEvent event) + { + if (!plugin.toggles.getBoolean("pvp")) + { + if (event.getAttacked() instanceof Player) + { + event.setCancelled(true); + + event.getPlayer().sendMessage(PlexUtils.messageComponent("pvpDisabled")); + } + } + } + + @EventHandler + public void onPotionSplash(PotionSplashEvent event) + { + if (!plugin.toggles.getBoolean("pvp")) + { + ProjectileSource shooter = event.getEntity().getShooter(); + if (shooter instanceof Player) + { + ThrownPotion potion = event.getPotion(); + if (potion.getEffects().stream().anyMatch(effect -> effect.getType().getName().startsWith("HARM") || + effect.getType().getName().startsWith("POISON")) && + event.getAffectedEntities().stream().anyMatch(entity -> entity instanceof Player)) + { + + event.setCancelled(true); + ((Player) shooter).sendMessage(PlexUtils.messageComponent("pvpDisabled")); + } + } + } + } + + @EventHandler + public void onProjectileHit(ProjectileHitEvent event) + { + if (!plugin.toggles.getBoolean("pvp")) + { + ProjectileSource shooter = event.getEntity().getShooter(); + if (shooter instanceof Player && event.getHitEntity() instanceof Player) + { + event.setCancelled(true); + + ((Player) shooter).sendMessage(PlexUtils.messageComponent("pvpDisabled")); + } + } + } + /* I have no idea if this is the best way to do this There is a very weird bug where if you try to create a loop using two repeaters and a lever, after disabling and re-enabling redstone, you are unable to recreate the loop with a lever. Using a redstone torch works fine. diff --git a/server/src/main/java/dev/plex/menu/impl/ToggleMenu.java b/server/src/main/java/dev/plex/menu/impl/ToggleMenu.java index 0f9b71a..e4e4345 100644 --- a/server/src/main/java/dev/plex/menu/impl/ToggleMenu.java +++ b/server/src/main/java/dev/plex/menu/impl/ToggleMenu.java @@ -7,6 +7,7 @@ import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; +import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -24,6 +25,7 @@ public class ToggleMenu extends AbstractMenu resetFluidspreadItem(this.inventory()); resetDropsItem(this.inventory()); resetRedstoneItem(this.inventory()); + resetPVPItem(this.inventory()); resetChatItem(this.inventory()); } @@ -67,6 +69,17 @@ public class ToggleMenu extends AbstractMenu inventory.setItem(3, redstone); } + private void resetPVPItem(Inventory inventory) + { + ItemStack pvp = new ItemStack(Material.IRON_SWORD); + ItemMeta pvpItemMeta = pvp.getItemMeta(); + pvpItemMeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); + pvpItemMeta.displayName(PlexUtils.mmDeserialize("PVP")); + pvpItemMeta.lore(List.of(PlexUtils.mmDeserialize("PVP is " + (plugin.toggles.getBoolean("pvp") ? "enabled" : "disabled")))); + pvp.setItemMeta(pvpItemMeta); + inventory.setItem(4, pvp); + } + private void resetChatItem(Inventory inventory) { ItemStack chat = new ItemStack(Material.OAK_SIGN); @@ -74,7 +87,7 @@ public class ToggleMenu extends AbstractMenu chatItemMeta.displayName(PlexUtils.mmDeserialize("Toggle chat")); chatItemMeta.lore(List.of(PlexUtils.mmDeserialize("Chat is currently " + (plugin.toggles.getBoolean("chat") ? "on" : "off")))); chat.setItemMeta(chatItemMeta); - inventory.setItem(4, chat); + inventory.setItem(5, chat); } @Override @@ -104,6 +117,12 @@ public class ToggleMenu extends AbstractMenu resetRedstoneItem(inventory); player.sendMessage(PlexUtils.mmDeserialize("Toggled redstone.")); } + if (clicked.getType() == Material.IRON_SWORD) + { + plugin.toggles.set("pvp", !plugin.toggles.getBoolean("pvp")); + resetPVPItem(inventory); + player.sendMessage(PlexUtils.mmDeserialize("Toggled PVP")); + } if (clicked.getType() == Material.OAK_SIGN) { plugin.toggles.set("chat", !plugin.toggles.getBoolean("chat")); diff --git a/server/src/main/resources/messages.yml b/server/src/main/resources/messages.yml index 38cd95c..28685f7 100644 --- a/server/src/main/resources/messages.yml +++ b/server/src/main/resources/messages.yml @@ -119,6 +119,7 @@ playerFrozen: "That player is already frozen!" playerMuted: "That player is already muted!" playerLockedUp: "That player is already locked up!" muted: "You are currently muted - STFU!" +pvpDisabled: "PVP has been disabled!" chatIsOff: "Chat is currently toggled off!" # 0 - The command sender # 1 - The set value of the chat toggle diff --git a/server/src/main/resources/toggles.yml b/server/src/main/resources/toggles.yml index 55c2437..5f2f3b4 100644 --- a/server/src/main/resources/toggles.yml +++ b/server/src/main/resources/toggles.yml @@ -14,3 +14,6 @@ redstone: true # Is chat enabled? chat: true + +# Is PVP enabled? +pvp: true