From 7986630d78fb8cd77b5e305bd727d537e8fdc10e Mon Sep 17 00:00:00 2001
From: BillyGalbreath <Blake.Galbreath@GMail.com>
Date: Sat, 8 Feb 2020 23:26:11 -0600
Subject: [PATCH] Entity Jump API


diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
index 1b9551ae09..ad474500e2 100644
--- a/src/main/java/net/minecraft/server/EntityLiving.java
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
@@ -91,7 +91,7 @@ public abstract class EntityLiving extends Entity {
     protected float aV;
     protected int aW; protected int getKillCount() { return this.aW; } // Paper - OBFHELPER
     public float lastDamage;
-    protected boolean jumping;
+    public boolean jumping; // Paper - protected -> public
     public float aZ;
     public float ba;
     public float bb;
@@ -2605,8 +2605,10 @@ public abstract class EntityLiving extends Entity {
             } else if (this.aH()) {
                 this.c(TagsFluid.LAVA);
             } else if ((this.onGround || this.N > 0.0D && this.N <= 0.4D) && this.jumpTicks == 0) {
+                if (new com.destroystokyo.paper.event.entity.EntityJumpEvent(getBukkitLivingEntity()).callEvent()) { // Paper
                 this.jump();
                 this.jumpTicks = 10;
+                } else { this.setJumping(false); } // Paper - setJumping(false) stops a potential loop
             }
         } else {
             this.jumpTicks = 0;
diff --git a/src/main/java/net/minecraft/server/EntityPanda.java b/src/main/java/net/minecraft/server/EntityPanda.java
index cd41c80f19..f50ed19080 100644
--- a/src/main/java/net/minecraft/server/EntityPanda.java
+++ b/src/main/java/net/minecraft/server/EntityPanda.java
@@ -438,7 +438,9 @@ public class EntityPanda extends EntityAnimal {
             EntityPanda entitypanda = (EntityPanda) iterator.next();
 
             if (!entitypanda.isBaby() && entitypanda.onGround && !entitypanda.isInWater() && entitypanda.eL()) {
+                if (new com.destroystokyo.paper.event.entity.EntityJumpEvent(getBukkitLivingEntity()).callEvent()) { // Paper
                 entitypanda.jump();
+                } else { this.setJumping(false); } // Paper - setJumping(false) stops a potential loop
             }
         }
 
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
index b27fd44dcd..277eb54e79 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
@@ -711,5 +711,20 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
     public boolean isHandRaised() {
         return getHandle().isHandRaised();
     }
+
+    @Override
+    public boolean isJumping() {
+        return getHandle().jumping;
+    }
+
+    @Override
+    public void setJumping(boolean jumping) {
+        getHandle().setJumping(jumping);
+        if (jumping && getHandle() instanceof EntityInsentient) {
+            // this is needed to actually make a mob jump
+            ((EntityInsentient) getHandle()).getControllerJump().jump();
+        }
+    }
+
     // Paper end
 }
-- 
2.25.0