aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0658-Missing-Entity-Behavior-API.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0658-Missing-Entity-Behavior-API.patch')
-rw-r--r--patches/server/0658-Missing-Entity-Behavior-API.patch612
1 files changed, 612 insertions, 0 deletions
diff --git a/patches/server/0658-Missing-Entity-Behavior-API.patch b/patches/server/0658-Missing-Entity-Behavior-API.patch
new file mode 100644
index 0000000000..fecc136bbf
--- /dev/null
+++ b/patches/server/0658-Missing-Entity-Behavior-API.patch
@@ -0,0 +1,612 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Owen1212055 <[email protected]>
+Date: Mon, 21 Jun 2021 23:56:07 -0400
+Subject: [PATCH] Missing Entity Behavior API
+
+Co-authored-by: Nassim Jahnke <[email protected]>
+Co-authored-by: Jake Potrebic <[email protected]>
+
+diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java
+index d13f3460644f635ded96bf92ddf9ecf8984c8e47..bd048cc30046f19f9eee89c6ba45d0816a160e67 100644
+--- a/src/main/java/net/minecraft/world/entity/animal/Bee.java
++++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java
+@@ -540,11 +540,13 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal {
+ this.setFlag(4, hasStung);
+ }
+
++ public net.kyori.adventure.util.TriState rollingOverride = net.kyori.adventure.util.TriState.NOT_SET; // Paper - Rolling override
+ public boolean isRolling() {
+ return this.getFlag(2);
+ }
+
+ public void setRolling(boolean nearTarget) {
++ nearTarget = rollingOverride.toBooleanOrElse(nearTarget); // Paper - Rolling override
+ this.setFlag(2, nearTarget);
+ }
+
+diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java
+index 04a119e6641898454253e2478bc1b4dff181b5ee..a8da601b8342aa6e4902b452eb588c76c98a7adf 100644
+--- a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java
++++ b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java
+@@ -663,6 +663,14 @@ public abstract class AbstractHorse extends Animal implements ContainerListener,
+
+ }
+
++ // Paper Start - Horse API
++ public void setMouthOpen(boolean open) {
++ this.setFlag(FLAG_OPEN_MOUTH, open);
++ }
++ public boolean isMouthOpen() {
++ return this.getFlag(FLAG_OPEN_MOUTH);
++ }
++ // Paper End - Horse API
+ private void openMouth() {
+ if (!this.level.isClientSide) {
+ this.mouthCounter = 1;
+@@ -675,6 +683,11 @@ public abstract class AbstractHorse extends Animal implements ContainerListener,
+ this.setFlag(16, eatingGrass);
+ }
+
++ // Paper Start - Horse API
++ public void setForceStanding(boolean standing) {
++ this.setFlag(FLAG_STANDING, standing);
++ }
++ // Paper End - Horse API
+ public void setStanding(boolean angry) {
+ if (angry) {
+ this.setEating(false);
+diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java
+index 1fc862a3b5d40a45cf91703051bcfb06ec1b177a..02d7cd9cd27ff9254c3e99e3e94309a8cb8b243d 100644
+--- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java
++++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java
+@@ -84,6 +84,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
+ return entityliving.getMobType() != MobType.UNDEAD && entityliving.attackable();
+ };
+ private static final TargetingConditions TARGETING_CONDITIONS = TargetingConditions.forCombat().range(20.0D).selector(WitherBoss.LIVING_ENTITY_SELECTOR);
++ // Paper start
++ private boolean canPortal = false;
++
++ public void setCanTravelThroughPortals(boolean canPortal) { this.canPortal = canPortal; }
++ // Paper end
+
+ public WitherBoss(EntityType<? extends WitherBoss> type, Level world) {
+ super(type, world);
+@@ -601,7 +606,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
+
+ @Override
+ public boolean canChangeDimensions() {
+- return false;
++ return super.canChangeDimensions() && canPortal; // Paper
+ }
+
+ @Override
+diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java
+index e0e32528ed9f2f494b5ee2079c3167021f2e84c4..f22e615dba31619c97bf58930da060476a52facf 100644
+--- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java
++++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java
+@@ -433,6 +433,16 @@ public class EnderMan extends Monster implements NeutralMob {
+ this.entityData.set(EnderMan.DATA_STARED_AT, true);
+ }
+
++ // Paper start
++ public void setCreepy(boolean creepy) {
++ this.entityData.set(EnderMan.DATA_CREEPY, creepy);
++ }
++
++ public void setHasBeenStaredAt(boolean hasBeenStaredAt) {
++ this.entityData.set(EnderMan.DATA_STARED_AT, hasBeenStaredAt);
++ }
++ // Paper end
++
+ @Override
+ public boolean requiresCustomPersistence() {
+ return super.requiresCustomPersistence() || this.getCarriedBlock() != null;
+diff --git a/src/main/java/net/minecraft/world/entity/monster/Ghast.java b/src/main/java/net/minecraft/world/entity/monster/Ghast.java
+index 1f3506d38894fea224f3b2f125b45c3b68d705c7..bb2cb17e4e5ce142eeec18951c8948e3d6b3209c 100644
+--- a/src/main/java/net/minecraft/world/entity/monster/Ghast.java
++++ b/src/main/java/net/minecraft/world/entity/monster/Ghast.java
+@@ -66,6 +66,12 @@ public class Ghast extends FlyingMob implements Enemy {
+ return this.explosionPower;
+ }
+
++ // Paper start
++ public void setExplosionPower(int explosionPower) {
++ this.explosionPower = explosionPower;
++ }
++ // Paper end
++
+ @Override
+ protected boolean shouldDespawnInPeaceful() {
+ return true;
+diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java
+index e93a2634cd80cd4f1caf6bd60e569783bc6b577c..fb0a77b4cf1ba47c73c00993bd9b7454240fe5d6 100644
+--- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java
++++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java
+@@ -197,6 +197,12 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder {
+ }
+
+ public void startConverting(@Nullable UUID uuid, int delay) {
++ // Paper start - missing entity behaviour api - converting without entity event
++ this.startConverting(uuid, delay, true);
++ }
++
++ public void startConverting(@Nullable UUID uuid, int delay, boolean broadcastEntityEvent) {
++ // Paper end - missing entity behaviour api - converting without entity event
+ this.conversionStarter = uuid;
+ this.villagerConversionTime = delay;
+ this.getEntityData().set(ZombieVillager.DATA_CONVERTING_ID, true);
+@@ -204,7 +210,7 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder {
+ this.removeEffect(MobEffects.WEAKNESS, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.CONVERSION);
+ this.addEffect(new MobEffectInstance(MobEffects.DAMAGE_BOOST, delay, Math.min(this.level.getDifficulty().getId() - 1, 0)), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.CONVERSION);
+ // CraftBukkit end
+- this.level.broadcastEntityEvent(this, (byte) 16);
++ if (broadcastEntityEvent) this.level.broadcastEntityEvent(this, (byte) 16); // Paper - missing entity behaviour api - converting without entity event
+ }
+
+ @Override
+diff --git a/src/main/java/net/minecraft/world/entity/projectile/ThrownTrident.java b/src/main/java/net/minecraft/world/entity/projectile/ThrownTrident.java
+index a367f50b0e3fe9e7a1b87892a8c98e88bd678f6f..1b31b32d42eeb54680b902cd7e82d10ba7daa5d0 100644
+--- a/src/main/java/net/minecraft/world/entity/projectile/ThrownTrident.java
++++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownTrident.java
+@@ -105,6 +105,20 @@ public class ThrownTrident extends AbstractArrow {
+ return (Boolean) this.entityData.get(ThrownTrident.ID_FOIL);
+ }
+
++ // Paper start
++ public void setFoil(boolean foil) {
++ this.entityData.set(ThrownTrident.ID_FOIL, foil);
++ }
++
++ public int getLoyalty() {
++ return this.entityData.get(ThrownTrident.ID_LOYALTY);
++ }
++
++ public void setLoyalty(byte loyalty) {
++ this.entityData.set(ThrownTrident.ID_LOYALTY, loyalty);
++ }
++ // Paper end
++
+ @Nullable
+ @Override
+ protected EntityHitResult findHitEntity(Vec3 currentPosition, Vec3 nextPosition) {
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractHorse.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractHorse.java
+index 254d4f2e45d7c8f572a4368eccd84560d4d0d836..299ab868252c8f326e3a56e878c9ee230c9635dc 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractHorse.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractHorse.java
+@@ -115,4 +115,36 @@ public abstract class CraftAbstractHorse extends CraftAnimals implements Abstrac
+ public AbstractHorseInventory getInventory() {
+ return new CraftSaddledInventory(getHandle().inventory);
+ }
++
++ // Paper start - Horse API
++ @Override
++ public boolean isEatingGrass() {
++ return this.getHandle().isEating();
++ }
++
++ @Override
++ public void setEatingGrass(boolean eating) {
++ this.getHandle().setEating(eating);
++ }
++
++ @Override
++ public boolean isRearing() {
++ return this.getHandle().isStanding();
++ }
++
++ @Override
++ public void setRearing(boolean rearing) {
++ this.getHandle().setForceStanding(rearing);
++ }
++
++ @Override
++ public boolean isEating() {
++ return this.getHandle().isMouthOpen();
++ }
++
++ @Override
++ public void setEating(boolean eating) {
++ this.getHandle().setMouthOpen(eating);
++ }
++ // Paper end - Horse API
+ }
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftBee.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftBee.java
+index 8ada3dfbe89c8b55d85c31c71e365af0cbf66d19..b5d3a00a48d3b7618f974bb0f6909aa7c304b012 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftBee.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftBee.java
+@@ -91,4 +91,22 @@ public class CraftBee extends CraftAnimals implements Bee {
+ public void setCannotEnterHiveTicks(int ticks) {
+ this.getHandle().setStayOutOfHiveCountdown(ticks);
+ }
++ // Paper start
++ @Override
++ public void setRollingOverride(net.kyori.adventure.util.TriState rolling) {
++ this.getHandle().rollingOverride = rolling;
++
++ this.getHandle().setRolling(this.getHandle().isRolling()); // Refresh rolling state
++ }
++
++ @Override
++ public boolean isRolling() {
++ return this.getRollingOverride().toBooleanOrElse(this.getHandle().isRolling());
++ }
++
++ @Override
++ public net.kyori.adventure.util.TriState getRollingOverride() {
++ return this.getHandle().rollingOverride;
++ }
++ // Paper end
+ }
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftCat.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftCat.java
+index 37352ca3ff267d02a26ed182ce3df3ef775fa9bc..6a504f61c55d3983871f8d1c5c002c7a7b9c50ff 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftCat.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftCat.java
+@@ -51,4 +51,25 @@ public class CraftCat extends CraftTameableAnimal implements Cat {
+ public void setCollarColor(DyeColor color) {
+ this.getHandle().setCollarColor(net.minecraft.world.item.DyeColor.byId(color.getWoolData()));
+ }
++ // Paper Start - More cat api
++ @Override
++ public void setLyingDown(boolean lyingDown) {
++ this.getHandle().setLying(lyingDown);
++ }
++
++ @Override
++ public boolean isLyingDown() {
++ return this.getHandle().isLying();
++ }
++
++ @Override
++ public void setHeadUp(boolean headUp) {
++ this.getHandle().setRelaxStateOne(headUp);
++ }
++
++ @Override
++ public boolean isHeadUp() {
++ return this.getHandle().isRelaxStateOne();
++ }
++ // Paper End - More cat api
+ }
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java
+index ae669a970aa1f17ed786640de8a481364543c58e..acdc4e578d70f8121c8c6be7682ba1ecef7687cf 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java
+@@ -39,6 +39,28 @@ public class CraftEnderman extends CraftMonster implements Enderman {
+ this.getHandle().setCarriedBlock(blockData == null ? null : ((CraftBlockData) blockData).getState());
+ }
+
++ // Paper start
++ @Override
++ public boolean isScreaming() {
++ return this.getHandle().isCreepy();
++ }
++
++ @Override
++ public void setScreaming(boolean screaming) {
++ this.getHandle().setCreepy(screaming);
++ }
++
++ @Override
++ public boolean hasBeenStaredAt() {
++ return this.getHandle().hasBeenStaredAt();
++ }
++
++ @Override
++ public void setHasBeenStaredAt(boolean hasBeenStaredAt) {
++ this.getHandle().setHasBeenStaredAt(hasBeenStaredAt);
++ }
++ // Paper end
++
+ @Override
+ public EnderMan getHandle() {
+ return (EnderMan) entity;
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFox.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFox.java
+index f6369a1b0ea3fc64e9e7902d9da25924a0745855..fce96b67300b8808984904ee19d4e987f5235bfd 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFox.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFox.java
+@@ -119,4 +119,41 @@ public class CraftFox extends CraftAnimals implements Fox {
+ public boolean isFaceplanted() {
+ return this.getHandle().isFaceplanted();
+ }
++
++ // Paper start - Add more fox behavior API
++ @Override
++ public void setInterested(boolean interested) {
++ this.getHandle().setIsInterested(interested);
++ }
++
++ @Override
++ public boolean isInterested() {
++ return this.getHandle().isInterested();
++ }
++
++ @Override
++ public void setLeaping(boolean leaping) {
++ this.getHandle().setIsPouncing(leaping);
++ }
++
++ @Override
++ public boolean isLeaping() {
++ return this.getHandle().isPouncing();
++ }
++
++ @Override
++ public void setDefending(boolean defending) {
++ this.getHandle().setDefending(defending);
++ }
++
++ @Override
++ public boolean isDefending() {
++ return this.getHandle().isDefending();
++ }
++
++ @Override
++ public void setFaceplanted(boolean faceplanted) {
++ this.getHandle().setFaceplanted(faceplanted);
++ }
++ // Paper end - Add more fox behavior API
+ }
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftGhast.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftGhast.java
+index 7adda5c93e7c172ea0ba4a3f15828b5e54a283e7..fffaf4108b632ceabac4186d93b34ad0eb069a04 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftGhast.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftGhast.java
+@@ -34,4 +34,17 @@ public class CraftGhast extends CraftFlying implements Ghast {
+ public void setCharging(boolean flag) {
+ this.getHandle().setCharging(flag);
+ }
++
++ // Paper start
++ @Override
++ public int getExplosionPower() {
++ return this.getHandle().getExplosionPower();
++ }
++
++ @Override
++ public void setExplosionPower(int explosionPower) {
++ com.google.common.base.Preconditions.checkArgument(explosionPower >= 0 && explosionPower <= 127, "The explosion power has to be between 0 and 127");
++ this.getHandle().setExplosionPower(explosionPower);
++ }
++ // Paper end
+ }
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPanda.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPanda.java
+index ff9f711b83a8ea1bf4135751a9ba865224bce787..1f6dcad764240e15083731d017f9bb1c5c84622f 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPanda.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPanda.java
+@@ -46,6 +46,32 @@ public class CraftPanda extends CraftAnimals implements Panda {
+ public void setHiddenGene(Gene gene) {
+ this.getHandle().setHiddenGene(CraftPanda.toNms(gene));
+ }
++ // Paper start - Panda API
++ @Override
++ public void setSneezeTicks(int ticks) {
++ this.getHandle().setSneezeCounter(ticks);
++ }
++
++ @Override
++ public int getSneezeTicks() {
++ return this.getHandle().getSneezeCounter();
++ }
++
++ @Override
++ public void setEatingTicks(int ticks) {
++ this.getHandle().setEatCounter(ticks);
++ }
++
++ @Override
++ public int getEatingTicks() {
++ return this.getHandle().getEatCounter();
++ }
++
++ @Override
++ public void setUnhappyTicks(int ticks) {
++ this.getHandle().setUnhappyCounter(ticks);
++ }
++ // Paper end - Panda API
+
+ @Override
+ public boolean isRolling() {
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglin.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglin.java
+index aeda5fc001fe4ce55ee467240b275b6050a29f98..48d0a4e42e1b90d1323784d1284acabfe9497dd6 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglin.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglin.java
+@@ -90,4 +90,15 @@ public class CraftPiglin extends CraftPiglinAbstract implements Piglin, com.dest
+ public String toString() {
+ return "CraftPiglin";
+ }
++ // Paper start
++ @Override
++ public void setChargingCrossbow(boolean chargingCrossbow) {
++ this.getHandle().setChargingCrossbow(chargingCrossbow);
++ }
++
++ @Override
++ public boolean isChargingCrossbow() {
++ return this.getHandle().isChargingCrossbow();
++ }
++ // Paper end
+ }
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPolarBear.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPolarBear.java
+index da1488c9cae53bd554727c850da2192adda2478a..30a0eac179c86b0fe94a2a40b5bfcd3eee01e53b 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPolarBear.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPolarBear.java
+@@ -23,4 +23,16 @@ public class CraftPolarBear extends CraftAnimals implements PolarBear {
+ public EntityType getType() {
+ return EntityType.POLAR_BEAR;
+ }
++
++ // Paper start
++ @Override
++ public boolean isStanding() {
++ return this.getHandle().isStanding();
++ }
++
++ @Override
++ public void setStanding(boolean standing) {
++ this.getHandle().setStanding(standing);
++ }
++ // Paper end
+ }
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftRaider.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftRaider.java
+index b10bcbc19362f0f8596ebcf3f3e1060486cfc74f..e24eec79402843105a13de2bb8554260908057cc 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftRaider.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftRaider.java
+@@ -65,4 +65,16 @@ public abstract class CraftRaider extends CraftMonster implements Raider {
+ public Sound getCelebrationSound() {
+ return CraftSound.getBukkit(this.getHandle().getCelebrateSound());
+ }
++
++ // Paper start
++ @Override
++ public boolean isCelebrating() {
++ return this.getHandle().isCelebrating();
++ }
++
++ @Override
++ public void setCelebrating(boolean celebrating) {
++ this.getHandle().setCelebrating(celebrating);
++ }
++ // Paper end
+ }
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java
+index bf5b2fd6676c4430578db4cc6c603c501cc5e349..832981b07ef5c633ef00a382f56798ee87eec0df 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java
+@@ -37,4 +37,27 @@ public class CraftTrident extends CraftArrow implements Trident {
+ public EntityType getType() {
+ return EntityType.TRIDENT;
+ }
++
++ // Paper start
++ @Override
++ public boolean hasGlint() {
++ return this.getHandle().isFoil();
++ }
++
++ @Override
++ public void setGlint(boolean glint) {
++ this.getHandle().setFoil(glint);
++ }
++
++ @Override
++ public int getLoyaltyLevel() {
++ return this.getHandle().getLoyalty();
++ }
++
++ @Override
++ public void setLoyaltyLevel(int loyaltyLevel) {
++ com.google.common.base.Preconditions.checkArgument(loyaltyLevel >= 0 && loyaltyLevel <= 127, "The loyalty level has to be between 0 and 127");
++ this.getHandle().setLoyalty((byte) loyaltyLevel);
++ }
++ // Paper end
+ }
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java
+index 2ba16e33dd21c3c72cb12244aa78c59bf53e76d1..634a5099fb6faea03615783f57e643ad0083fa30 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java
+@@ -29,6 +29,26 @@ public class CraftVex extends CraftMonster implements Vex {
+ public void setSummoner(org.bukkit.entity.Mob summoner) {
+ getHandle().setOwner(summoner == null ? null : ((CraftMob) summoner).getHandle());
+ }
++
++ @Override
++ public boolean hasLimitedLifetime() {
++ return this.getHandle().hasLimitedLife;
++ }
++
++ @Override
++ public void setLimitedLifetime(boolean hasLimitedLifetime) {
++ this.getHandle().hasLimitedLife = hasLimitedLifetime;
++ }
++
++ @Override
++ public int getLimitedLifetimeTicks() {
++ return this.getHandle().limitedLifeTicks;
++ }
++
++ @Override
++ public void setLimitedLifetimeTicks(int ticks) {
++ this.getHandle().limitedLifeTicks = ticks;
++ }
+ // Paper end
+
+ @Override
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillagerZombie.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillagerZombie.java
+index 8a0a905f6701c6e94cbbf15793788350958fb728..2a74e6ecb4f57bc6879b37f7bc0675417223bcbf 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillagerZombie.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillagerZombie.java
+@@ -72,13 +72,20 @@ public class CraftVillagerZombie extends CraftZombie implements ZombieVillager {
+
+ @Override
+ public void setConversionTime(int time) {
++ // Paper start - missing entity behaviour api - converting without entity event
++ this.setConversionTime(time, true);
++ }
++
++ @Override
++ public void setConversionTime(int time, boolean broadcastEntityEvent) {
++ // Paper stop - missing entity behaviour api - converting without entity event
+ if (time < 0) {
+ this.getHandle().villagerConversionTime = -1;
+ this.getHandle().getEntityData().set(net.minecraft.world.entity.monster.ZombieVillager.DATA_CONVERTING_ID, false);
+ this.getHandle().conversionStarter = null;
+ this.getHandle().removeEffect(MobEffects.DAMAGE_BOOST, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.CONVERSION);
+ } else {
+- this.getHandle().startConverting((UUID) null, time);
++ this.getHandle().startConverting((UUID) null, time, broadcastEntityEvent); // Paper - missing entity behaviour api - converting without entity event
+ }
+ }
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWarden.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWarden.java
+index 7ece945d1a4fa29c7b98532788076483037f4bda..963928fc8e29b8abc2026c0b0183ebb07f0de4d1 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWarden.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWarden.java
+@@ -43,6 +43,13 @@ public class CraftWarden extends CraftMonster implements org.bukkit.entity.Warde
+ return this.getHandle().getAngerManagement().getActiveAnger(((CraftEntity) entity).getHandle());
+ }
+
++ // Paper start
++ @Override
++ public int getHighestAnger() {
++ return this.getHandle().getAngerManagement().getActiveAnger(null);
++ }
++ // Paper end
++
+ @Override
+ public void increaseAnger(Entity entity, int increase) {
+ Preconditions.checkArgument(entity != null, "Entity cannot be null");
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java
+index e92355fa2042c4cf15354a11b7058cacbe996f0d..4cf3a374c9ee7c7bcf82e778aa094eb4f8463595 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java
+@@ -61,4 +61,31 @@ public class CraftWither extends CraftMonster implements Wither, com.destroystok
+ Entity target = this.getHandle().getLevel().getEntity(entityId);
+ return (target != null) ? (LivingEntity) target.getBukkitEntity() : null;
+ }
++
++ // Paper start
++ @Override
++ public boolean isCharged() {
++ return getHandle().isPowered();
++ }
++
++ @Override
++ public int getInvulnerableTicks() {
++ return getHandle().getInvulnerableTicks();
++ }
++
++ @Override
++ public void setInvulnerableTicks(int ticks) {
++ getHandle().setInvulnerableTicks(ticks);
++ }
++
++ @Override
++ public boolean canTravelThroughPortals() {
++ return getHandle().canChangeDimensions();
++ }
++
++ @Override
++ public void setCanTravelThroughPortals(boolean value) {
++ getHandle().setCanTravelThroughPortals(value);
++ }
++ // Paper end
+ }