From 32acc2621791b5f38e71df1da1b43858bdeaa0e2 Mon Sep 17 00:00:00 2001 From: Parker Hawke Date: Tue, 30 Jun 2020 09:54:28 +1000 Subject: [PATCH] #686: Expand Strider and Steerable entity API --- nms-patches/EntityStrider.patch | 97 +++++++++++++++++++ nms-patches/SaddleStorage.patch | 18 ++++ .../bukkit/craftbukkit/entity/CraftPig.java | 37 +++++++ .../craftbukkit/entity/CraftStrider.java | 56 +++++++++++ .../craftbukkit/event/CraftEventFactory.java | 8 ++ 5 files changed, 216 insertions(+) create mode 100644 nms-patches/EntityStrider.patch create mode 100644 nms-patches/SaddleStorage.patch diff --git a/nms-patches/EntityStrider.patch b/nms-patches/EntityStrider.patch new file mode 100644 index 0000000000..6c35120609 --- /dev/null +++ b/nms-patches/EntityStrider.patch @@ -0,0 +1,97 @@ +--- a/net/minecraft/server/EntityStrider.java ++++ b/net/minecraft/server/EntityStrider.java +@@ -14,7 +14,7 @@ + private static final DataWatcherObject bx = DataWatcher.a(EntityStrider.class, DataWatcherRegistry.b); + private static final DataWatcherObject by = DataWatcher.a(EntityStrider.class, DataWatcherRegistry.i); + private static final DataWatcherObject bz = DataWatcher.a(EntityStrider.class, DataWatcherRegistry.i); +- private final SaddleStorage bA; ++ public final SaddleStorage bA; // CraftBukkit PAIL private -> public, rename saddleStorage + private PathfinderGoalTempt bB; + private PathfinderGoalPanic bC; + +@@ -264,7 +264,12 @@ + IBlockData iblockdata1 = this.aJ(); + boolean flag = iblockdata.a((Tag) TagsBlock.STRIDER_WARM_BLOCKS) || iblockdata1.a((Tag) TagsBlock.STRIDER_WARM_BLOCKS) || this.b((Tag) TagsFluid.LAVA) > 0.0D; + +- this.t(!flag); ++ // CraftBukkit start ++ if (!flag ^ this.eL()) { ++ org.bukkit.craftbukkit.event.CraftEventFactory.callStriderTemperatureChangeEvent(this, !flag); ++ this.t(!flag); ++ } ++ // CraftBukkit end + super.tick(); + this.eV(); + this.checkBlockCollisions(); +@@ -390,36 +395,36 @@ + @Override + public GroupDataEntity prepare(GeneratorAccess generatoraccess, DifficultyDamageScaler difficultydamagescaler, EnumMobSpawn enummobspawn, @Nullable GroupDataEntity groupdataentity, @Nullable NBTTagCompound nbttagcompound) { + EntityZombie.GroupDataZombie entityzombie_groupdatazombie = null; +- EntityStrider$GroupData$Rider entitystrider$groupdata$rider; ++ EntityStrider.GroupData.Rider entitystrider_groupdata_rider; + +- if (groupdataentity instanceof EntityStrider.a) { +- entitystrider$groupdata$rider = ((EntityStrider.a) groupdataentity).a; ++ if (groupdataentity instanceof EntityStrider.GroupData) { ++ entitystrider_groupdata_rider = ((EntityStrider.GroupData) groupdataentity).a; + } else if (!this.isBaby()) { + if (this.random.nextInt(30) == 0) { +- entitystrider$groupdata$rider = EntityStrider$GroupData$Rider.PIGLIN_RIDER; ++ entitystrider_groupdata_rider = EntityStrider.GroupData.Rider.PIGLIN_RIDER; + entityzombie_groupdatazombie = new EntityZombie.GroupDataZombie(EntityZombie.a(this.random), false); + } else if (this.random.nextInt(10) == 0) { +- entitystrider$groupdata$rider = EntityStrider$GroupData$Rider.BABY_RIDER; ++ entitystrider_groupdata_rider = EntityStrider.GroupData.Rider.BABY_RIDER; + } else { +- entitystrider$groupdata$rider = EntityStrider$GroupData$Rider.NO_RIDER; ++ entitystrider_groupdata_rider = EntityStrider.GroupData.Rider.NO_RIDER; + } + +- groupdataentity = new EntityStrider.a(entitystrider$groupdata$rider); +- ((EntityAgeable.a) groupdataentity).a(entitystrider$groupdata$rider == EntityStrider$GroupData$Rider.NO_RIDER ? 0.5F : 0.0F); ++ groupdataentity = new EntityStrider.GroupData(entitystrider_groupdata_rider); ++ ((EntityAgeable.a) groupdataentity).a(entitystrider_groupdata_rider == EntityStrider.GroupData.Rider.NO_RIDER ? 0.5F : 0.0F); + } else { +- entitystrider$groupdata$rider = EntityStrider$GroupData$Rider.NO_RIDER; ++ entitystrider_groupdata_rider = EntityStrider.GroupData.Rider.NO_RIDER; + } + + Object object = null; + +- if (entitystrider$groupdata$rider == EntityStrider$GroupData$Rider.BABY_RIDER) { ++ if (entitystrider_groupdata_rider == EntityStrider.GroupData.Rider.BABY_RIDER) { + EntityStrider entitystrider = (EntityStrider) EntityTypes.STRIDER.a(generatoraccess.getMinecraftWorld()); + + if (entitystrider != null) { + object = entitystrider; + entitystrider.setAgeRaw(-24000); + } +- } else if (entitystrider$groupdata$rider == EntityStrider$GroupData$Rider.PIGLIN_RIDER) { ++ } else if (entitystrider_groupdata_rider == EntityStrider.GroupData.Rider.PIGLIN_RIDER) { + EntityPigZombie entitypigzombie = (EntityPigZombie) EntityTypes.ZOMBIFIED_PIGLIN.a(generatoraccess.getMinecraftWorld()); + + if (entitypigzombie != null) { +@@ -461,12 +466,19 @@ + } + } + +- public static class a extends EntityAgeable.a { ++ public static class GroupData extends EntityAgeable.a { ++ ++ public final EntityStrider.GroupData.Rider a; ++ ++ public GroupData(EntityStrider.GroupData.Rider entitystrider_groupdata_rider) { ++ this.a = entitystrider_groupdata_rider; ++ } ++ ++ public static enum Rider { + +- public final EntityStrider$GroupData$Rider a; ++ NO_RIDER, BABY_RIDER, PIGLIN_RIDER; + +- public a(EntityStrider$GroupData$Rider entitystrider$groupdata$rider) { +- this.a = entitystrider$groupdata$rider; ++ private Rider() {} + } + } + } diff --git a/nms-patches/SaddleStorage.patch b/nms-patches/SaddleStorage.patch new file mode 100644 index 0000000000..ba3928f515 --- /dev/null +++ b/nms-patches/SaddleStorage.patch @@ -0,0 +1,18 @@ +--- a/net/minecraft/server/SaddleStorage.java ++++ b/net/minecraft/server/SaddleStorage.java +@@ -35,6 +35,15 @@ + } + } + ++ // CraftBukkit add setBoostTicks(int) ++ public void setBoostTicks(int ticks) { ++ this.a = true; // PAIL rename boosting ++ this.b = 0; // PAIL rename currentBoostTicks ++ this.c = ticks; // PAIL rename boostTicks ++ this.d.set(this.e, this.c); // PAIL rename dataWatcher, dataWatcherBoostTicks ++ } ++ // CraftBukkit end ++ + public void a(NBTTagCompound nbttagcompound) { + nbttagcompound.setBoolean("Saddle", this.hasSaddle()); + } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPig.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPig.java index a426856318..c9f31715a3 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPig.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPig.java @@ -1,11 +1,14 @@ package org.bukkit.craftbukkit.entity; +import com.google.common.base.Preconditions; import net.minecraft.server.EntityPig; +import org.bukkit.Material; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.entity.EntityType; import org.bukkit.entity.Pig; public class CraftPig extends CraftAnimals implements Pig { + public CraftPig(CraftServer server, EntityPig entity) { super(server, entity); } @@ -20,6 +23,40 @@ public class CraftPig extends CraftAnimals implements Pig { getHandle().saddleStorage.setSaddle(saddled); } + @Override + public int getBoostTicks() { + return getHandle().saddleStorage.a ? getHandle().saddleStorage.c : 0; + } + + @Override + public void setBoostTicks(int ticks) { + Preconditions.checkArgument(ticks >= 0, "ticks must be >= 0"); + + getHandle().saddleStorage.setBoostTicks(ticks); + } + + @Override + public int getCurrentBoostTicks() { + return getHandle().saddleStorage.a ? getHandle().saddleStorage.b : 0; + } + + @Override + public void setCurrentBoostTicks(int ticks) { + if (!getHandle().saddleStorage.a) { + return; + } + + int max = getHandle().saddleStorage.c; + Preconditions.checkArgument(ticks >= 0 && ticks <= max, "boost ticks must not exceed 0 or %d (inclusive)", max); + + this.getHandle().saddleStorage.b = ticks; + } + + @Override + public Material getSteerMaterial() { + return Material.CARROT_ON_A_STICK; + } + @Override public EntityPig getHandle() { return (EntityPig) entity; diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftStrider.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftStrider.java index 4dfbd62c63..f42a6ea00d 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftStrider.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftStrider.java @@ -1,6 +1,8 @@ package org.bukkit.craftbukkit.entity; +import com.google.common.base.Preconditions; import net.minecraft.server.EntityStrider; +import org.bukkit.Material; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.entity.EntityType; import org.bukkit.entity.Strider; @@ -11,6 +13,60 @@ public class CraftStrider extends CraftAnimals implements Strider { super(server, entity); } + @Override + public boolean isShivering() { + return getHandle().eL(); // PAIL rename isShivering + } + + @Override + public void setShivering(boolean shivering) { + this.getHandle().t(shivering); // PAIL rename setShivering + } + + @Override + public boolean hasSaddle() { + return getHandle().hasSaddle(); + } + + @Override + public void setSaddle(boolean saddled) { + getHandle().bA.setSaddle(saddled); + } + + @Override + public int getBoostTicks() { + return getHandle().bA.a ? getHandle().bA.c : 0; + } + + @Override + public void setBoostTicks(int ticks) { + Preconditions.checkArgument(ticks >= 0, "ticks must be >= 0"); + + getHandle().bA.setBoostTicks(ticks); + } + + @Override + public int getCurrentBoostTicks() { + return getHandle().bA.a ? getHandle().bA.b : 0; + } + + @Override + public void setCurrentBoostTicks(int ticks) { + if (!getHandle().bA.a) { + return; + } + + int max = getHandle().bA.c; + Preconditions.checkArgument(ticks >= 0 && ticks <= max, "boost ticks must not exceed 0 or %d (inclusive)", max); + + this.getHandle().bA.b = ticks; + } + + @Override + public Material getSteerMaterial() { + return Material.WARPED_FUNGUS_ON_A_STICK; + } + @Override public EntityStrider getHandle() { return (EntityStrider) entity; diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index 62111e83d7..51c96b8827 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -39,6 +39,7 @@ import net.minecraft.server.EntityPlayer; import net.minecraft.server.EntityPotion; import net.minecraft.server.EntityRaider; import net.minecraft.server.EntitySlime; +import net.minecraft.server.EntityStrider; import net.minecraft.server.EntityTypes; import net.minecraft.server.EntityVillager; import net.minecraft.server.EntityWaterAnimal; @@ -113,6 +114,7 @@ import org.bukkit.entity.PigZombie; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; import org.bukkit.entity.Raider; +import org.bukkit.entity.Strider; import org.bukkit.entity.ThrownExpBottle; import org.bukkit.entity.ThrownPotion; import org.bukkit.entity.Vehicle; @@ -180,6 +182,7 @@ import org.bukkit.event.entity.PlayerLeashEntityEvent; import org.bukkit.event.entity.PotionSplashEvent; import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.event.entity.StriderTemperatureChangeEvent; import org.bukkit.event.entity.VillagerCareerChangeEvent; import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryOpenEvent; @@ -1576,4 +1579,9 @@ public class CraftEventFactory { Bukkit.getPluginManager().callEvent(event); return event; } + + public static void callStriderTemperatureChangeEvent(EntityStrider strider, boolean shivering) { + StriderTemperatureChangeEvent event = new StriderTemperatureChangeEvent((Strider) strider.getBukkitEntity(), shivering); + Bukkit.getPluginManager().callEvent(event); + } }