From d4b6556b5319fbcdb154fbce01095e251673e00c Mon Sep 17 00:00:00 2001 From: Intybyte Date: Sat, 14 Dec 2024 12:39:09 +0100 Subject: [PATCH 1/4] Add check for successful shielding --- .../bukkit/source/DamageLeveler.java | 64 +++++++++++++++++-- 1 file changed, 58 insertions(+), 6 deletions(-) diff --git a/bukkit/src/main/java/dev/aurelium/auraskills/bukkit/source/DamageLeveler.java b/bukkit/src/main/java/dev/aurelium/auraskills/bukkit/source/DamageLeveler.java index 60b02f6a1..727490fe2 100644 --- a/bukkit/src/main/java/dev/aurelium/auraskills/bukkit/source/DamageLeveler.java +++ b/bukkit/src/main/java/dev/aurelium/auraskills/bukkit/source/DamageLeveler.java @@ -8,17 +8,21 @@ import dev.aurelium.auraskills.bukkit.AuraSkills; import dev.aurelium.auraskills.common.source.SourceTypes; import dev.aurelium.auraskills.common.user.User; +import org.bukkit.Location; +import org.bukkit.damage.DamageSource; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.projectiles.ProjectileSource; +import org.bukkit.util.Vector; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.UUID; +import java.util.function.Consumer; public class DamageLeveler extends SourceLeveler { @@ -53,16 +57,21 @@ public void onDamage(EntityDamageEvent event) { // Disregard self inflected damage if (event instanceof EntityDamageByEntityEvent entityEvent) { - if (isSelfInflicted(entityEvent.getDamager(), player)) return; + if (isSelfInflicted(entityEvent.getDamager(), player)) { + return; + } + + // Check shield blocking option + if (skill.equals(Skills.DEFENSE) + && !Skills.DEFENSE.optionBoolean("allow_shield_blocking", false) + && player.isBlocking() + && isShieldingSuccessful(entityEvent.getDamager(), player)) { + return; + } } if (failsChecks(event, player, player.getLocation(), skill)) return; - // Check shield blocking option - if (skill.equals(Skills.DEFENSE) && !Skills.DEFENSE.optionBoolean("allow_shield_blocking", false) && player.isBlocking()) { - return; - } - double damage; if (source.useOriginalDamage()) { damage = event.getOriginalDamage(EntityDamageEvent.DamageModifier.BASE); @@ -195,4 +204,47 @@ private boolean projectileSourceMatches(ProjectileSource projectileSource, Strin return false; } + private boolean isShieldingSuccessful(Entity source, Player subject) { + Vector vec3d = source.getLocation().toVector(); + Location location = subject.getLocation(); + + Vector vec3d1 = this.calculateViewVector(0.0F, location.getYaw()); + Vector vec3d2 = vec3d.subtract( location.toVector() ); + + vec3d2 = new Vector(vec3d2.getX(), 0.0D, vec3d2.getY()).normalize(); + return vec3d2.dot(vec3d1) < 0.0D; + } + + public final Vector calculateViewVector(float pitch, float yaw) { + float f2 = pitch * 0.017453292F; + float f3 = -yaw * 0.017453292F; + float f4 = cos(f3); + float f5 = sin(f3); + float f6 = cos(f2); + float f7 = sin(f2); + + return new Vector(f5 * f6, -f7, (double) (f4 * f6)); + } + + //region match minecraft implementation, might need to be moved to a more appropriate package + private static final float[] SIN = make(new float[65536], sineTable -> { + for (int ix = 0; ix < sineTable.length; ix++) { + sineTable[ix] = (float)Math.sin((double)ix * Math.PI * 2.0 / 65536.0); + } + }); + + private static T make(T object, Consumer initializer) { + initializer.accept(object); + return object; + } + + private static float sin(float value) { + return SIN[(int)(value * 10430.378F) & 65535]; + } + + private static float cos(float value) { + return SIN[(int)(value * 10430.378F + 16384.0F) & 65535]; + } + //endregion + } From d66e3c84e8c2a16ef02cb09712c133bf2c3af255 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Sat, 14 Dec 2024 12:41:10 +0100 Subject: [PATCH 2/4] Unused import --- .../dev/aurelium/auraskills/bukkit/source/DamageLeveler.java | 1 - 1 file changed, 1 deletion(-) diff --git a/bukkit/src/main/java/dev/aurelium/auraskills/bukkit/source/DamageLeveler.java b/bukkit/src/main/java/dev/aurelium/auraskills/bukkit/source/DamageLeveler.java index 727490fe2..9e65306db 100644 --- a/bukkit/src/main/java/dev/aurelium/auraskills/bukkit/source/DamageLeveler.java +++ b/bukkit/src/main/java/dev/aurelium/auraskills/bukkit/source/DamageLeveler.java @@ -9,7 +9,6 @@ import dev.aurelium.auraskills.common.source.SourceTypes; import dev.aurelium.auraskills.common.user.User; import org.bukkit.Location; -import org.bukkit.damage.DamageSource; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; From 0994b32e68c6b94036bf732014f67ce28de034ad Mon Sep 17 00:00:00 2001 From: Intybyte Date: Sat, 14 Dec 2024 12:48:25 +0100 Subject: [PATCH 3/4] Add piercing checks --- .../auraskills/bukkit/source/DamageLeveler.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/bukkit/src/main/java/dev/aurelium/auraskills/bukkit/source/DamageLeveler.java b/bukkit/src/main/java/dev/aurelium/auraskills/bukkit/source/DamageLeveler.java index 9e65306db..d876ebe76 100644 --- a/bukkit/src/main/java/dev/aurelium/auraskills/bukkit/source/DamageLeveler.java +++ b/bukkit/src/main/java/dev/aurelium/auraskills/bukkit/source/DamageLeveler.java @@ -204,6 +204,18 @@ private boolean projectileSourceMatches(ProjectileSource projectileSource, Strin } private boolean isShieldingSuccessful(Entity source, Player subject) { + + boolean flag = false; + if (source instanceof AbstractArrow entityarrow) { + if (entityarrow.getPierceLevel() > 0) { + flag = true; + } + } + + if (flag) { + return false; + } + Vector vec3d = source.getLocation().toVector(); Location location = subject.getLocation(); From ffb174d40548825b7e4ee20f9ef083c18dc4e877 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Sat, 14 Dec 2024 12:51:35 +0100 Subject: [PATCH 4/4] Move logic and simplify --- .../aurelium/auraskills/bukkit/source/DamageLeveler.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/bukkit/src/main/java/dev/aurelium/auraskills/bukkit/source/DamageLeveler.java b/bukkit/src/main/java/dev/aurelium/auraskills/bukkit/source/DamageLeveler.java index d876ebe76..f06ce4b9d 100644 --- a/bukkit/src/main/java/dev/aurelium/auraskills/bukkit/source/DamageLeveler.java +++ b/bukkit/src/main/java/dev/aurelium/auraskills/bukkit/source/DamageLeveler.java @@ -63,7 +63,6 @@ public void onDamage(EntityDamageEvent event) { // Check shield blocking option if (skill.equals(Skills.DEFENSE) && !Skills.DEFENSE.optionBoolean("allow_shield_blocking", false) - && player.isBlocking() && isShieldingSuccessful(entityEvent.getDamager(), player)) { return; } @@ -205,14 +204,13 @@ private boolean projectileSourceMatches(ProjectileSource projectileSource, Strin private boolean isShieldingSuccessful(Entity source, Player subject) { - boolean flag = false; if (source instanceof AbstractArrow entityarrow) { if (entityarrow.getPierceLevel() > 0) { - flag = true; + return false; } } - if (flag) { + if (!subject.isBlocking()) { return false; }