From 702a94bbf6ffe849ec65d7b6dd27e4ef9aedc570 Mon Sep 17 00:00:00 2001 From: skippyall <121978267+skippyall@users.noreply.github.com> Date: Mon, 14 Aug 2023 18:19:22 +0200 Subject: [PATCH] Fix Damaging by Projectiles & Cleaning Up --- Pvptoggle.iml | 12 +++ .../java/benkralex/pvptoggle/PvpEvent.java | 85 ++++++------------- .../java/benkralex/pvptoggle/Pvptoggle.java | 9 +- .../main/java/benkralex/pvptoggle/Util.java | 49 +++++++++++ 4 files changed, 91 insertions(+), 64 deletions(-) create mode 100644 Pvptoggle.iml create mode 100644 pvptogglepluginworkspace/src/main/java/benkralex/pvptoggle/Util.java diff --git a/Pvptoggle.iml b/Pvptoggle.iml new file mode 100644 index 0000000..fa63d4b --- /dev/null +++ b/Pvptoggle.iml @@ -0,0 +1,12 @@ + + + + + + + SPIGOT + + + + + \ No newline at end of file diff --git a/pvptogglepluginworkspace/src/main/java/benkralex/pvptoggle/PvpEvent.java b/pvptogglepluginworkspace/src/main/java/benkralex/pvptoggle/PvpEvent.java index c915bf1..45e6ec4 100644 --- a/pvptogglepluginworkspace/src/main/java/benkralex/pvptoggle/PvpEvent.java +++ b/pvptogglepluginworkspace/src/main/java/benkralex/pvptoggle/PvpEvent.java @@ -2,82 +2,49 @@ package benkralex.pvptoggle; import org.bukkit.NamespacedKey; -import org.bukkit.OfflinePlayer; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.persistence.PersistentDataAdapterContext; -import org.bukkit.persistence.PersistentDataContainer; -import org.bukkit.persistence.PersistentDataType; -import sun.reflect.generics.tree.ArrayTypeSignature; - -import java.sql.Array; -import java.time.Instant; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.List; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.projectiles.ProjectileSource; public class PvpEvent implements Listener { - @EventHandler - public static void pvpListener(EntityDamageByEntityEvent event) { + @EventHandler(ignoreCancelled = true) + public void pvpListener(EntityDamageByEntityEvent event) { Entity damager = event.getDamager(); Entity victim = event.getEntity(); - if (damager instanceof Player && victim instanceof Player) { - List pvpvictimsList; - List pvpvictimsListdamager; - PersistentDataContainer pdc = victim.getPersistentDataContainer(); - PersistentDataContainer pdcdamager = damager.getPersistentDataContainer(); - PersistentDataContainer[] pvpvictims = pdc.get(new NamespacedKey(Pvptoggle.pvptoggle, "pvpvictims"), PersistentDataType.TAG_CONTAINER_ARRAY); - PersistentDataContainer[] pvpvictimsdamager = pdcdamager.get(new NamespacedKey(Pvptoggle.pvptoggle, "pvpvictims"), PersistentDataType.TAG_CONTAINER_ARRAY); - boolean canpvp = false; - String victimuuid = victim.getUniqueId().toString(); - - if (pvpvictims != null) { - pvpvictimsList = new ArrayList(Arrays.asList(pvpvictims)); - } else { - pvpvictimsList = new ArrayList(); - } - - if (pvpvictimsdamager != null) { - pvpvictimsListdamager = new ArrayList(Arrays.asList(pvpvictimsdamager)); - } else { - pvpvictimsListdamager = new ArrayList(); - } - - for (int i = 0; i= Instant.now().getEpochSecond() - Config.getpvptime()) { - if (pdcfor.get(new NamespacedKey(Pvptoggle.pvptoggle, "uuid"), PersistentDataType.STRING).equals(victimuuid)) { - canpvp = true; - } + if (victim instanceof Player) { + Player victimplayer=(Player) victim; + Player damagerplayer; + if (damager instanceof Player) { + damagerplayer=(Player) damager; + } else if (damager instanceof Projectile) { + ProjectileSource shooter =((Projectile) damager).getShooter(); + if(shooter instanceof Player){ + damagerplayer=(Player) shooter; } else { - pvpvictimsListdamager.remove(i); - i--; + return; } + } else { + return; } - if (pdc.has(new NamespacedKey(Pvptoggle.pvptoggle, "pvptoggle"), PersistentDataType.BOOLEAN) && - pdc.get(new NamespacedKey(Pvptoggle.pvptoggle, "pvptoggle"), PersistentDataType.BOOLEAN) && - !canpvp) { - - event.setCancelled(true); - + if (!Util.canPvP(damagerplayer, victimplayer)) { + event.setCancelled(true); } else { - PersistentDataContainer pdcupdated = pdc.getAdapterContext().newPersistentDataContainer(); - String uuid = damager.getUniqueId().toString(); - pdcupdated.set(new NamespacedKey(Pvptoggle.pvptoggle, "uuid"), PersistentDataType.STRING, uuid); - pdcupdated.set(new NamespacedKey(Pvptoggle.pvptoggle, "time"), PersistentDataType.LONG, Instant.now().getEpochSecond()); - pvpvictimsList.add(pdcupdated); - pvpvictims = pvpvictimsList.toArray(new PersistentDataContainer[pvpvictimsList.size()]); - pdc.set(new NamespacedKey(Pvptoggle.pvptoggle, "pvpvictims"), PersistentDataType.TAG_CONTAINER_ARRAY, pvpvictims); + Util.savePvPData(damagerplayer,victimplayer); } } } -} -//pdc.getAdapterContext().newPersistentDataContainer() \ No newline at end of file + @EventHandler + public void playerLeaveListener(PlayerQuitEvent event){ + event.getPlayer().getPersistentDataContainer().remove(new NamespacedKey(Pvptoggle.pvptoggle,"pvpdamagers")); + } +} \ No newline at end of file diff --git a/pvptogglepluginworkspace/src/main/java/benkralex/pvptoggle/Pvptoggle.java b/pvptogglepluginworkspace/src/main/java/benkralex/pvptoggle/Pvptoggle.java index d349af0..2ea4415 100644 --- a/pvptogglepluginworkspace/src/main/java/benkralex/pvptoggle/Pvptoggle.java +++ b/pvptogglepluginworkspace/src/main/java/benkralex/pvptoggle/Pvptoggle.java @@ -1,6 +1,7 @@ package benkralex.pvptoggle; import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -12,15 +13,13 @@ public final class Pvptoggle extends JavaPlugin { @Override public void onEnable() { - // Plugin enable logic - pvptoggle = this; Bukkit.getPluginManager().registerEvents(new PvpEvent(), this); - PvpCommand.createPvpCommand(); Config.createConfig(); } @Override - public void onDisable() { - // Plugin shutdown logic + public void onLoad(){ + pvptoggle = this; + PvpCommand.createPvpCommand(); } } \ No newline at end of file diff --git a/pvptogglepluginworkspace/src/main/java/benkralex/pvptoggle/Util.java b/pvptogglepluginworkspace/src/main/java/benkralex/pvptoggle/Util.java new file mode 100644 index 0000000..1c41b79 --- /dev/null +++ b/pvptogglepluginworkspace/src/main/java/benkralex/pvptoggle/Util.java @@ -0,0 +1,49 @@ +package benkralex.pvptoggle; + +import org.bukkit.NamespacedKey; +import org.bukkit.entity.Player; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; + +import java.time.Instant; + +public class Util { + public static boolean canPvP(Player damager, Player victim){ + PersistentDataContainer victimPDC=damager.getPersistentDataContainer(); + Boolean toggle = victimPDC.get(new NamespacedKey(Pvptoggle.pvptoggle, "pvptoggle"),PersistentDataType.BOOLEAN); + if(toggle!=null) { + return !toggle || checkPvPData(damager, victim); + } else { + return true; + } + } + public static boolean checkPvPData(Player damager, Player victim){ + String victimUUID=victim.getUniqueId().toString(); + PersistentDataContainer damagerPDC=damager.getPersistentDataContainer(); + PersistentDataContainer damagersOfDamager=damagerPDC.get(new NamespacedKey(Pvptoggle.pvptoggle,"pvpdamagers"), PersistentDataType.TAG_CONTAINER); + if (damagersOfDamager!=null) { + delOldData(damagersOfDamager); + return damagersOfDamager.has(new NamespacedKey(Pvptoggle.pvptoggle, victimUUID), PersistentDataType.LONG); + } else { + return false; + } + } + public static void delOldData(PersistentDataContainer pvpdamagers){ + for(NamespacedKey damagerKey:pvpdamagers.getKeys()){ + if(pvpdamagers.get(damagerKey,PersistentDataType.LONG)>= Instant.now().getEpochSecond() + Config.getpvptime()){ + pvpdamagers.remove(damagerKey); + } + } + } + public static void savePvPData(Player damager, Player victim){ + PersistentDataContainer victimPDC=victim.getPersistentDataContainer(); + String damagerUUID=damager.getUniqueId().toString(); + + PersistentDataContainer damagersOfVictim=victimPDC.get(new NamespacedKey(Pvptoggle.pvptoggle,"pvpdamagers"), PersistentDataType.TAG_CONTAINER); + if(damagersOfVictim == null) { + damagersOfVictim = victimPDC.getAdapterContext().newPersistentDataContainer(); + } + damagersOfVictim.set(new NamespacedKey(Pvptoggle.pvptoggle, damagerUUID), PersistentDataType.LONG, Instant.now().getEpochSecond()); + victimPDC.set(new NamespacedKey(Pvptoggle.pvptoggle,"pvpdamagers"), PersistentDataType.TAG_CONTAINER,damagersOfVictim); + } +}