From f9004393e17cdf0cab553772b15d7b4b647ca944 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Tue, 12 Dec 2023 11:38:55 -0800 Subject: [PATCH] improve event target logic --- .../sentinel/SentinelEventHandler.java | 4 +- .../org/mcmonkey/sentinel/SentinelPlugin.java | 2 +- .../targeting/SentinelTargetList.java | 45 +++++++++++-------- 3 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/mcmonkey/sentinel/SentinelEventHandler.java b/src/main/java/org/mcmonkey/sentinel/SentinelEventHandler.java index 6b94766..af3b71c 100644 --- a/src/main/java/org/mcmonkey/sentinel/SentinelEventHandler.java +++ b/src/main/java/org/mcmonkey/sentinel/SentinelEventHandler.java @@ -231,11 +231,11 @@ public void whenAttacksHappened(EntityDamageByEntityEvent event) { if (damager instanceof LivingEntity) { LivingEntity damagerLiving = (LivingEntity) damager; for (SentinelTrait sentinel : cleanCurrentList()) { - if (sentinel.allTargets.isEventTarget(event) + if (sentinel.allTargets.isEventTarget(event, sentinel) && sentinel.targetingHelper.canSee(damagerLiving) && !sentinel.targetingHelper.isIgnored(damagerLiving)) { sentinel.targetingHelper.addTarget(damager.getUniqueId()); } - if (sentinel.allAvoids.isEventTarget(event) + if (sentinel.allAvoids.isEventTarget(event, sentinel) && sentinel.targetingHelper.canSee(damagerLiving) && !sentinel.targetingHelper.isIgnored(damagerLiving)) { sentinel.targetingHelper.addAvoid(damager.getUniqueId()); } diff --git a/src/main/java/org/mcmonkey/sentinel/SentinelPlugin.java b/src/main/java/org/mcmonkey/sentinel/SentinelPlugin.java index 0ee8932..9815e19 100644 --- a/src/main/java/org/mcmonkey/sentinel/SentinelPlugin.java +++ b/src/main/java/org/mcmonkey/sentinel/SentinelPlugin.java @@ -34,7 +34,7 @@ public class SentinelPlugin extends JavaPlugin { * A map of all valid event targets. */ public static HashSet validEventTargets = new HashSet<>( - Arrays.asList("pvp", "pve", "pv", "pvnpc", "pvsentinel", "guarded_fight", "eve", "ev", "message") + Arrays.asList("pvp", "pve", "pv", "pvnpc", "pvsentinel", "guarded_fight", "eve", "ev", "message", "npcvnpc") ); /** diff --git a/src/main/java/org/mcmonkey/sentinel/targeting/SentinelTargetList.java b/src/main/java/org/mcmonkey/sentinel/targeting/SentinelTargetList.java index 5dcbff1..36f3d6c 100644 --- a/src/main/java/org/mcmonkey/sentinel/targeting/SentinelTargetList.java +++ b/src/main/java/org/mcmonkey/sentinel/targeting/SentinelTargetList.java @@ -390,7 +390,7 @@ public boolean isReverseEventTarget(SentinelTrait sentinel, EntityDamageByEntity /** * Returns whether the damager in a damage event is targeted by this list. */ - public boolean isEventTarget(EntityDamageByEntityEvent event) { + public boolean isEventTarget(EntityDamageByEntityEvent event, SentinelTrait sentinel) { Entity damager = event.getDamager(); if (event.getDamager() instanceof Projectile) { ProjectileSource source = ((Projectile) event.getDamager()).getShooter(); @@ -398,40 +398,38 @@ public boolean isEventTarget(EntityDamageByEntityEvent event) { damager = (Entity) source; } } - if (CitizensAPI.getNPCRegistry().isNPC(damager)) { - return false; - } + boolean damagerIsNPC = CitizensAPI.getNPCRegistry().isNPC(damager); if (damager.equals(event.getEntity())) { return false; // Players can accidentally hurt themselves - that's not PvP } for (String evt : byEvent) { if (evt.equals("pvp") && event.getEntity() instanceof Player - && damager instanceof Player + && damager instanceof Player && !damagerIsNPC && !CitizensAPI.getNPCRegistry().isNPC(event.getEntity())) { return true; } else if (evt.equals("pve") && !(event.getEntity() instanceof Player) - && damager instanceof Player + && damager instanceof Player && !damagerIsNPC && event.getEntity() instanceof LivingEntity) { return true; } else if (evt.equals("eve") - && !(damager instanceof Player) + && !(damager instanceof Player) && !damagerIsNPC && !(event.getEntity() instanceof Player) && event.getEntity() instanceof LivingEntity) { return true; } else if (evt.equals("pvnpc") && event.getEntity() instanceof LivingEntity - && damager instanceof Player + && damager instanceof Player && !damagerIsNPC && CitizensAPI.getNPCRegistry().isNPC(event.getEntity())) { return true; } else if (evt.equals("pvsentinel") && event.getEntity() instanceof LivingEntity - && damager instanceof Player + && damager instanceof Player && !damagerIsNPC && CitizensAPI.getNPCRegistry().isNPC(event.getEntity()) && CitizensAPI.getNPCRegistry().getNPC(event.getEntity()).hasTrait(SentinelTrait.class)) { return true; @@ -445,25 +443,34 @@ else if (evt.equals("npcvnpc") int colon = evt.indexOf(':'); String prefix = evt.substring(0, colon); String value = evt.substring(colon + 1); - if (prefix.equals("pv")) { - SentinelTarget target = SentinelTarget.forName(value); - if (target != null) { + if (prefix.equals("pv") && !damagerIsNPC) { + SentinelTargetList list = new SentinelTargetList(); + SentinelTargetLabel label = new SentinelTargetLabel(value); + if (label.isValidTarget()) { + label.addToList(list); if (damager instanceof Player && event.getEntity() instanceof LivingEntity - && target.isTarget((LivingEntity) event.getEntity())) { + && list.isTarget((LivingEntity) event.getEntity(), sentinel)) { return true; } } + else { + sentinel.debug("Invalid event:pv: target label: " + value); + } } - else if (prefix.equals("ev")) { - SentinelTarget target = SentinelTarget.forName(value); - if (target != null) { - if (!(damager instanceof Player) - && event.getEntity() instanceof LivingEntity - && target.isTarget((LivingEntity) event.getEntity())) { + else if (prefix.equals("ev") && !damagerIsNPC) { + SentinelTargetList list = new SentinelTargetList(); + SentinelTargetLabel label = new SentinelTargetLabel(value); + if (label.isValidTarget()) { + label.addToList(list); + if (event.getEntity() instanceof LivingEntity + && list.isTarget((LivingEntity) event.getEntity(), sentinel)) { return true; } } + else { + sentinel.debug("Invalid event:ev: target label: " + value); + } } } }