diff --git a/pom.xml b/pom.xml
index 05815e1f..7a758b48 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
cc.co.evenprime.bukkit
NoCheat
- 2.21a
+ 2.21b
jar
NoCheat
diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/fight/DirectionCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/fight/DirectionCheck.java
index dc3c2e10..a3173748 100644
--- a/src/cc/co/evenprime/bukkit/nocheat/checks/fight/DirectionCheck.java
+++ b/src/cc/co/evenprime/bukkit/nocheat/checks/fight/DirectionCheck.java
@@ -3,6 +3,9 @@ package cc.co.evenprime.bukkit.nocheat.checks.fight;
import java.util.Locale;
import net.minecraft.server.Entity;
+import net.minecraft.server.EntityComplex;
+import net.minecraft.server.EntityComplexPart;
+import net.minecraft.server.EntityGiantZombie;
import cc.co.evenprime.bukkit.nocheat.NoCheat;
import cc.co.evenprime.bukkit.nocheat.NoCheatPlayer;
import cc.co.evenprime.bukkit.nocheat.actions.types.ParameterName;
@@ -27,6 +30,12 @@ public class DirectionCheck extends FightCheck {
// Get the width of the damagee
Entity entity = data.damagee;
+ // Safeguard, if entity is Giant or Ender Dragon, this check will fail
+ // due to giant and hard to define hitboxes
+ if(entity instanceof EntityComplex || entity instanceof EntityComplexPart || entity instanceof EntityGiantZombie) {
+ return false;
+ }
+
final float width = entity.length > entity.width ? entity.length : entity.width;
// height = 2.0D as minecraft doesn't store the height of entities,
diff --git a/src/cc/co/evenprime/bukkit/nocheat/events/EventManagerImpl.java b/src/cc/co/evenprime/bukkit/nocheat/events/EventManagerImpl.java
index 003009ca..099affae 100644
--- a/src/cc/co/evenprime/bukkit/nocheat/events/EventManagerImpl.java
+++ b/src/cc/co/evenprime/bukkit/nocheat/events/EventManagerImpl.java
@@ -270,19 +270,12 @@ public abstract class EventManagerImpl implements EventManager {
if(!(event instanceof EntityDamageByEntityEvent))
return;
- /**
- * Only interested in PROJECTILE and ENTITY_ATTACK
- */
- if(event.getCause() != DamageCause.PROJECTILE && event.getCause() != DamageCause.ENTITY_ATTACK) {
- return;
- }
+ // Only handle if attack done by a projectile
+ if(event.getCause() == DamageCause.PROJECTILE) {
- final EntityDamageByEntityEvent event2 = (EntityDamageByEntityEvent) event;
+ final EntityDamageByEntityEvent event2 = (EntityDamageByEntityEvent) event;
- if(event2.getCause() == DamageCause.PROJECTILE) {
-
- // Only handle if attack done by a player indirectly with a
- // projectile
+ // And only if the shooter was a player
if(!((event2.getDamager() instanceof Projectile) && ((Projectile) event2.getDamager()).getShooter() instanceof Player)) {
return;
}
@@ -290,15 +283,18 @@ public abstract class EventManagerImpl implements EventManager {
/** Only now measure time and dispatch event */
if(measureTime != null && measureTime.isEnabled()) {
final long startTime = System.nanoTime();
- m.handleProjectileDamageByEntityEvent(event2, priority);
+ m.handleProjectileDamageByPlayerEvent(event2, priority);
measureTime.addTime(System.nanoTime() - startTime);
} else {
- m.handleProjectileDamageByEntityEvent(event2, priority);
+ m.handleProjectileDamageByPlayerEvent(event2, priority);
}
}
- // Only handle if attack done by a player directly
- else if(event2.getCause() == DamageCause.ENTITY_ATTACK) {
+ // Only handle if attack done directly
+ else if(event.getCause() == DamageCause.ENTITY_ATTACK) {
+ final EntityDamageByEntityEvent event2 = (EntityDamageByEntityEvent) event;
+
+ // And only if done by a player
if(!(event2.getDamager() instanceof Player)) {
return;
}
@@ -306,10 +302,29 @@ public abstract class EventManagerImpl implements EventManager {
/** Only now measure time and dispatch event */
if(measureTime != null && measureTime.isEnabled()) {
final long startTime = System.nanoTime();
- m.handleEntityAttackDamageByEntityEvent(event2, priority);
+ m.handleEntityAttackDamageByPlayerEvent(event2, priority);
measureTime.addTime(System.nanoTime() - startTime);
} else {
- m.handleEntityAttackDamageByEntityEvent(event2, priority);
+ m.handleEntityAttackDamageByPlayerEvent(event2, priority);
+ }
+ }
+ // Only handle if attack done by "custom"
+ else if(event.getCause() == DamageCause.CUSTOM) {
+
+ final EntityDamageByEntityEvent event2 = (EntityDamageByEntityEvent) event;
+
+ // And only if done by a player
+ if(!(event2.getDamager() instanceof Player)) {
+ return;
+ }
+
+ /** Only now measure time and dispatch event */
+ if(measureTime != null && measureTime.isEnabled()) {
+ final long startTime = System.nanoTime();
+ m.handleCustomDamageByPlayerEvent(event2, priority);
+ measureTime.addTime(System.nanoTime() - startTime);
+ } else {
+ m.handleCustomDamageByPlayerEvent(event2, priority);
}
}
}
@@ -408,15 +423,19 @@ public abstract class EventManagerImpl implements EventManager {
handleEvent(event, priority);
}
- protected void handleProjectileDamageByEntityEvent(final EntityDamageByEntityEvent event, final Priority priority) {
+ protected void handleProjectileDamageByPlayerEvent(final EntityDamageByEntityEvent event, final Priority priority) {
handleEvent(event, priority);
}
- protected void handleEntityAttackDamageByEntityEvent(final EntityDamageByEntityEvent event, final Priority priority) {
+ protected void handleEntityAttackDamageByPlayerEvent(final EntityDamageByEntityEvent event, final Priority priority) {
handleEvent(event, priority);
}
protected void handlePlayerToggleSprintEvent(PlayerToggleSprintEvent event, Priority priority) {
handleEvent(event, priority);
}
+
+ protected void handleCustomDamageByPlayerEvent(EntityDamageByEntityEvent event, Priority priority) {
+ handleEvent(event, priority);
+ }
}
diff --git a/src/cc/co/evenprime/bukkit/nocheat/events/FightEventManager.java b/src/cc/co/evenprime/bukkit/nocheat/events/FightEventManager.java
index d422d47b..5abd648f 100644
--- a/src/cc/co/evenprime/bukkit/nocheat/events/FightEventManager.java
+++ b/src/cc/co/evenprime/bukkit/nocheat/events/FightEventManager.java
@@ -41,7 +41,7 @@ public class FightEventManager extends EventManagerImpl {
}
@Override
- protected void handleEntityAttackDamageByEntityEvent(final EntityDamageByEntityEvent event, final Priority priority) {
+ protected void handleEntityAttackDamageByPlayerEvent(final EntityDamageByEntityEvent event, final Priority priority) {
final Player damager = (Player) event.getDamager();
@@ -54,14 +54,15 @@ public class FightEventManager extends EventManagerImpl {
final FightData data = player.getData().fight;
+ // For some reason we decided to skip this event anyway
if(data.skipNext) {
data.skipNext = false;
return;
}
- // We are still interested in this event type
boolean cancelled = false;
+ // Get the attacked entity
data.damagee = ((CraftEntity) event.getEntity()).getHandle();
for(FightCheck check : checks) {
@@ -78,19 +79,33 @@ public class FightEventManager extends EventManagerImpl {
}
@Override
- protected void handleProjectileDamageByEntityEvent(final EntityDamageByEntityEvent event, final Priority priority) {
+ protected void handleProjectileDamageByPlayerEvent(final EntityDamageByEntityEvent event, final Priority priority) {
final Player damager = (Player) ((Projectile) event.getDamager()).getShooter();
final NoCheatPlayer player = plugin.getPlayer(damager);
final FightData data = player.getData().fight;
- // Skip the next damage event, because it is with high probability
- // the same as this one
+ // Skip the next damage event, because it is the same as this one
+ // just mislabelled as a "direct" attack from one player onto another
data.skipNext = true;
return;
+ }
+ @Override
+ protected void handleCustomDamageByPlayerEvent(final EntityDamageByEntityEvent event, final Priority priority) {
+
+ final Player damager = (Player) event.getDamager();
+ final NoCheatPlayer player = plugin.getPlayer(damager);
+
+ final FightData data = player.getData().fight;
+
+ // Skip the next damage event, because it is with high probability
+ // something from the Heroes plugin
+ data.skipNext = true;
+
+ return;
}
@Override