aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0211-Implement-EntityKnockbackByEntityEvent.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0211-Implement-EntityKnockbackByEntityEvent.patch')
-rw-r--r--patches/server/0211-Implement-EntityKnockbackByEntityEvent.patch105
1 files changed, 105 insertions, 0 deletions
diff --git a/patches/server/0211-Implement-EntityKnockbackByEntityEvent.patch b/patches/server/0211-Implement-EntityKnockbackByEntityEvent.patch
new file mode 100644
index 0000000000..e1f1a50195
--- /dev/null
+++ b/patches/server/0211-Implement-EntityKnockbackByEntityEvent.patch
@@ -0,0 +1,105 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Brokkonaut <[email protected]>
+Date: Mon, 18 Jun 2018 15:46:23 +0200
+Subject: [PATCH] Implement EntityKnockbackByEntityEvent
+
+This event is called when an entity receives knockback by another entity.
+
+diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
+index 3f2bf9e04b20b74a61d2cf1cadbecd36002d0edc..84b6c2f73e0f6f3ad3969e7d51f6617e172764ec 100644
+--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
++++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
+@@ -1456,7 +1456,7 @@ public abstract class LivingEntity extends Entity {
+ }
+
+ this.hurtDir = (float) (Mth.atan2(d1, d0) * 57.2957763671875D - (double) this.getYRot());
+- this.knockback(0.4000000059604645D, d0, d1);
++ this.knockback(0.4000000059604645D, d0, d1, entity1);
+ } else {
+ this.hurtDir = (float) ((int) (Math.random() * 2.0D) * 180);
+ }
+@@ -1504,7 +1504,7 @@ public abstract class LivingEntity extends Entity {
+ }
+
+ protected void blockedByShield(LivingEntity target) {
+- target.knockback(0.5D, target.getX() - this.getX(), target.getZ() - this.getZ());
++ target.knockback(0.5D, target.getX() - this.getX(), target.getZ() - this.getZ(), this);
+ }
+
+ private boolean checkTotemDeathProtection(DamageSource source) {
+@@ -1757,6 +1757,11 @@ public abstract class LivingEntity extends Entity {
+ }
+
+ public void knockback(double strength, double x, double z) {
++ // Paper start - add knockbacking entity parameter
++ this.knockback(strength, x, z, null);
++ }
++ public void knockback(double strength, double x, double z, Entity knockingBackEntity) {
++ // Paper end - add knockbacking entity parameter
+ strength *= 1.0D - this.getAttributeValue(Attributes.KNOCKBACK_RESISTANCE);
+ if (strength > 0.0D) {
+ this.hasImpulse = true;
+@@ -1764,6 +1769,15 @@ public abstract class LivingEntity extends Entity {
+ Vec3 vec3d1 = (new Vec3(x, 0.0D, z)).normalize().scale(strength);
+
+ this.setDeltaMovement(vec3d.x / 2.0D - vec3d1.x, this.onGround ? Math.min(0.4D, vec3d.y / 2.0D + strength) : vec3d.y, vec3d.z / 2.0D - vec3d1.z);
++ // Paper start - call EntityKnockbackByEntityEvent
++ Vec3 currentMovement = this.getDeltaMovement();
++ org.bukkit.util.Vector delta = new org.bukkit.util.Vector(currentMovement.x - vec3d.x, currentMovement.y - vec3d.y, currentMovement.z - vec3d.z);
++ // Restore old velocity to be able to access it in the event
++ this.setDeltaMovement(vec3d);
++ if (knockingBackEntity == null || new com.destroystokyo.paper.event.entity.EntityKnockbackByEntityEvent((org.bukkit.entity.LivingEntity) getBukkitEntity(), knockingBackEntity.getBukkitEntity(), (float) strength, delta).callEvent()) {
++ this.setDeltaMovement(vec3d.x + delta.getX(), vec3d.y + delta.getY(), vec3d.z + delta.getZ());
++ }
++ // Paper end
+ }
+ }
+
+diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
+index 6d0d194aaababd91a26dffc07f547d60eadd098e..ea836c55bad8b897e0fe0cad6d297b9b52209d69 100644
+--- a/src/main/java/net/minecraft/world/entity/Mob.java
++++ b/src/main/java/net/minecraft/world/entity/Mob.java
+@@ -1579,7 +1579,7 @@ public abstract class Mob extends LivingEntity {
+
+ if (flag) {
+ if (f1 > 0.0F && target instanceof LivingEntity) {
+- ((LivingEntity) target).knockback((double) (f1 * 0.5F), (double) Mth.sin(this.getYRot() * 0.017453292F), (double) (-Mth.cos(this.getYRot() * 0.017453292F)));
++ ((LivingEntity) target).knockback((double) (f1 * 0.5F), (double) Mth.sin(this.getYRot() * 0.017453292F), (double) (-Mth.cos(this.getYRot() * 0.017453292F)), this); // Paper
+ this.setDeltaMovement(this.getDeltaMovement().multiply(0.6D, 1.0D, 0.6D));
+ }
+
+diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/RamTarget.java b/src/main/java/net/minecraft/world/entity/ai/behavior/RamTarget.java
+index 3380b95e0eff5a6b1b683b8233b8991eb817b638..de8485df1c23e903ff0721fdb682b98d580b634e 100644
+--- a/src/main/java/net/minecraft/world/entity/ai/behavior/RamTarget.java
++++ b/src/main/java/net/minecraft/world/entity/ai/behavior/RamTarget.java
+@@ -78,7 +78,7 @@ public class RamTarget extends Behavior<Goat> {
+ float f = 0.25F * (float)(i - j);
+ float g = Mth.clamp(goat.getSpeed() * 1.65F, 0.2F, 3.0F) + f;
+ float h = livingEntity.isDamageSourceBlocked(DamageSource.mobAttack(goat)) ? 0.5F : 1.0F;
+- livingEntity.knockback((double)(h * g) * this.getKnockbackForce.applyAsDouble(goat), this.ramDirection.x(), this.ramDirection.z());
++ livingEntity.knockback((double)(h * g) * this.getKnockbackForce.applyAsDouble(goat), this.ramDirection.x(), this.ramDirection.z(), goat); // Paper
+ this.finishRam(serverLevel, goat);
+ serverLevel.playSound((Player)null, goat, this.getImpactSound.apply(goat), SoundSource.HOSTILE, 1.0F, 1.0F);
+ } else if (this.hasRammedHornBreakingBlock(serverLevel, goat)) {
+diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java
+index 6059bec9cafd69d622491222b67bc7ff78e13d7a..702a5e524127f9655279a24b54b8d4248dec460e 100644
+--- a/src/main/java/net/minecraft/world/entity/player/Player.java
++++ b/src/main/java/net/minecraft/world/entity/player/Player.java
+@@ -1296,7 +1296,7 @@ public abstract class Player extends LivingEntity {
+ if (flag5) {
+ if (i > 0) {
+ if (target instanceof LivingEntity) {
+- ((LivingEntity) target).knockback((double) ((float) i * 0.5F), (double) Mth.sin(this.getYRot() * 0.017453292F), (double) (-Mth.cos(this.getYRot() * 0.017453292F)));
++ ((LivingEntity) target).knockback((double) ((float) i * 0.5F), (double) Mth.sin(this.getYRot() * 0.017453292F), (double) (-Mth.cos(this.getYRot() * 0.017453292F)), this); // Paper
+ } else {
+ target.push((double) (-Mth.sin(this.getYRot() * 0.017453292F) * (float) i * 0.5F), 0.1D, (double) (Mth.cos(this.getYRot() * 0.017453292F) * (float) i * 0.5F));
+ }
+@@ -1320,7 +1320,7 @@ public abstract class Player extends LivingEntity {
+ if (entityliving != this && entityliving != target && !this.isAlliedTo((Entity) entityliving) && (!(entityliving instanceof ArmorStand) || !((ArmorStand) entityliving).isMarker()) && this.distanceToSqr((Entity) entityliving) < 9.0D) {
+ // CraftBukkit start - Only apply knockback if the damage hits
+ if (entityliving.hurt(DamageSource.playerAttack(this).sweep(), f4)) {
+- entityliving.knockback(0.4000000059604645D, (double) Mth.sin(this.getYRot() * 0.017453292F), (double) (-Mth.cos(this.getYRot() * 0.017453292F)));
++ entityliving.knockback(0.4000000059604645D, (double) Mth.sin(this.getYRot() * 0.017453292F), (double) (-Mth.cos(this.getYRot() * 0.017453292F)), this); // Paper
+ }
+ // CraftBukkit end
+ }