Fix Damaging by Projectiles & Cleaning Up
This commit is contained in:
@@ -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
|
||||||
|
public void playerLeaveListener(PlayerQuitEvent event){
|
||||||
|
event.getPlayer().getPersistentDataContainer().remove(new NamespacedKey(Pvptoggle.pvptoggle,"pvpdamagers"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//pdc.getAdapterContext().newPersistentDataContainer()
|
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user