diff --git a/src/main/java/com/lenis0012/bukkit/marriage2/commands/CommandPVP.java b/src/main/java/com/lenis0012/bukkit/marriage2/commands/CommandPVP.java new file mode 100644 index 0000000..71c387e --- /dev/null +++ b/src/main/java/com/lenis0012/bukkit/marriage2/commands/CommandPVP.java @@ -0,0 +1,48 @@ +package com.lenis0012.bukkit.marriage2.commands; + +import com.lenis0012.bukkit.marriage2.MData; +import com.lenis0012.bukkit.marriage2.MPlayer; +import com.lenis0012.bukkit.marriage2.Marriage; +import com.lenis0012.bukkit.marriage2.config.Message; +import com.lenis0012.bukkit.marriage2.config.Permissions; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +public class CommandPVP extends Command { + public CommandPVP(Marriage marriage) { + super(marriage, "pvp"); + setPermission(Permissions.PVP_TOGGLE); + setDescription(Message.COMMAND_PVP.toString()); + setUsage(Message.ON_OFF.toString()); + } + + @Override + public void execute() { + MPlayer mPlayer = marriage.getMPlayer(player.getUniqueId()); + MData marriage = mPlayer.getMarriage(); + if(marriage == null) { + reply(Message.NOT_MARRIED); + return; + } + + boolean value = value(marriage); + marriage.setPVPEnabled(value); + reply(value ? Message.PVP_ENABLED : Message.PVP_DISABLED); + + Player partner = Bukkit.getPlayer(marriage.getOtherPlayer(player.getUniqueId())); + if(partner == null) { + return; + } + + reply(partner, Message.PARTNER_PVP); + } + + private boolean value(MData marriage) { + if(getArgLength() == 0) { + // Toggle + return !marriage.isPVPEnabled(); + } + + return getArg(0).equalsIgnoreCase("on"); + } +} diff --git a/src/main/java/com/lenis0012/bukkit/marriage2/config/Message.java b/src/main/java/com/lenis0012/bukkit/marriage2/config/Message.java index 3b2f78e..f3d0786 100644 --- a/src/main/java/com/lenis0012/bukkit/marriage2/config/Message.java +++ b/src/main/java/com/lenis0012/bukkit/marriage2/config/Message.java @@ -48,6 +48,9 @@ public enum Message { FULL_HEALTH("&cYour partner already has full health!"), HEALTH_GIVEN("&aYou healed your partner by %s hearts!"), HEALTH_TAKEN("&aYou were healed by your partner with %s hearts!"), + PVP_ENABLED("&aYou have enabled pvp with your partner!"), + PVP_DISABLED("&aYou have disabled pvp with your partner!"), + PARTNER_PVP("&aYour partner has changed pvp rules."), // COMMANDS COMMAND_MARRY("Request a marriage with another player"), @@ -62,10 +65,12 @@ public enum Message { COMMAND_SETHOME("Set a home for you a your partner"), COMMAND_TELEPORT("Teleport to your partner"), COMMAND_HEAL("Send your health to your partner"), + COMMAND_PVP("Enable/disable pvping with your partner"), // WORDS STATUS("&aStatus: %s"), - SINGLE("&fsingle"); + SINGLE("&fsingle"), + ON_OFF("on/off"); private final String defaultMessage; private String message; diff --git a/src/main/java/com/lenis0012/bukkit/marriage2/config/Permissions.java b/src/main/java/com/lenis0012/bukkit/marriage2/config/Permissions.java index 69d9471..50ee811 100644 --- a/src/main/java/com/lenis0012/bukkit/marriage2/config/Permissions.java +++ b/src/main/java/com/lenis0012/bukkit/marriage2/config/Permissions.java @@ -33,6 +33,7 @@ public enum Permissions { CHAT("marry.chat"), SEEN("marry.seen"), HEAL("marry.heal"), + PVP_TOGGLE("marry.pvptoggle"), /** * Non-commands */ diff --git a/src/main/java/com/lenis0012/bukkit/marriage2/config/Settings.java b/src/main/java/com/lenis0012/bukkit/marriage2/config/Settings.java index 0a0b34d..8f10e26 100644 --- a/src/main/java/com/lenis0012/bukkit/marriage2/config/Settings.java +++ b/src/main/java/com/lenis0012/bukkit/marriage2/config/Settings.java @@ -31,13 +31,14 @@ public class Settings { "Chat, set the format of private messages and in-chat status.", "Supported tags for chat: {partner}, for pm: {name}, {message}, chat spy: {sender}, {receiver}, {message}", "Icons are always available: {icon:heart}, {icon:male}, {icon:female}, {icon:genderless}", - "If you use a custom chat plugin, put {marriage_status} in the format and set force-status-format to false", + "If you use a custom chat plugin, put {marriage_status} in the format and set force-status-format & force-gender-format to false", "To show genders in chat, put {marriage_gender} in chat plugin format" }) public static final ConfigOption PM_FORMAT = new ConfigOption<>("chat.pm-format", "&4{icon:heart}&c{name}&4{icon:heart} &7{message}"); public static final ConfigOption CHAT_FORMAT = new ConfigOption<>("chat.status-format", "&4&l<3 &r"); public static final ConfigOption CHATSPY_FORMAT = new ConfigOption<>("cat.spy-format", "&c[CHAT SPY] &7{sender} -> {receiver}&f: {message}"); public static final ConfigOption FORCE_FORMAT = new ConfigOption<>("chat.force-status-format", true); + public static final ConfigOption FORCE_GENDER_FORMAT = new ConfigOption<>("chat.force-gender-format", true); public static final ConfigOption PREFIX_MALE = new ConfigOption<>("chat.male-prefix", "&b{icon:male} &r"); public static final ConfigOption PREFIX_FEMALE = new ConfigOption<>("chat.female-prefix", "&d{icon:female} &r"); public static final ConfigOption PREFIX_GENDERLESS = new ConfigOption<>("chat.genderless-prefix", ""); diff --git a/src/main/java/com/lenis0012/bukkit/marriage2/internal/MarriageCore.java b/src/main/java/com/lenis0012/bukkit/marriage2/internal/MarriageCore.java index d7a3ece..1e58447 100644 --- a/src/main/java/com/lenis0012/bukkit/marriage2/internal/MarriageCore.java +++ b/src/main/java/com/lenis0012/bukkit/marriage2/internal/MarriageCore.java @@ -81,6 +81,7 @@ public class MarriageCore extends MarriageBase { @Register(name = "listeners", type = Register.Type.ENABLE) public void registerListeners() { + register(new PlayerListener(this)); register(new ChatListener(this)); register(new DatabaseListener(this)); register(new KissListener(this)); diff --git a/src/main/java/com/lenis0012/bukkit/marriage2/listeners/ChatListener.java b/src/main/java/com/lenis0012/bukkit/marriage2/listeners/ChatListener.java index 490262a..faf2cd2 100644 --- a/src/main/java/com/lenis0012/bukkit/marriage2/listeners/ChatListener.java +++ b/src/main/java/com/lenis0012/bukkit/marriage2/listeners/ChatListener.java @@ -74,6 +74,8 @@ public class ChatListener implements Listener { if(Settings.FORCE_FORMAT.value()) { format = "{marriage_status}" + event.getFormat(); // Enforce marriage format + } if(Settings.FORCE_GENDER_FORMAT.value()) { + format = "{marriage_gender}" + event.getFormat(); } // Marriage status diff --git a/src/main/java/com/lenis0012/bukkit/marriage2/listeners/PlayerListener.java b/src/main/java/com/lenis0012/bukkit/marriage2/listeners/PlayerListener.java new file mode 100644 index 0000000..4d57dde --- /dev/null +++ b/src/main/java/com/lenis0012/bukkit/marriage2/listeners/PlayerListener.java @@ -0,0 +1,59 @@ +package com.lenis0012.bukkit.marriage2.listeners; + +import com.lenis0012.bukkit.marriage2.MPlayer; +import com.lenis0012.bukkit.marriage2.Marriage; +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 org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.projectiles.ProjectileSource; + +public class PlayerListener implements Listener { + private final Marriage marriage; + + public PlayerListener(Marriage marriage) { + this.marriage = marriage; + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { + final Entity e0 = event.getEntity(); + final Entity e1 = event.getDamager(); + // Verify damaged entity is player + if(!(e0 instanceof Player)) { + return; + } if(!(e1 instanceof Player) && !(e1 instanceof Projectile)) { + return; + } + + // Verify damager is player + final Player player = (Player) e0; + final Player damager; + if(e1 instanceof Player) { + damager = (Player) e1; + } else { + Projectile projectile = (Projectile) e1; + final ProjectileSource e3 = projectile.getShooter(); + if(e3 == null || !(e3 instanceof Player)) { + return; + } + damager = (Player) e3; + } + + // Verify marriage + MPlayer mplayer = marriage.getMPlayer(player.getUniqueId()); + if(!mplayer.isMarried() || mplayer.getMarriage().getOtherPlayer(player.getUniqueId()) != damager.getUniqueId()) { + return; + } + + // Verify pvp setting + if(mplayer.getMarriage().isPVPEnabled()) { + return; + } + + event.setCancelled(true); + } +}