From 4d814c2d0b62f47151330fb0e5e6ab61fbb33206 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Wed, 8 Jul 2020 15:35:44 -0500 Subject: [PATCH] more ridables --- patches/server/0104-Ridables.patch | 548 ++++++++++++++++++++++++++++- 1 file changed, 537 insertions(+), 11 deletions(-) diff --git a/patches/server/0104-Ridables.patch b/patches/server/0104-Ridables.patch index 6f7f5d9ef..0a0d421dc 100644 --- a/patches/server/0104-Ridables.patch +++ b/patches/server/0104-Ridables.patch @@ -235,6 +235,29 @@ index 20497c3962..3ac0d7afbf 100644 } @Override +diff --git a/src/main/java/net/minecraft/server/EntityCaveSpider.java b/src/main/java/net/minecraft/server/EntityCaveSpider.java +index 346b77083c..eca1cbd7f7 100644 +--- a/src/main/java/net/minecraft/server/EntityCaveSpider.java ++++ b/src/main/java/net/minecraft/server/EntityCaveSpider.java +@@ -8,6 +8,18 @@ public class EntityCaveSpider extends EntitySpider { + super(entitytypes, world); + } + ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return world.purpurConfig.caveSpiderRidable; ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return world.purpurConfig.caveSpiderRidableInWater; ++ } ++ // Purpur end ++ + public static AttributeProvider.Builder m() { + return EntitySpider.eL().a(GenericAttributes.MAX_HEALTH, 12.0D); + } diff --git a/src/main/java/net/minecraft/server/EntityChicken.java b/src/main/java/net/minecraft/server/EntityChicken.java index fa97552bb4..3a1d0a2f23 100644 --- a/src/main/java/net/minecraft/server/EntityChicken.java @@ -370,6 +393,132 @@ index d6baddb9d3..db15c65ce6 100644 } this.world.addEntity(mooshroom); this.die(); +diff --git a/src/main/java/net/minecraft/server/EntityDrowned.java b/src/main/java/net/minecraft/server/EntityDrowned.java +index 455b1d9225..46b08e9813 100644 +--- a/src/main/java/net/minecraft/server/EntityDrowned.java ++++ b/src/main/java/net/minecraft/server/EntityDrowned.java +@@ -19,6 +19,18 @@ public class EntityDrowned extends EntityZombie implements IRangedEntity { + this.navigationLand = new Navigation(this, world); + } + ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return world.purpurConfig.drownedRidable; ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return world.purpurConfig.drownedRidableInWater; ++ } ++ // Purpur end ++ + @Override + protected void m() { + this.goalSelector.a(1, new EntityDrowned.c(this, 1.0D)); +@@ -217,7 +229,7 @@ public class EntityDrowned extends EntityZombie implements IRangedEntity { + this.d = flag; + } + +- static class d extends ControllerMove { ++ static class d extends net.pl3x.purpur.controller.ControllerMoveWASD { // Purpur + + private final EntityDrowned i; + +@@ -227,7 +239,7 @@ public class EntityDrowned extends EntityZombie implements IRangedEntity { + } + + @Override +- public void a() { ++ public void tick() { // Purpur + EntityLiving entityliving = this.i.getGoalTarget(); + + if (this.i.eX() && this.i.isInWater()) { +@@ -260,7 +272,7 @@ public class EntityDrowned extends EntityZombie implements IRangedEntity { + this.i.setMot(this.i.getMot().add(0.0D, -0.008D, 0.0D)); + } + +- super.a(); ++ super.tick(); // Purpur + } + + } +@@ -399,6 +411,7 @@ public class EntityDrowned extends EntityZombie implements IRangedEntity { + this.a = entitydrowned; + this.b = d0; + this.c = i; ++ this.a(EnumSet.of(PathfinderGoal.Type.MOVE)); // Purpur - swim up + } + + @Override +diff --git a/src/main/java/net/minecraft/server/EntityEnderman.java b/src/main/java/net/minecraft/server/EntityEnderman.java +index 245fc38def..a629a6caec 100644 +--- a/src/main/java/net/minecraft/server/EntityEnderman.java ++++ b/src/main/java/net/minecraft/server/EntityEnderman.java +@@ -30,9 +30,22 @@ public class EntityEnderman extends EntityMonster implements IEntityAngerable { + this.a(PathType.WATER, -1.0F); + } + ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return world.purpurConfig.endermanRidable; ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return world.purpurConfig.endermanRidableInWater; ++ } ++ // 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 EntityEnderman.a(this)); + this.goalSelector.a(2, new PathfinderGoalMeleeAttack(this, 1.0D, false)); + this.goalSelector.a(7, new PathfinderGoalRandomStrollLand(this, 1.0D, 0.0F)); +@@ -40,6 +53,7 @@ public class EntityEnderman extends EntityMonster implements IEntityAngerable { + this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this)); + this.goalSelector.a(10, new EntityEnderman.PathfinderGoalEndermanPlaceBlock(this)); + this.goalSelector.a(11, new EntityEnderman.PathfinderGoalEndermanPickupBlock(this)); ++ this.targetSelector.a(0, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); // Purpur + this.targetSelector.a(1, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, 10, true, false, this::b)); + this.targetSelector.a(2, new EntityEnderman.PathfinderGoalPlayerWhoLookedAtTarget(this)); + this.targetSelector.a(3, new PathfinderGoalHurtByTarget(this, new Class[0])); +@@ -221,7 +235,7 @@ public class EntityEnderman extends EntityMonster implements IEntityAngerable { + + @Override + protected void mobTick() { +- if (this.world.isDay() && this.ticksLived >= this.bz + 600) { ++ if (!hasRider() && this.world.isDay() && this.ticksLived >= this.bz + 600) { // Purpur - no random teleporting + float f = this.aO(); + + if (f > 0.5F && this.world.f(this.getChunkCoordinates()) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && this.tryEscape(EndermanEscapeEvent.Reason.RUNAWAY)) { // Paper +@@ -322,6 +336,7 @@ public class EntityEnderman extends EntityMonster implements IEntityAngerable { + public boolean damageEntity(DamageSource damagesource, float f) { + if (this.isInvulnerable(damagesource)) { + return false; ++ } else if (hasRider()) { return super.damageEntity(damagesource, f); // Purpur - no teleporting on damage + } else if (damagesource instanceof EntityDamageSourceIndirect) { + if (this.tryEscape(EndermanEscapeEvent.Reason.INDIRECT)) { // Paper start + for (int i = 0; i < 64; ++i) { +@@ -366,6 +381,7 @@ public class EntityEnderman extends EntityMonster implements IEntityAngerable { + + public PathfinderGoalEndermanPickupBlock(EntityEnderman entityenderman) { + this.enderman = entityenderman; ++ this.a(EnumSet.of(PathfinderGoal.Type.TARGET)); // Purpur + } + + @Override +@@ -410,6 +426,7 @@ public class EntityEnderman extends EntityMonster implements IEntityAngerable { + + public PathfinderGoalEndermanPlaceBlock(EntityEnderman entityenderman) { + this.a = entityenderman; ++ this.a(EnumSet.of(PathfinderGoal.Type.TARGET)); // Purpur + } + + @Override diff --git a/src/main/java/net/minecraft/server/EntityFox.java b/src/main/java/net/minecraft/server/EntityFox.java index 90b01adbec..26de8c3ad6 100644 --- a/src/main/java/net/minecraft/server/EntityFox.java @@ -1160,6 +1309,134 @@ index cf2df391a9..9bd4cdf138 100644 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/EntityPigZombie.java b/src/main/java/net/minecraft/server/EntityPigZombie.java +index 39bfb227e9..ea0e6028db 100644 +--- a/src/main/java/net/minecraft/server/EntityPigZombie.java ++++ b/src/main/java/net/minecraft/server/EntityPigZombie.java +@@ -21,6 +21,18 @@ public class EntityPigZombie extends EntityZombie implements IEntityAngerable { + this.a(PathType.LAVA, 8.0F); + } + ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return world.purpurConfig.zombifiedPiglinRidable; ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return world.purpurConfig.zombifiedPiglinRidableInWater; ++ } ++ // Purpur end ++ + @Override + public void setAngerTarget(@Nullable UUID uuid) { + this.by = uuid; +diff --git a/src/main/java/net/minecraft/server/EntityPiglin.java b/src/main/java/net/minecraft/server/EntityPiglin.java +index 63fa1581eb..6b3218e209 100644 +--- a/src/main/java/net/minecraft/server/EntityPiglin.java ++++ b/src/main/java/net/minecraft/server/EntityPiglin.java +@@ -31,6 +31,24 @@ public class EntityPiglin extends EntityMonster implements ICrossbow { + this.a(PathType.DAMAGE_FIRE, -1.0F); + } + ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return world.purpurConfig.piglinRidable; ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return world.purpurConfig.piglinRidableInWater; ++ } ++ ++ @Override ++ protected void initPathfinder() { ++ this.goalSelector.a(0, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); ++ this.targetSelector.a(0, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); ++ } ++ // Purpur end ++ + @Override + public void saveData(NBTTagCompound nbttagcompound) { + super.saveData(nbttagcompound); +diff --git a/src/main/java/net/minecraft/server/EntityPolarBear.java b/src/main/java/net/minecraft/server/EntityPolarBear.java +index 6506e00557..05e5fb07a7 100644 +--- a/src/main/java/net/minecraft/server/EntityPolarBear.java ++++ b/src/main/java/net/minecraft/server/EntityPolarBear.java +@@ -16,11 +16,35 @@ public class EntityPolarBear extends EntityAnimal implements IEntityAngerable { + private static final IntRange bz = TimeRange.a(20, 39); + private int bA; + private UUID bB; ++ private int standTimer = 0; // Purpur + + public EntityPolarBear(EntityTypes entitytypes, World world) { + super(entitytypes, world); + } + ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return world.purpurConfig.polarBearRidable; ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return world.purpurConfig.polarBearRidableInWater; ++ } ++ ++ @Override ++ public boolean onSpacebar() { ++ if (!isStanding()) { ++ if (hasRider() && getRider().getForward() == 0 && getRider().getStrafe() == 0) { ++ setStanding(true); ++ playSound(SoundEffects.ENTITY_POLAR_BEAR_WARNING, 1.0F, 1.0F); ++ } ++ } ++ return false; ++ } ++ // Purpur end ++ + @Override + public EntityAgeable createChild(EntityAgeable entityageable) { + return (EntityAgeable) EntityTypes.POLAR_BEAR.a(this.world); +@@ -59,6 +83,7 @@ public class EntityPolarBear extends EntityAnimal implements IEntityAngerable { + protected void initPathfinder() { + super.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 EntityPolarBear.c()); + this.goalSelector.a(1, new EntityPolarBear.d()); + // Purpur start +@@ -71,6 +96,7 @@ public class EntityPolarBear extends EntityAnimal implements IEntityAngerable { + this.goalSelector.a(5, new PathfinderGoalRandomStroll(this, 1.0D)); + this.goalSelector.a(6, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); + this.goalSelector.a(7, new PathfinderGoalRandomLookaround(this)); ++ this.targetSelector.a(0, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); // Purpur + this.targetSelector.a(1, new EntityPolarBear.b()); + this.targetSelector.a(2, new EntityPolarBear.a()); + this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, 10, true, false, this::b)); +@@ -183,6 +209,11 @@ public class EntityPolarBear extends EntityAnimal implements IEntityAngerable { + this.a((WorldServer) this.world, true); + } + ++ // Purpur start ++ if (isStanding() && --standTimer <= 0) { ++ setStanding(false); ++ } ++ // Purpur end + } + + @Override +@@ -215,6 +246,7 @@ public class EntityPolarBear extends EntityAnimal implements IEntityAngerable { + + public void setStanding(boolean standing) { t(standing); } // Purpur - OBFHELPER + public void t(boolean flag) { ++ standTimer = flag ? 20 : -1; // Purpur + this.datawatcher.set(EntityPolarBear.bv, flag); + } + 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 @@ -1282,6 +1559,39 @@ index dfe615814d..a9c44967b2 100644 } } +diff --git a/src/main/java/net/minecraft/server/EntitySpider.java b/src/main/java/net/minecraft/server/EntitySpider.java +index f6a6772002..be1189d57c 100644 +--- a/src/main/java/net/minecraft/server/EntitySpider.java ++++ b/src/main/java/net/minecraft/server/EntitySpider.java +@@ -11,14 +11,28 @@ public class EntitySpider extends EntityMonster { + super(entitytypes, world); + } + ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return world.purpurConfig.spiderRidable; ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return world.purpurConfig.spiderRidableInWater; ++ } ++ // Purpur end ++ + @Override + protected void initPathfinder() { + this.goalSelector.a(1, new PathfinderGoalFloat(this)); ++ this.goalSelector.a(1, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); // Purpur + this.goalSelector.a(3, new PathfinderGoalLeapAtTarget(this, 0.4F)); + this.goalSelector.a(4, new EntitySpider.PathfinderGoalSpiderMeleeAttack(this)); + this.goalSelector.a(5, new PathfinderGoalRandomStrollLand(this, 0.8D)); + this.goalSelector.a(6, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 8.0F)); + this.goalSelector.a(6, new PathfinderGoalRandomLookaround(this)); ++ this.targetSelector.a(0, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); // Purpur + this.targetSelector.a(1, new PathfinderGoalHurtByTarget(this, new Class[0])); + this.targetSelector.a(2, new EntitySpider.PathfinderGoalSpiderNearestAttackableTarget<>(this, EntityHuman.class)); + this.targetSelector.a(3, new EntitySpider.PathfinderGoalSpiderNearestAttackableTarget<>(this, EntityIronGolem.class)); 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 @@ -1387,6 +1697,120 @@ index 9985afb124..2f59c1c91a 100644 @Override public boolean a(EntityHuman entityhuman) { return world.purpurConfig.villagerTraderCanBeLeashed && !this.isLeashed(); +diff --git a/src/main/java/net/minecraft/server/EntityWolf.java b/src/main/java/net/minecraft/server/EntityWolf.java +index 5b519fa394..927d308254 100644 +--- a/src/main/java/net/minecraft/server/EntityWolf.java ++++ b/src/main/java/net/minecraft/server/EntityWolf.java +@@ -33,9 +33,27 @@ public class EntityWolf extends EntityTameableAnimal implements IEntityAngerable + this.setTamed(false); + } + ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return world.purpurConfig.wolfRidable; ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return world.purpurConfig.wolfRidableInWater; ++ } ++ ++ public void onMount(EntityHuman entityhuman) { ++ super.onMount(entityhuman); ++ setSitting(false); ++ } ++ // Purpur end ++ + @Override + protected void initPathfinder() { + this.goalSelector.a(1, new PathfinderGoalFloat(this)); ++ this.goalSelector.a(1, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); // Purpur + this.goalSelector.a(2, new PathfinderGoalSit(this)); + this.goalSelector.a(3, new EntityWolf.a<>(this, EntityLlama.class, 24.0F, 1.5D, 1.5D)); + this.goalSelector.a(4, new PathfinderGoalLeapAtTarget(this, 0.4F)); +@@ -46,6 +64,7 @@ public class EntityWolf extends EntityTameableAnimal implements IEntityAngerable + this.goalSelector.a(9, new PathfinderGoalBeg(this, 8.0F)); + this.goalSelector.a(10, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 8.0F)); + this.goalSelector.a(10, new PathfinderGoalRandomLookaround(this)); ++ this.targetSelector.a(0, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); // Purpur + this.targetSelector.a(1, new PathfinderGoalOwnerHurtByTarget(this)); + this.targetSelector.a(2, new PathfinderGoalOwnerHurtTarget(this)); + this.targetSelector.a(3, (new PathfinderGoalHurtByTarget(this, new Class[0])).a(new Class[0])); // CraftBukkit - decompile error +diff --git a/src/main/java/net/minecraft/server/EntityZombie.java b/src/main/java/net/minecraft/server/EntityZombie.java +index 307a208602..f32814a0bd 100644 +--- a/src/main/java/net/minecraft/server/EntityZombie.java ++++ b/src/main/java/net/minecraft/server/EntityZombie.java +@@ -45,11 +45,25 @@ public class EntityZombie extends EntityMonster { + this(EntityTypes.ZOMBIE, world); + } + ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return world.purpurConfig.zombieRidable; ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return world.purpurConfig.zombieRidableInWater; ++ } ++ // Purpur end ++ + @Override + protected void initPathfinder() { ++ this.goalSelector.a(0, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); // Purpur + if (world.purpurConfig.zombieTargetTurtleEggs) this.goalSelector.a(4, new EntityZombie.a(this, 1.0D, 3)); // Purpur + this.goalSelector.a(8, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 8.0F)); + this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this)); ++ this.targetSelector.a(0, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); // Purpur + this.m(); + } + +diff --git a/src/main/java/net/minecraft/server/EntityZombieHusk.java b/src/main/java/net/minecraft/server/EntityZombieHusk.java +index 2daff85620..1130a7712d 100644 +--- a/src/main/java/net/minecraft/server/EntityZombieHusk.java ++++ b/src/main/java/net/minecraft/server/EntityZombieHusk.java +@@ -9,6 +9,16 @@ public class EntityZombieHusk extends EntityZombie { + } + + // Purpur start ++ @Override ++ public boolean isRidable() { ++ return world.purpurConfig.huskRidable; ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return world.purpurConfig.huskRidableInWater; ++ } ++ + @Override + public boolean jockeyOnlyBaby() { + return world.purpurConfig.huskJockeyOnlyBaby; +diff --git a/src/main/java/net/minecraft/server/EntityZombieVillager.java b/src/main/java/net/minecraft/server/EntityZombieVillager.java +index 68fca8a8d7..abb40c89de 100644 +--- a/src/main/java/net/minecraft/server/EntityZombieVillager.java ++++ b/src/main/java/net/minecraft/server/EntityZombieVillager.java +@@ -27,6 +27,18 @@ public class EntityZombieVillager extends EntityZombie implements VillagerDataHo + this.setVillagerData(this.getVillagerData().withProfession((VillagerProfession) IRegistry.VILLAGER_PROFESSION.a(this.random))); + } + ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return world.purpurConfig.zombieVillagerRidable; ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return world.purpurConfig.zombieVillagerRidableInWater; ++ } ++ // Purpur end ++ + @Override + protected void initDatawatcher() { + super.initDatawatcher(); 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 @@ -1405,10 +1829,10 @@ 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..94fa8ea180 100644 +index 2f5bc77e03..69f895ca9e 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 { +@@ -266,22 +266,41 @@ public class PurpurWorldConfig { turtleEggsBreakFromMinecarts = getBoolean("blocks.turtle_egg.break-from-minecarts", turtleEggsBreakFromMinecarts); } @@ -1425,6 +1849,13 @@ index 2f5bc77e03..94fa8ea180 100644 catSpawnVillageScanRange = getInt("mobs.cat.scan-range-for-other-cats.village", catSpawnVillageScanRange); } ++ public boolean caveSpiderRidable = false; ++ public boolean caveSpiderRidableInWater = false; ++ private void caveSpiderSettings() { ++ caveSpiderRidable = getBoolean("mobs.cave_spider.ridable", caveSpiderRidable); ++ caveSpiderRidableInWater = getBoolean("mobs.cave_spider.ridable-in-water", caveSpiderRidableInWater); ++ } ++ + public boolean chickenRidable = false; + public boolean chickenRidableInWater = false; public boolean chickenRetaliate = false; @@ -1443,7 +1874,7 @@ index 2f5bc77e03..94fa8ea180 100644 cowFeedMushrooms = getInt("mobs.cow.feed-mushrooms-for-mooshroom", cowFeedMushrooms); } -@@ -292,6 +304,11 @@ public class PurpurWorldConfig { +@@ -292,10 +311,19 @@ public class PurpurWorldConfig { creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); } @@ -1452,10 +1883,27 @@ index 2f5bc77e03..94fa8ea180 100644 + donkeyRidableInWater = getBoolean("mobs.donkey.ridable-in-water", donkeyRidableInWater); + } + ++ public boolean drownedRidable = false; ++ public boolean drownedRidableInWater = false; public boolean drownedJockeyOnlyBaby = true; public double drownedJockeyChance = 0.05D; public boolean drownedJockeyTryExistingChickens = true; -@@ -315,8 +332,12 @@ public class PurpurWorldConfig { + private void drownedSettings() { ++ drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); ++ drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); + drownedJockeyOnlyBaby = getBoolean("mobs.drowned.jockey.only-babies", drownedJockeyOnlyBaby); + drownedJockeyChance = getDouble("mobs.drowned.jockey.chance", drownedJockeyChance); + drownedJockeyTryExistingChickens = getBoolean("mobs.drowned.jockey.try-existing-chickens", drownedJockeyTryExistingChickens); +@@ -310,13 +338,21 @@ public class PurpurWorldConfig { + enderDragonMaxHealth = getDouble("mobs.ender_dragon.max-health", enderDragonMaxHealth); + } + ++ public boolean endermanRidable = false; ++ public boolean endermanRidableInWater = false; + public boolean endermanAllowGriefing = true; + private void endermanSettings() { ++ endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); ++ endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); endermanAllowGriefing = getBoolean("mobs.enderman.allow-griefing", endermanAllowGriefing); } @@ -1468,7 +1916,7 @@ index 2f5bc77e03..94fa8ea180 100644 foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); } -@@ -337,6 +358,11 @@ public class PurpurWorldConfig { +@@ -337,10 +373,19 @@ public class PurpurWorldConfig { giantHaveHostileAI = getBoolean("mobs.giant.have-hostile-ai", giantHaveHostileAI); } @@ -1477,10 +1925,18 @@ index 2f5bc77e03..94fa8ea180 100644 + horseRidableInWater = getBoolean("mobs.horse.ridable-in-water", horseRidableInWater); + } + ++ public boolean huskRidable = false; ++ public boolean huskRidableInWater = false; public boolean huskJockeyOnlyBaby = true; public double huskJockeyChance = 0.05D; public boolean huskJockeyTryExistingChickens = true; -@@ -355,11 +381,55 @@ public class PurpurWorldConfig { + private void huskSettings() { ++ huskRidable = getBoolean("mobs.husk.ridable", huskRidable); ++ huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); + huskJockeyOnlyBaby = getBoolean("mobs.husk.jockey.only-babies", huskJockeyOnlyBaby); + huskJockeyChance = getDouble("mobs.husk.jockey.chance", huskJockeyChance); + huskJockeyTryExistingChickens = getBoolean("mobs.husk.jockey.try-existing-chickens", huskJockeyTryExistingChickens); +@@ -355,11 +400,55 @@ public class PurpurWorldConfig { illusionerFollowRange = getDouble("mobs.illusioner.follow-range", illusionerFollowRange); } @@ -1536,7 +1992,7 @@ index 2f5bc77e03..94fa8ea180 100644 public double phantomAttackedByCrystalRadius = 0.0D; public float phantomAttackedByCrystalDamage = 1.0F; public double phantomOrbitCrystalRadius = 0.0D; -@@ -393,8 +463,12 @@ public class PurpurWorldConfig { +@@ -393,14 +482,29 @@ public class PurpurWorldConfig { phantomSpawnMaxPerAttempt = getInt("mobs.phantom.spawn.per-attempt.max", phantomSpawnMaxPerAttempt); } @@ -1549,7 +2005,24 @@ index 2f5bc77e03..94fa8ea180 100644 pigGiveSaddleBack = getBoolean("mobs.pig.give-saddle-back", pigGiveSaddleBack); } -@@ -413,13 +487,42 @@ public class PurpurWorldConfig { ++ public boolean piglinRidable = false; ++ public boolean piglinRidableInWater = false; ++ private void piglinSettings() { ++ piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); ++ piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); ++ } ++ ++ public boolean polarBearRidable = false; ++ public boolean polarBearRidableInWater = false; + public String polarBearBreedableItemString = ""; + public Item polarBearBreedableItem = null; + private void polarBearSettings() { ++ polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); ++ polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); + polarBearBreedableItemString = getString("mobs.polar_bear.breedable-item", polarBearBreedableItemString); + Item item = IRegistry.ITEM.get(new MinecraftKey(polarBearBreedableItemString)); + if (item != Items.AIR) polarBearBreedableItem = item; +@@ -413,13 +517,49 @@ public class PurpurWorldConfig { rabbitNaturalKiller = getDouble("mobs.rabbit.spawn-killer-rabbit-chance", rabbitNaturalKiller); } @@ -1580,6 +2053,13 @@ index 2f5bc77e03..94fa8ea180 100644 snowGolemPutPumpkinBack = getBoolean("mobs.snow_golem.pumpkin-can-be-added-back", snowGolemPutPumpkinBack); } ++ public boolean spiderRidable = false; ++ public boolean spiderRidableInWater = false; ++ private void spiderSettings() { ++ spiderRidable = getBoolean("mobs.spider.ridable", spiderRidable); ++ spiderRidableInWater = getBoolean("mobs.spider.ridable-in-water", spiderRidableInWater); ++ } ++ + public boolean striderRidable = false; + public boolean striderRidableInWater = false; + private void striderSettings() { @@ -1592,7 +2072,7 @@ index 2f5bc77e03..94fa8ea180 100644 public int villagerBrainTicks = 1; public boolean villagerUseBrainTicksOnlyWhenLagging = true; public boolean villagerCanBeLeashed = false; -@@ -428,6 +531,8 @@ public class PurpurWorldConfig { +@@ -428,6 +568,8 @@ public class PurpurWorldConfig { public int villagerSpawnIronGolemRadius = 0; public int villagerSpawnIronGolemLimit = 0; private void villagerSettings() { @@ -1601,7 +2081,7 @@ index 2f5bc77e03..94fa8ea180 100644 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 { +@@ -437,9 +579,13 @@ public class PurpurWorldConfig { villagerSpawnIronGolemLimit = getInt("mobs.villager.spawn-iron-golem.limit", villagerSpawnIronGolemLimit); } @@ -1615,7 +2095,29 @@ index 2f5bc77e03..94fa8ea180 100644 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 { +@@ -449,35 +595,58 @@ public class PurpurWorldConfig { + witherSkeletonTakesWitherDamage = getBoolean("mobs.wither_skeleton.takes-wither-damage", witherSkeletonTakesWitherDamage); + } + ++ public boolean wolfRidable = false; ++ public boolean wolfRidableInWater = false; ++ private void wolfSettings() { ++ wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); ++ wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater); ++ } ++ ++ public boolean zombieRidable = false; ++ public boolean zombieRidableInWater = false; + public boolean zombieTargetTurtleEggs = true; + public boolean zombieJockeyOnlyBaby = true; + public double zombieJockeyChance = 0.05D; + public boolean zombieJockeyTryExistingChickens = true; + private void zombieSettings() { ++ zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); ++ zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); + zombieTargetTurtleEggs = getBoolean("mobs.zombie.target-turtle-eggs", zombieTargetTurtleEggs); + zombieJockeyOnlyBaby = getBoolean("mobs.zombie.jockey.only-babies", zombieJockeyOnlyBaby); + zombieJockeyChance = getDouble("mobs.zombie.jockey.chance", zombieJockeyChance); zombieJockeyTryExistingChickens = getBoolean("mobs.zombie.jockey.try-existing-chickens", zombieJockeyTryExistingChickens); } @@ -1628,6 +2130,30 @@ index 2f5bc77e03..94fa8ea180 100644 zombieHorseSpawnChance = getDouble("mobs.zombie_horse.spawn-chance", zombieHorseSpawnChance); } ++ public boolean zombifiedPiglinRidable = false; ++ public boolean zombifiedPiglinRidableInWater = false; + public boolean zombifiedPiglinJockeyOnlyBaby = true; + public double zombifiedPiglinJockeyChance = 0.05D; + public boolean zombifiedPiglinJockeyTryExistingChickens = true; + private void zombifiedPiglinSettings() { ++ zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); ++ zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); + zombifiedPiglinJockeyOnlyBaby = getBoolean("mobs.zombified_piglin.jockey.only-babies", zombifiedPiglinJockeyOnlyBaby); + zombifiedPiglinJockeyChance = getDouble("mobs.zombified_piglin.jockey.chance", zombifiedPiglinJockeyChance); + zombifiedPiglinJockeyTryExistingChickens = getBoolean("mobs.zombified_piglin.jockey.try-existing-chickens", zombifiedPiglinJockeyTryExistingChickens); + } + ++ public boolean zombieVillagerRidable = false; ++ public boolean zombieVillagerRidableInWater = false; + public boolean zombieVillagerJockeyOnlyBaby = true; + public double zombieVillagerJockeyChance = 0.05D; + public boolean zombieVillagerJockeyTryExistingChickens = true; + private void zombieVillagerSettings() { ++ zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); ++ zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); + zombieVillagerJockeyOnlyBaby = getBoolean("mobs.zombie_villager.jockey.only-babies", zombieVillagerJockeyOnlyBaby); + zombieVillagerJockeyChance = getDouble("mobs.zombie_villager.jockey.chance", zombieVillagerJockeyChance); + zombieVillagerJockeyTryExistingChickens = getBoolean("mobs.zombie_villager.jockey.try-existing-chickens", zombieVillagerJockeyTryExistingChickens); diff --git a/src/main/java/net/pl3x/purpur/controller/ControllerLookWASD.java b/src/main/java/net/pl3x/purpur/controller/ControllerLookWASD.java new file mode 100644 index 0000000000..828e1b8730