Fix Damaging by Projectiles & Cleaning Up

This commit is contained in:
skippyall
2023-08-14 18:19:22 +02:00
parent a21f9fe480
commit 702a94bbf6
4 changed files with 91 additions and 64 deletions
+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module version="4">
<component name="FacetManager">
<facet type="minecraft" name="Minecraft">
<configuration>
<autoDetectTypes>
<platformType>SPIGOT</platformType>
</autoDetectTypes>
</configuration>
</facet>
</component>
</module>
@@ -2,82 +2,49 @@ package benkralex.pvptoggle;
import org.bukkit.NamespacedKey; import org.bukkit.NamespacedKey;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.persistence.PersistentDataAdapterContext; import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.persistence.PersistentDataType; import org.bukkit.projectiles.ProjectileSource;
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;
public class PvpEvent implements Listener { public class PvpEvent implements Listener {
@EventHandler @EventHandler(ignoreCancelled = true)
public static void pvpListener(EntityDamageByEntityEvent event) { public void pvpListener(EntityDamageByEntityEvent event) {
Entity damager = event.getDamager(); Entity damager = event.getDamager();
Entity victim = event.getEntity(); Entity victim = event.getEntity();
if (damager instanceof Player && victim instanceof Player) { if (victim instanceof Player) {
List<PersistentDataContainer> pvpvictimsList; Player victimplayer=(Player) victim;
List<PersistentDataContainer> pvpvictimsListdamager; Player damagerplayer;
PersistentDataContainer pdc = victim.getPersistentDataContainer(); if (damager instanceof Player) {
PersistentDataContainer pdcdamager = damager.getPersistentDataContainer(); damagerplayer=(Player) damager;
PersistentDataContainer[] pvpvictims = pdc.get(new NamespacedKey(Pvptoggle.pvptoggle, "pvpvictims"), PersistentDataType.TAG_CONTAINER_ARRAY); } else if (damager instanceof Projectile) {
PersistentDataContainer[] pvpvictimsdamager = pdcdamager.get(new NamespacedKey(Pvptoggle.pvptoggle, "pvpvictims"), PersistentDataType.TAG_CONTAINER_ARRAY); ProjectileSource shooter =((Projectile) damager).getShooter();
boolean canpvp = false; if(shooter instanceof Player){
String victimuuid = victim.getUniqueId().toString(); damagerplayer=(Player) shooter;
if (pvpvictims != null) {
pvpvictimsList = new ArrayList<PersistentDataContainer>(Arrays.asList(pvpvictims));
} else {
pvpvictimsList = new ArrayList<PersistentDataContainer>();
}
if (pvpvictimsdamager != null) {
pvpvictimsListdamager = new ArrayList<PersistentDataContainer>(Arrays.asList(pvpvictimsdamager));
} else {
pvpvictimsListdamager = new ArrayList<PersistentDataContainer>();
}
for (int i = 0; i<pvpvictimsListdamager.size(); i++) {
PersistentDataContainer pdcfor = pvpvictimsListdamager.get(i);
if (pdcfor.get(new NamespacedKey(Pvptoggle.pvptoggle, "time"), PersistentDataType.LONG) >= Instant.now().getEpochSecond() - Config.getpvptime()) {
if (pdcfor.get(new NamespacedKey(Pvptoggle.pvptoggle, "uuid"), PersistentDataType.STRING).equals(victimuuid)) {
canpvp = true;
}
} else { } else {
pvpvictimsListdamager.remove(i); return;
i--;
} }
} else {
return;
} }
if (pdc.has(new NamespacedKey(Pvptoggle.pvptoggle, "pvptoggle"), PersistentDataType.BOOLEAN) && if (!Util.canPvP(damagerplayer, victimplayer)) {
pdc.get(new NamespacedKey(Pvptoggle.pvptoggle, "pvptoggle"), PersistentDataType.BOOLEAN) && event.setCancelled(true);
!canpvp) {
event.setCancelled(true);
} else { } else {
PersistentDataContainer pdcupdated = pdc.getAdapterContext().newPersistentDataContainer(); Util.savePvPData(damagerplayer,victimplayer);
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);
} }
} }
} }
} @EventHandler
//pdc.getAdapterContext().newPersistentDataContainer() public void playerLeaveListener(PlayerQuitEvent event){
event.getPlayer().getPersistentDataContainer().remove(new NamespacedKey(Pvptoggle.pvptoggle,"pvpdamagers"));
}
}
@@ -1,6 +1,7 @@
package benkralex.pvptoggle; package benkralex.pvptoggle;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -12,15 +13,13 @@ public final class Pvptoggle extends JavaPlugin {
@Override @Override
public void onEnable() { public void onEnable() {
// Plugin enable logic
pvptoggle = this;
Bukkit.getPluginManager().registerEvents(new PvpEvent(), this); Bukkit.getPluginManager().registerEvents(new PvpEvent(), this);
PvpCommand.createPvpCommand();
Config.createConfig(); Config.createConfig();
} }
@Override @Override
public void onDisable() { public void onLoad(){
// Plugin shutdown logic pvptoggle = this;
PvpCommand.createPvpCommand();
} }
} }
@@ -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);
}
}