diff --git a/patches/server/0104-Ridables.patch b/patches/server/0104-Ridables.patch index 767090ace..6f7f5d9ef 100644 --- a/patches/server/0104-Ridables.patch +++ b/patches/server/0104-Ridables.patch @@ -287,7 +287,7 @@ index 920f4c7671..7fec83387a 100644 + // Purpur end } diff --git a/src/main/java/net/minecraft/server/EntityCow.java b/src/main/java/net/minecraft/server/EntityCow.java -index d6baddb9d3..a4b1255add 100644 +index d6baddb9d3..db15c65ce6 100644 --- a/src/main/java/net/minecraft/server/EntityCow.java +++ b/src/main/java/net/minecraft/server/EntityCow.java @@ -11,9 +11,22 @@ public class EntityCow extends EntityAnimal { @@ -326,7 +326,7 @@ index d6baddb9d3..a4b1255add 100644 if (event.isCancelled()) { - return EnumInteractionResult.PASS; -+ return super.b(entityhuman, enumhand); ++ return tryRide(entityhuman, enumhand); // Purpur } // CraftBukkit end @@ -353,7 +353,7 @@ index d6baddb9d3..a4b1255add 100644 EntityMushroomCow mooshroom = EntityTypes.MOOSHROOM.create(world); if (mooshroom == null) { - return EnumInteractionResult.PASS; -+ return super.b(entityhuman, enumhand); ++ return tryRide(entityhuman, enumhand); // Purpur } if (itemstack.getItem() == Blocks.BROWN_MUSHROOM.getItem()) { mooshroom.setVariant(EntityMushroomCow.Type.BROWN); @@ -362,11 +362,11 @@ index d6baddb9d3..a4b1255add 100644 } if (CraftEventFactory.callEntityTransformEvent(this, mooshroom, org.bukkit.event.entity.EntityTransformEvent.TransformReason.INFECTION).isCancelled()) { - return EnumInteractionResult.PASS; -+ return super.b(entityhuman, enumhand); ++ return tryRide(entityhuman, enumhand); // Purpur } if (!new com.destroystokyo.paper.event.entity.EntityTransformedEvent(this.getBukkitEntity(), mooshroom.getBukkitEntity(), com.destroystokyo.paper.event.entity.EntityTransformedEvent.TransformedReason.INFECTED).callEvent()) { - return EnumInteractionResult.PASS; -+ return super.b(entityhuman, enumhand); ++ return tryRide(entityhuman, enumhand); // Purpur } this.world.addEntity(mooshroom); this.die(); @@ -652,7 +652,7 @@ index 0cbdccf4c5..19a21ff98d 100644 + protected void eW() { if (world.purpurConfig.zombieHorseCanSwim) goalSelector.a(0, new PathfinderGoalFloat(this)); } // Purpur } diff --git a/src/main/java/net/minecraft/server/EntityInsentient.java b/src/main/java/net/minecraft/server/EntityInsentient.java -index 8def5fbfb4..a64de2248b 100644 +index 8def5fbfb4..fe6ff77935 100644 --- a/src/main/java/net/minecraft/server/EntityInsentient.java +++ b/src/main/java/net/minecraft/server/EntityInsentient.java @@ -67,8 +67,8 @@ public abstract class EntityInsentient extends EntityLiving { @@ -666,7 +666,22 @@ index 8def5fbfb4..a64de2248b 100644 this.bp = new ControllerJump(this); this.c = this.r(); this.navigation = this.b(world); -@@ -532,6 +532,7 @@ public abstract class EntityInsentient extends EntityLiving { +@@ -520,18 +520,22 @@ public abstract class EntityInsentient extends EntityLiving { + return super.do_(); + } + ++ public void setForwardSpeed(float speed) { this.q(speed); } // Purpur - OBFHELPER + public void q(float f) { + this.ba = f; + } + ++ public void setVerticalSpeed(float speed) { this.r(speed); } // Purpur - OBFHELPER + public void r(float f) { + this.aZ = f; + } + ++ public void setStrafeSpeed(float speed) { this.s(speed); } // Purpur - OBFHELPER + public void s(float f) { this.aY = f; } @@ -674,7 +689,7 @@ index 8def5fbfb4..a64de2248b 100644 @Override public void n(float f) { super.n(f); -@@ -1200,7 +1201,7 @@ public abstract class EntityInsentient extends EntityLiving { +@@ -1200,7 +1204,7 @@ public abstract class EntityInsentient extends EntityLiving { protected void a(EntityHuman entityhuman, EntityInsentient entityinsentient) {} protected EnumInteractionResult b(EntityHuman entityhuman, EnumHand enumhand) { @@ -683,7 +698,7 @@ index 8def5fbfb4..a64de2248b 100644 } public boolean ew() { -@@ -1559,4 +1560,42 @@ public abstract class EntityInsentient extends EntityLiving { +@@ -1559,4 +1563,42 @@ public abstract class EntityInsentient extends EntityLiving { this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.UNKNOWN)); // CraftBukkit this.unleash(true, false); } @@ -726,6 +741,57 @@ index 8def5fbfb4..a64de2248b 100644 + } + // Purpur end } +diff --git a/src/main/java/net/minecraft/server/EntityIronGolem.java b/src/main/java/net/minecraft/server/EntityIronGolem.java +index ab0731c2a0..2da50ef495 100644 +--- a/src/main/java/net/minecraft/server/EntityIronGolem.java ++++ b/src/main/java/net/minecraft/server/EntityIronGolem.java +@@ -22,9 +22,22 @@ public class EntityIronGolem extends EntityGolem implements IEntityAngerable { + this.G = 1.0F; + } + ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return world.purpurConfig.ironGolemRidable; ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return world.purpurConfig.ironGolemRidableInWater; ++ } ++ // Purpur end ++ + @Override + protected void initPathfinder() { + if (world.purpurConfig.ironGolemCanSwim) this.goalSelector.a(0, new PathfinderGoalFloat(this)); // Purpur ++ this.goalSelector.a(0, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); // Purpur + this.goalSelector.a(1, new PathfinderGoalMeleeAttack(this, 1.0D, true)); + this.goalSelector.a(2, new PathfinderGoalMoveTowardsTarget(this, 0.9D, 32.0F)); + this.goalSelector.a(2, new PathfinderGoalStrollVillage(this, 0.6D, false)); +@@ -32,6 +45,7 @@ public class EntityIronGolem extends EntityGolem implements IEntityAngerable { + this.goalSelector.a(5, new PathfinderGoalOfferFlower(this)); + this.goalSelector.a(7, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); + this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this)); ++ this.targetSelector.a(0, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); // Purpur + this.targetSelector.a(1, new PathfinderGoalDefendVillage(this)); + this.targetSelector.a(2, new PathfinderGoalHurtByTarget(this, new Class[0])); + this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, 10, true, false, this::b)); +@@ -201,13 +215,13 @@ public class EntityIronGolem extends EntityGolem implements IEntityAngerable { + Item item = itemstack.getItem(); + + if (item != Items.IRON_INGOT) { +- return EnumInteractionResult.PASS; ++ return tryRide(entityhuman, enumhand); // Purpur + } else { + float f = this.getHealth(); + + this.heal(25.0F); + if (this.getHealth() == f) { +- return EnumInteractionResult.PASS; ++ return tryRide(entityhuman, enumhand); // Purpur + } else { + float f1 = 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F; + diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java index cb9fdfd114..22b13896d0 100644 --- a/src/main/java/net/minecraft/server/EntityLiving.java @@ -749,10 +815,10 @@ index cb9fdfd114..22b13896d0 100644 if (this.hasEffect(MobEffects.JUMP)) { diff --git a/src/main/java/net/minecraft/server/EntityLlama.java b/src/main/java/net/minecraft/server/EntityLlama.java -index cf31920850..e8a87e6bed 100644 +index cf31920850..15efaffe24 100644 --- a/src/main/java/net/minecraft/server/EntityLlama.java +++ b/src/main/java/net/minecraft/server/EntityLlama.java -@@ -18,6 +18,28 @@ public class EntityLlama extends EntityHorseChestedAbstract implements IRangedEn +@@ -18,7 +18,46 @@ public class EntityLlama extends EntityHorseChestedAbstract implements IRangedEn public EntityLlama(EntityTypes entitytypes, World world) { super(entitytypes, world); @@ -778,9 +844,322 @@ index cf31920850..e8a87e6bed 100644 + } + }; + // Purpur end ++ } ++ ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return world.purpurConfig.llamaRidable; ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return world.purpurConfig.llamaRidableInWater; ++ } ++ ++ @Override ++ public boolean hasSaddle() { ++ return super.hasSaddle() || (isTamed() && getColor() != null); } ++ // Purpur end public void setStrength(int i) { + this.datawatcher.set(EntityLlama.bE, Math.max(1, Math.min(5, i))); +@@ -64,6 +103,7 @@ public class EntityLlama extends EntityHorseChestedAbstract implements IRangedEn + @Override + protected void initPathfinder() { + this.goalSelector.a(0, new PathfinderGoalFloat(this)); ++ this.goalSelector.a(0, new net.pl3x.purpur.pathfinder.PathfinderGoalHorseHasRider(this)); // Purpur + this.goalSelector.a(1, new PathfinderGoalTame(this, 1.2D)); + this.goalSelector.a(2, new PathfinderGoalLlamaFollow(this, 2.0999999046325684D)); + this.goalSelector.a(3, new PathfinderGoalArrowAttack(this, 1.25D, 40, 20.0F)); +@@ -73,6 +113,7 @@ public class EntityLlama extends EntityHorseChestedAbstract implements IRangedEn + this.goalSelector.a(6, new PathfinderGoalRandomStrollLand(this, 0.7D)); + this.goalSelector.a(7, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); + this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this)); ++ this.targetSelector.a(0, new net.pl3x.purpur.pathfinder.PathfinderGoalHorseHasRider(this)); // Purpur + this.targetSelector.a(1, new EntityLlama.c(this)); + this.targetSelector.a(2, new EntityLlama.a(this)); + } +@@ -310,7 +351,7 @@ public class EntityLlama extends EntityHorseChestedAbstract implements IRangedEn + } + + @Nullable +- public EnumColor fz() { ++ public EnumColor fz() { return getColor(); } public EnumColor getColor() { // Purpur - OBFHELPER + int i = (Integer) this.datawatcher.get(EntityLlama.bF); + + return i == -1 ? null : EnumColor.fromColorIndex(i); +diff --git a/src/main/java/net/minecraft/server/EntityLlamaTrader.java b/src/main/java/net/minecraft/server/EntityLlamaTrader.java +index 11008c4323..de8ce2fd39 100644 +--- a/src/main/java/net/minecraft/server/EntityLlamaTrader.java ++++ b/src/main/java/net/minecraft/server/EntityLlamaTrader.java +@@ -11,6 +11,23 @@ public class EntityLlamaTrader extends EntityLlama { + super(entitytypes, world); + } + ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return world.purpurConfig.llamaTraderRidable; ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return world.purpurConfig.llamaTraderRidableInWater; ++ } ++ ++ @Override ++ public boolean hasSaddle() { ++ return super.hasSaddle() || isTamed(); ++ } ++ // Purpur end ++ + @Override + protected EntityLlama fA() { + return (EntityLlama) EntityTypes.TRADER_LLAMA.a(this.world); +diff --git a/src/main/java/net/minecraft/server/EntityMushroomCow.java b/src/main/java/net/minecraft/server/EntityMushroomCow.java +index ecbdc65ec5..a36e7d182f 100644 +--- a/src/main/java/net/minecraft/server/EntityMushroomCow.java ++++ b/src/main/java/net/minecraft/server/EntityMushroomCow.java +@@ -20,6 +20,18 @@ public class EntityMushroomCow extends EntityCow implements IShearable { + super(entitytypes, world); + } + ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return world.purpurConfig.mooshroomRidable; ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return world.purpurConfig.mooshroomRidableInWater; ++ } ++ // Purpur end ++ + @Override + public float a(BlockPosition blockposition, IWorldReader iworldreader) { + return iworldreader.getType(blockposition.down()).a(Blocks.MYCELIUM) ? 10.0F : iworldreader.y(blockposition) - 0.5F; +@@ -81,7 +93,7 @@ public class EntityMushroomCow extends EntityCow implements IShearable { + } else if (itemstack.getItem() == Items.SHEARS && this.canShear()) { + // CraftBukkit start + if (!CraftEventFactory.handlePlayerShearEntityEvent(entityhuman, this, itemstack, enumhand)) { +- return EnumInteractionResult.PASS; ++ return tryRide(entityhuman, enumhand); // Purpur + } + // CraftBukkit end + this.shear(SoundCategory.PLAYERS); +@@ -101,7 +113,7 @@ public class EntityMushroomCow extends EntityCow implements IShearable { + Optional> optional = this.l(itemstack); + + if (!optional.isPresent()) { +- return EnumInteractionResult.PASS; ++ return tryRide(entityhuman, enumhand); // Purpur + } + + Pair pair = (Pair) optional.get(); +diff --git a/src/main/java/net/minecraft/server/EntityOcelot.java b/src/main/java/net/minecraft/server/EntityOcelot.java +index 9c1f019f91..366acbfd91 100644 +--- a/src/main/java/net/minecraft/server/EntityOcelot.java ++++ b/src/main/java/net/minecraft/server/EntityOcelot.java +@@ -16,6 +16,18 @@ public class EntityOcelot extends EntityAnimal { + this.eM(); + } + ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return world.purpurConfig.ocelotRidable; ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return world.purpurConfig.ocelotRidableInWater; ++ } ++ // Purpur end ++ + private boolean isTrusting() { + return (Boolean) this.datawatcher.get(EntityOcelot.bw); + } +@@ -47,12 +59,14 @@ public class EntityOcelot extends EntityAnimal { + protected void initPathfinder() { + this.by = new EntityOcelot.b(this, 0.6D, EntityOcelot.bv, true); + this.goalSelector.a(1, new PathfinderGoalFloat(this)); ++ this.goalSelector.a(1, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); // Purpur + this.goalSelector.a(3, this.by); + this.goalSelector.a(7, new PathfinderGoalLeapAtTarget(this, 0.3F)); + this.goalSelector.a(8, new PathfinderGoalOcelotAttack(this)); + this.goalSelector.a(9, new PathfinderGoalBreed(this, 0.8D)); + this.goalSelector.a(10, new PathfinderGoalRandomStrollLand(this, 0.8D, 1.0000001E-5F)); + this.goalSelector.a(11, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 10.0F)); ++ this.targetSelector.a(0, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); // Purpur + this.targetSelector.a(1, new PathfinderGoalNearestAttackableTarget<>(this, EntityChicken.class, false)); + this.targetSelector.a(1, new PathfinderGoalNearestAttackableTarget<>(this, EntityTurtle.class, 10, false, false, EntityTurtle.bv)); + } +diff --git a/src/main/java/net/minecraft/server/EntityPanda.java b/src/main/java/net/minecraft/server/EntityPanda.java +index 42df0d74ee..271e82ce17 100644 +--- a/src/main/java/net/minecraft/server/EntityPanda.java ++++ b/src/main/java/net/minecraft/server/EntityPanda.java +@@ -46,6 +46,27 @@ public class EntityPanda extends EntityAnimal { + + } + ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return world.purpurConfig.pandaRidable; ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return world.purpurConfig.pandaRidableInWater; ++ } ++ ++ @Override ++ public void onMount(EntityHuman entityhuman) { ++ super.onMount(entityhuman); ++ this.setForwardSpeed(0.0F); ++ this.setScared(false); ++ this.setEating(false); ++ this.setLayingOnBack(false); ++ } ++ // Purpur end ++ + @Override + public boolean e(ItemStack itemstack) { + EnumItemSlot enumitemslot = EntityInsentient.j(itemstack); +@@ -69,6 +90,7 @@ public class EntityPanda extends EntityAnimal { + return this.w(8); + } + ++ public void setScared(boolean scared) { this.t(scared); } // Purpur - OBFHELPER + public void t(boolean flag) { + this.d(8, flag); + } +@@ -77,6 +99,7 @@ public class EntityPanda extends EntityAnimal { + return this.w(16); + } + ++ public void setLayingOnBack(boolean layingOnBack) { this.u(layingOnBack); } // Purpur - OBFHELPER + public void u(boolean flag) { + this.d(16, flag); + } +@@ -85,6 +108,7 @@ public class EntityPanda extends EntityAnimal { + return (Integer) this.datawatcher.get(EntityPanda.by) > 0; + } + ++ public void setEating(boolean eating) { this.v(eating); } // Purpur - OBFHELPER + public void v(boolean flag) { + this.datawatcher.set(EntityPanda.by, flag ? 1 : 0); + } +@@ -201,6 +225,7 @@ public class EntityPanda extends EntityAnimal { + @Override + protected void initPathfinder() { + this.goalSelector.a(0, new PathfinderGoalFloat(this)); ++ this.goalSelector.a(0, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); // Purpur + this.goalSelector.a(2, new EntityPanda.i(this, 2.0D)); + this.goalSelector.a(2, new EntityPanda.d(this, 1.0D)); + this.goalSelector.a(3, new EntityPanda.b(this, 1.2000000476837158D, true)); +@@ -216,6 +241,7 @@ public class EntityPanda extends EntityAnimal { + this.goalSelector.a(12, new EntityPanda.j(this)); + this.goalSelector.a(13, new PathfinderGoalFollowParent(this, 1.25D)); + this.goalSelector.a(14, new PathfinderGoalRandomStrollLand(this, 1.0D)); ++ this.targetSelector.a(0, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); // Purpur + this.targetSelector.a(1, (new EntityPanda.e(this, new Class[0])).a(new Class[0])); + } + +@@ -537,7 +563,7 @@ public class EntityPanda extends EntityAnimal { + ItemStack itemstack = entityhuman.b(enumhand); + + if (this.fg()) { +- return EnumInteractionResult.PASS; ++ return tryRide(entityhuman, enumhand); // Purpur + } else if (this.eO()) { + this.u(false); + return EnumInteractionResult.a(this.world.isClientSide); +@@ -554,7 +580,7 @@ public class EntityPanda extends EntityAnimal { + this.g(entityhuman); + } else { + if (this.world.isClientSide || this.eN() || this.isInWater()) { +- return EnumInteractionResult.PASS; ++ return tryRide(entityhuman, enumhand); // Purpur + } + + this.fu(); +@@ -571,7 +597,7 @@ public class EntityPanda extends EntityAnimal { + + return EnumInteractionResult.SUCCESS; + } else { +- return EnumInteractionResult.PASS; ++ return tryRide(entityhuman, enumhand); // Purpur + } + } + +@@ -684,6 +710,7 @@ public class EntityPanda extends EntityAnimal { + + public f(EntityPanda entitypanda) { + this.a = entitypanda; ++ this.a(EnumSet.of(PathfinderGoal.Type.MOVE)); // Purpur - lay on back + } + + @Override +@@ -847,6 +874,7 @@ public class EntityPanda extends EntityAnimal { + + public l(EntityPanda entitypanda) { + this.a = entitypanda; ++ this.a(EnumSet.of(PathfinderGoal.Type.MOVE)); // Purpur - sneeze + } + + @Override +@@ -976,7 +1004,7 @@ public class EntityPanda extends EntityAnimal { + } + } + +- static class h extends ControllerMove { ++ static class h extends net.pl3x.purpur.controller.ControllerMoveWASD { // Purpur + + private final EntityPanda i; + +@@ -986,9 +1014,9 @@ public class EntityPanda extends EntityAnimal { + } + + @Override +- public void a() { ++ public void tick() { // Purpur + if (this.i.fi()) { +- super.a(); ++ super.tick(); // Purpur + } + } + } +diff --git a/src/main/java/net/minecraft/server/EntityPig.java b/src/main/java/net/minecraft/server/EntityPig.java +index cf2df391a9..9bd4cdf138 100644 +--- a/src/main/java/net/minecraft/server/EntityPig.java ++++ b/src/main/java/net/minecraft/server/EntityPig.java +@@ -19,9 +19,22 @@ public class EntityPig extends EntityAnimal implements ISteerable, ISaddleable { + this.saddleStorage = new SaddleStorage(this.datawatcher, EntityPig.bw, EntityPig.bv); + } + ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return world.purpurConfig.pigRidable; ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return world.purpurConfig.pigRidableInWater; ++ } ++ // Purpur end ++ + @Override + protected void initPathfinder() { + this.goalSelector.a(0, new PathfinderGoalFloat(this)); ++ this.goalSelector.a(0, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); // Purpur + this.goalSelector.a(1, new PathfinderGoalPanic(this, 1.25D)); + this.goalSelector.a(3, new PathfinderGoalBreed(this, 1.0D)); + this.goalSelector.a(4, new PathfinderGoalTempt(this, 1.2D, RecipeItemStack.a(Items.CARROT_ON_A_STICK), false)); diff --git a/src/main/java/net/minecraft/server/EntityRabbit.java b/src/main/java/net/minecraft/server/EntityRabbit.java index 1be0f943b0..8a8e745846 100644 --- a/src/main/java/net/minecraft/server/EntityRabbit.java @@ -794,6 +1173,43 @@ index 1be0f943b0..8a8e745846 100644 super.jump(); double d0 = this.moveController.c(); +diff --git a/src/main/java/net/minecraft/server/EntitySheep.java b/src/main/java/net/minecraft/server/EntitySheep.java +index a5532e49e7..adfed0997f 100644 +--- a/src/main/java/net/minecraft/server/EntitySheep.java ++++ b/src/main/java/net/minecraft/server/EntitySheep.java +@@ -17,7 +17,7 @@ import org.bukkit.inventory.InventoryView; + public class EntitySheep extends EntityAnimal implements IShearable { + + private static final DataWatcherObject bv = DataWatcher.a(EntitySheep.class, DataWatcherRegistry.a); +- private static final Map bw = (Map) SystemUtils.a(Maps.newEnumMap(EnumColor.class), (enummap) -> { // CraftBukkit - decompile error ++ private static final Map bw = SystemUtils.a(Maps.newEnumMap(EnumColor.class), (enummap) -> { // CraftBukkit - decompile error // Purpur - decompile error + enummap.put(EnumColor.WHITE, Blocks.WHITE_WOOL); + enummap.put(EnumColor.ORANGE, Blocks.ORANGE_WOOL); + enummap.put(EnumColor.MAGENTA, Blocks.MAGENTA_WOOL); +@@ -56,10 +56,23 @@ public class EntitySheep extends EntityAnimal implements IShearable { + super(entitytypes, world); + } + ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return world.purpurConfig.sheepRidable; ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return world.purpurConfig.sheepRidableInWater; ++ } ++ // Purpur end ++ + @Override + protected void initPathfinder() { + this.bz = new PathfinderGoalEatTile(this); + this.goalSelector.a(0, new PathfinderGoalFloat(this)); ++ this.goalSelector.a(0, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); // Purpur + this.goalSelector.a(1, new PathfinderGoalPanic(this, 1.25D)); + this.goalSelector.a(2, new PathfinderGoalBreed(this, 1.0D)); + this.goalSelector.a(3, new PathfinderGoalTempt(this, 1.1D, RecipeItemStack.a(Items.WHEAT), false)); diff --git a/src/main/java/net/minecraft/server/EntitySlime.java b/src/main/java/net/minecraft/server/EntitySlime.java index a4642cc739..ecf2059b00 100644 --- a/src/main/java/net/minecraft/server/EntitySlime.java @@ -807,6 +1223,105 @@ index a4642cc739..ecf2059b00 100644 Vec3D vec3d = this.getMot(); this.setMot(vec3d.x, (double) this.dI(), vec3d.z); +diff --git a/src/main/java/net/minecraft/server/EntitySnowman.java b/src/main/java/net/minecraft/server/EntitySnowman.java +index dfe615814d..a9c44967b2 100644 +--- a/src/main/java/net/minecraft/server/EntitySnowman.java ++++ b/src/main/java/net/minecraft/server/EntitySnowman.java +@@ -13,13 +13,27 @@ public class EntitySnowman extends EntityGolem implements IShearable, IRangedEnt + public EntitySnowman(EntityTypes entitytypes, World world) { + super(entitytypes, world); + } ++ ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return world.purpurConfig.snowGolemRidable; ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return world.purpurConfig.snowGolemRidableInWater; ++ } ++ // Purpur end + + @Override + protected void initPathfinder() { ++ this.goalSelector.a(0, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); // Purpur + this.goalSelector.a(1, new PathfinderGoalArrowAttack(this, 1.25D, 20, 10.0F)); + this.goalSelector.a(2, new PathfinderGoalRandomStrollLand(this, 1.0D, 1.0000001E-5F)); + this.goalSelector.a(3, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); + this.goalSelector.a(4, new PathfinderGoalRandomLookaround(this)); ++ this.targetSelector.a(0, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); // Purpur + this.targetSelector.a(1, new PathfinderGoalNearestAttackableTarget<>(this, EntityInsentient.class, 10, true, false, (entityliving) -> { + return entityliving instanceof IMonster; + })); +@@ -71,6 +85,8 @@ public class EntitySnowman extends EntityGolem implements IShearable, IRangedEnt + return; + } + ++ if (hasRider() && !world.purpurConfig.snowGolemLeaveTrailWhenRidden) return; // Purpur - don't leave snow trail when being ridden ++ + IBlockData iblockdata = Blocks.SNOW.getBlockData(); + + for (int l = 0; l < 4; ++l) { +@@ -113,7 +129,7 @@ public class EntitySnowman extends EntityGolem implements IShearable, IRangedEnt + if (itemstack.getItem() == Items.SHEARS && this.canShear()) { + // CraftBukkit start + if (!CraftEventFactory.handlePlayerShearEntityEvent(entityhuman, this, itemstack, enumhand)) { +- return EnumInteractionResult.PASS; ++ return tryRide(entityhuman, enumhand); // Purpur + } + // CraftBukkit end + this.shear(SoundCategory.PLAYERS); +@@ -141,7 +157,7 @@ public class EntitySnowman extends EntityGolem implements IShearable, IRangedEnt + return EnumInteractionResult.SUCCESS; + // Purpur end + } else { +- return EnumInteractionResult.PASS; ++ return tryRide(entityhuman, enumhand); // Purpur + } + } + +diff --git a/src/main/java/net/minecraft/server/EntityStrider.java b/src/main/java/net/minecraft/server/EntityStrider.java +index c123e9fe97..4cb4f60fd4 100644 +--- a/src/main/java/net/minecraft/server/EntityStrider.java ++++ b/src/main/java/net/minecraft/server/EntityStrider.java +@@ -28,6 +28,18 @@ public class EntityStrider extends EntityAnimal implements ISteerable, ISaddleab + this.a(PathType.DAMAGE_FIRE, 0.0F); + } + ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return world.purpurConfig.striderRidable; ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return world.purpurConfig.striderRidableInWater; ++ } ++ // Purpur end ++ + public static boolean c(EntityTypes entitytypes, GeneratorAccess generatoraccess, EnumMobSpawn enummobspawn, BlockPosition blockposition, Random random) { + BlockPosition.MutableBlockPosition blockposition_mutableblockposition = blockposition.i(); + +@@ -89,6 +101,7 @@ public class EntityStrider extends EntityAnimal implements ISteerable, ISaddleab + @Override + protected void initPathfinder() { + this.bC = new PathfinderGoalPanic(this, 1.65D); ++ this.goalSelector.a(0, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); // Purpur + this.goalSelector.a(1, this.bC); + this.goalSelector.a(3, new PathfinderGoalBreed(this, 1.0D)); + this.bB = new PathfinderGoalTempt(this, 1.4D, false, EntityStrider.bw); +@@ -380,7 +393,7 @@ public class EntityStrider extends EntityAnimal implements ISteerable, ISaddleab + if (!enuminteractionresult.a()) { + ItemStack itemstack = entityhuman.b(enumhand); + +- return itemstack.getItem() == Items.SADDLE ? itemstack.a(entityhuman, (EntityLiving) this, enumhand) : EnumInteractionResult.PASS; ++ return itemstack.getItem() == Items.SADDLE ? itemstack.a(entityhuman, (EntityLiving) this, enumhand) : tryRide(entityhuman, enumhand); // Purpur + } else { + if (flag && !this.isSilent()) { + this.world.playSound((EntityHuman) null, this.locX(), this.locY(), this.locZ(), SoundEffects.ENTITY_STRIDER_EAT, this.getSoundCategory(), 1.0F, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F); diff --git a/src/main/java/net/minecraft/server/EntityTameableAnimal.java b/src/main/java/net/minecraft/server/EntityTameableAnimal.java index 9b0d937f06..0b0cca4e35 100644 --- a/src/main/java/net/minecraft/server/EntityTameableAnimal.java @@ -819,6 +1334,59 @@ index 9b0d937f06..0b0cca4e35 100644 public boolean j(EntityLiving entityliving) { return entityliving == this.getOwner(); } +diff --git a/src/main/java/net/minecraft/server/EntityVillager.java b/src/main/java/net/minecraft/server/EntityVillager.java +index 86de40d15b..903940feb6 100644 +--- a/src/main/java/net/minecraft/server/EntityVillager.java ++++ b/src/main/java/net/minecraft/server/EntityVillager.java +@@ -75,8 +75,19 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation + } + + // Purpur start ++ @Override ++ public boolean isRidable() { ++ return world.purpurConfig.villagerRidable; ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return world.purpurConfig.villagerRidableInWater; ++ } ++ + @Override + protected void initPathfinder() { ++ this.goalSelector.a(0, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); // Purpur + if (world.purpurConfig.villagerFollowEmeraldBlock) this.goalSelector.a(3, new PathfinderGoalTempt(this, 1.0D, false, TEMPT_ITEMS)); + } + +diff --git a/src/main/java/net/minecraft/server/EntityVillagerTrader.java b/src/main/java/net/minecraft/server/EntityVillagerTrader.java +index 9985afb124..2f59c1c91a 100644 +--- a/src/main/java/net/minecraft/server/EntityVillagerTrader.java ++++ b/src/main/java/net/minecraft/server/EntityVillagerTrader.java +@@ -23,6 +23,7 @@ public class EntityVillagerTrader extends EntityVillagerAbstract { + @Override + protected void initPathfinder() { + this.goalSelector.a(0, new PathfinderGoalFloat(this)); ++ this.goalSelector.a(0, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); // Purpur + this.goalSelector.a(0, new PathfinderGoalUseItem<>(this, PotionUtil.a(new ItemStack(Items.POTION), Potions.INVISIBILITY), SoundEffects.ENTITY_WANDERING_TRADER_DISAPPEARED, (entityvillagertrader) -> { + return !this.world.isDay() && !entityvillagertrader.isInvisible(); + })); +@@ -48,6 +49,16 @@ public class EntityVillagerTrader extends EntityVillagerAbstract { + } + + // Purpur - start ++ @Override ++ public boolean isRidable() { ++ return world.purpurConfig.villagerTraderRidable; ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return world.purpurConfig.villagerTraderRidableInWater; ++ } ++ + @Override + public boolean a(EntityHuman entityhuman) { + return world.purpurConfig.villagerTraderCanBeLeashed && !this.isLeashed(); diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java index 494d36085e..9cde3693c5 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java @@ -837,7 +1405,7 @@ index 494d36085e..9cde3693c5 100644 public static String serverModName = "Purpur"; diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 2f5bc77e03..9d6894a24c 100644 +index 2f5bc77e03..94fa8ea180 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -266,22 +266,34 @@ public class PurpurWorldConfig { @@ -912,22 +1480,86 @@ index 2f5bc77e03..9d6894a24c 100644 public boolean huskJockeyOnlyBaby = true; public double huskJockeyChance = 0.05D; public boolean huskJockeyTryExistingChickens = true; -@@ -360,6 +386,11 @@ public class PurpurWorldConfig { +@@ -355,11 +381,55 @@ public class PurpurWorldConfig { + illusionerFollowRange = getDouble("mobs.illusioner.follow-range", illusionerFollowRange); + } + ++ public boolean ironGolemRidable = false; ++ public boolean ironGolemRidableInWater = false; + public boolean ironGolemCanSwim = false; + private void ironGolemSettings() { ++ ironGolemRidable = getBoolean("mobs.iron_golem.ridable", ironGolemRidable); ++ ironGolemRidableInWater = getBoolean("mobs.iron_golem.ridable-in-water", ironGolemRidableInWater); ironGolemCanSwim = getBoolean("mobs.iron_golem.can-swim", ironGolemCanSwim); } ++ public boolean llamaRidable = false; ++ public boolean llamaRidableInWater = false; ++ private void llamaSettings() { ++ llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); ++ llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); ++ } ++ ++ public boolean llamaTraderRidable = false; ++ public boolean llamaTraderRidableInWater = false; ++ private void llamaTraderSettings() { ++ llamaTraderRidable = getBoolean("mobs.trader_llama.ridable", llamaTraderRidable); ++ llamaTraderRidableInWater = getBoolean("mobs.trader_llama.ridable-in-water", llamaTraderRidableInWater); ++ } ++ ++ public boolean mooshroomRidable = false; ++ public boolean mooshroomRidableInWater = false; ++ private void mooshroomSettings() { ++ mooshroomRidable = getBoolean("mobs.mooshroom.ridable", mooshroomRidable); ++ mooshroomRidableInWater = getBoolean("mobs.mooshroom.ridable-in-water", mooshroomRidableInWater); ++ } ++ + public boolean muleRidableInWater = false; + private void muleSettings() { + muleRidableInWater = getBoolean("mobs.mule.ridable-in-water", muleRidableInWater); + } ++ ++ public boolean ocelotRidable = false; ++ public boolean ocelotRidableInWater = false; ++ private void ocelotSettings() { ++ ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable); ++ ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater); ++ } ++ ++ public boolean pandaRidable = false; ++ public boolean pandaRidableInWater = false; ++ private void pandaSettings() { ++ pandaRidable = getBoolean("mobs.panda.ridable", pandaRidable); ++ pandaRidableInWater = getBoolean("mobs.panda.ridable-in-water", pandaRidableInWater); ++ } + public double phantomAttackedByCrystalRadius = 0.0D; public float phantomAttackedByCrystalDamage = 1.0F; public double phantomOrbitCrystalRadius = 0.0D; -@@ -413,6 +444,13 @@ public class PurpurWorldConfig { +@@ -393,8 +463,12 @@ public class PurpurWorldConfig { + phantomSpawnMaxPerAttempt = getInt("mobs.phantom.spawn.per-attempt.max", phantomSpawnMaxPerAttempt); + } + ++ public boolean pigRidable = false; ++ public boolean pigRidableInWater = false; + public boolean pigGiveSaddleBack = false; + private void pigSettings() { ++ pigRidable = getBoolean("mobs.pig.ridable", pigRidable); ++ pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); + pigGiveSaddleBack = getBoolean("mobs.pig.give-saddle-back", pigGiveSaddleBack); + } + +@@ -413,13 +487,42 @@ public class PurpurWorldConfig { rabbitNaturalKiller = getDouble("mobs.rabbit.spawn-killer-rabbit-chance", rabbitNaturalKiller); } ++ public boolean sheepRidable = false; ++ public boolean sheepRidableInWater = false; ++ private void sheepSettings() { ++ sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); ++ sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); ++ } ++ + public boolean skeletonHorseCanSwim = false; + public boolean skeletonHorseRidableInWater = true; + private void skeletonHorseSettings() { @@ -935,10 +1567,55 @@ index 2f5bc77e03..9d6894a24c 100644 + skeletonHorseRidableInWater = getBoolean("mobs.skeleton_horse.ridable-in-water", skeletonHorseRidableInWater); + } + ++ public boolean snowGolemRidable = false; ++ public boolean snowGolemRidableInWater = false; ++ public boolean snowGolemLeaveTrailWhenRidden = false; public boolean snowGolemDropsPumpkin = false; public boolean snowGolemPutPumpkinBack = false; private void snowGolemSettings() { -@@ -460,8 +498,12 @@ public class PurpurWorldConfig { ++ snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); ++ snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); ++ snowGolemLeaveTrailWhenRidden = getBoolean("mobs.snow_golem.leave-trail-when-ridden", snowGolemLeaveTrailWhenRidden); + snowGolemDropsPumpkin = getBoolean("mobs.snow_golem.drop-pumpkin-when-sheared", snowGolemDropsPumpkin); + snowGolemPutPumpkinBack = getBoolean("mobs.snow_golem.pumpkin-can-be-added-back", snowGolemPutPumpkinBack); + } + ++ public boolean striderRidable = false; ++ public boolean striderRidableInWater = false; ++ private void striderSettings() { ++ striderRidable = getBoolean("mobs.strider.ridable", striderRidable); ++ striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); ++ } ++ ++ public boolean villagerRidable = false; ++ public boolean villagerRidableInWater = false; + public int villagerBrainTicks = 1; + public boolean villagerUseBrainTicksOnlyWhenLagging = true; + public boolean villagerCanBeLeashed = false; +@@ -428,6 +531,8 @@ public class PurpurWorldConfig { + public int villagerSpawnIronGolemRadius = 0; + public int villagerSpawnIronGolemLimit = 0; + private void villagerSettings() { ++ villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); ++ villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); + villagerBrainTicks = getInt("mobs.villager.brain-ticks", villagerBrainTicks); + villagerUseBrainTicksOnlyWhenLagging = getBoolean("mobs.villager.use-brain-ticks-only-when-lagging", villagerUseBrainTicksOnlyWhenLagging); + villagerCanBeLeashed = getBoolean("mobs.villager.can-be-leashed", villagerCanBeLeashed); +@@ -437,9 +542,13 @@ public class PurpurWorldConfig { + villagerSpawnIronGolemLimit = getInt("mobs.villager.spawn-iron-golem.limit", villagerSpawnIronGolemLimit); + } + ++ public boolean villagerTraderRidable = false; ++ public boolean villagerTraderRidableInWater = false; + public boolean villagerTraderCanBeLeashed = false; + public boolean villagerTraderFollowEmeraldBlock = false; + private void villagerTraderSettings() { ++ villagerTraderRidable = getBoolean("mobs.wandering_trader.ridable", villagerTraderRidable); ++ villagerTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", villagerTraderRidableInWater); + villagerTraderCanBeLeashed = getBoolean("mobs.wandering_trader.can-be-leashed", villagerTraderCanBeLeashed); + villagerTraderFollowEmeraldBlock = getBoolean("mobs.wandering_trader.follow-emerald-blocks", villagerTraderFollowEmeraldBlock); + } +@@ -460,8 +569,12 @@ public class PurpurWorldConfig { zombieJockeyTryExistingChickens = getBoolean("mobs.zombie.jockey.try-existing-chickens", zombieJockeyTryExistingChickens); }