diff --git a/patches/server/0002-Purpur-config-files.patch b/patches/server/0002-Purpur-config-files.patch index f8f446e3f..37c264a95 100644 --- a/patches/server/0002-Purpur-config-files.patch +++ b/patches/server/0002-Purpur-config-files.patch @@ -460,7 +460,7 @@ index 0000000000000000000000000000000000000000..2b7f1dedb3289efc7e42a138f4483f49 +} diff --git a/src/main/java/org/purpurmc/purpur/command/PurpurCommand.java b/src/main/java/org/purpurmc/purpur/command/PurpurCommand.java new file mode 100644 -index 0000000000000000000000000000000000000000..afdf04f8b22ad0b7c0b41675e44687b49c2f86d6 +index 0000000000000000000000000000000000000000..173b6bba1c8eb4c6c6ab55cad478db7c4c91fd75 --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/command/PurpurCommand.java @@ -0,0 +1,65 @@ @@ -514,7 +514,7 @@ index 0000000000000000000000000000000000000000..afdf04f8b22ad0b7c0b41675e44687b4 + MinecraftServer console = MinecraftServer.getServer(); + PurpurConfig.init((File) console.options.valueOf("purpur-settings")); + for (ServerLevel level : console.getAllLevels()) { -+ level.purpurConfig.init(); ++ level().purpurConfig.init(); + } + console.server.reloadCount++; + diff --git a/patches/server/0009-Ridables.patch b/patches/server/0006-Ridables.patch similarity index 85% rename from patches/server/0009-Ridables.patch rename to patches/server/0006-Ridables.patch index eae7b5d02..ebe372f5e 100644 --- a/patches/server/0009-Ridables.patch +++ b/patches/server/0006-Ridables.patch @@ -46,7 +46,7 @@ index 42d5b4ffc51da90a8f3bbec84e44ac2b0cb7b5ee..9168a02ede5b2fc924dbcf0063109f8e final Throwable thr = new Throwable(entity + " Added to world at " + new java.util.Date()); io.papermc.paper.util.StacktraceDeobfuscator.INSTANCE.deobfuscateThrowable(thr); diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 15539499b5a0f16ad2d44c39c5b824876fdf0951..dfdc50093e5d4b60438acfc12ab9f14255fa7a99 100644 +index 15539499b5a0f16ad2d44c39c5b824876fdf0951..d33eb475a41791b298c3300a14cf2af17e200c6c 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -751,6 +751,15 @@ public class ServerPlayer extends Player { @@ -55,7 +55,7 @@ index 15539499b5a0f16ad2d44c39c5b824876fdf0951..dfdc50093e5d4b60438acfc12ab9f142 this.advancements.flushDirty(this); + + // Purpur start -+ if (this.level.purpurConfig.useNightVisionWhenRiding && this.getVehicle() != null && this.getVehicle().getRider() == this && this.level.getGameTime() % 100 == 0) { // 5 seconds ++ if (this.level().purpurConfig.useNightVisionWhenRiding && this.getVehicle() != null && this.getVehicle().getRider() == this && this.level.getGameTime() % 100 == 0) { // 5 seconds + MobEffectInstance nightVision = this.getEffect(MobEffects.NIGHT_VISION); + if (nightVision == null || nightVision.getDuration() <= 300) { // 15 seconds + this.addEffect(new MobEffectInstance(MobEffects.NIGHT_VISION, 400, 0)); // 20 seconds @@ -79,7 +79,7 @@ index 67a71b0d04cc3c8239dce26c7022b18a6ff3a58c..a419308c2d71bf0e228aa7c591deb76c if ((entity instanceof Bucketable && entity instanceof LivingEntity && origItem != null && origItem.asItem() == Items.WATER_BUCKET) && (event.isCancelled() || ServerGamePacketListenerImpl.this.player.getInventory().getSelected() == null || ServerGamePacketListenerImpl.this.player.getInventory().getSelected().getItem() != origItem)) { entity.getEntityData().resendPossiblyDesyncedEntity(player); // Paper - The entire mob gets deleted, so resend it. diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 05c3985cddae94e26fb70657c1add2f87bff8080..9b692140796eb5296a0478fd18d9b33278be6f5d 100644 +index cf68705a5cfde9a1e5e3161c73e6308354e01043..23bc033aad04fc73a211e9b304cf6d49bce59c4e 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -363,7 +363,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -167,23 +167,23 @@ index 05c3985cddae94e26fb70657c1add2f87bff8080..9b692140796eb5296a0478fd18d9b332 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/GlowSquid.java b/src/main/java/net/minecraft/world/entity/GlowSquid.java -index 213f89b22650f43daaec01e7c301e3e8a7e98684..aa155ec559e748c9bbb6ccddaa278ea6bba7ac63 100644 +index 759713f7c646aaf1a918c87a2834a1d405385dad..c6a06e07f0b4bb29b5f4c70dfa53ff6db2e4e6ea 100644 --- a/src/main/java/net/minecraft/world/entity/GlowSquid.java +++ b/src/main/java/net/minecraft/world/entity/GlowSquid.java -@@ -28,6 +28,19 @@ public class GlowSquid extends Squid { - this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.glowSquidMaxHealth); +@@ -23,6 +23,19 @@ public class GlowSquid extends Squid { + super(type, world); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.glowSquidRidable; ++ return level().purpurConfig.glowSquidRidable; + } + + + @Override + public boolean isControllable() { -+ return level.purpurConfig.glowSquidControllable; ++ return level().purpurConfig.glowSquidControllable; + } + // Purpur end + @@ -191,7 +191,7 @@ index 213f89b22650f43daaec01e7c301e3e8a7e98684..aa155ec559e748c9bbb6ccddaa278ea6 protected ParticleOptions getInkParticle() { return ParticleTypes.GLOW_SQUID_INK; diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 91309d12ae4a1157d507062b27147cdcc4053658..9d9cb6e697c4f09badc3ca121f2ef987900d65a8 100644 +index a6d730eaee1df1c5c61aa0f8731b8c055080a9a6..218eaf5f18162422b3376335e32f25d03c0655ec 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -220,9 +220,9 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -213,10 +213,10 @@ index 91309d12ae4a1157d507062b27147cdcc4053658..9d9cb6e697c4f09badc3ca121f2ef987 this.lastClimbablePos = Optional.empty(); - this.attributes = new AttributeMap(DefaultAttributes.getSupplier(type)); + this.attributes = new AttributeMap(DefaultAttributes.getSupplier(type), this); // Purpur - this.initAttributes(); // Purpur this.craftAttributes = new CraftAttributeMap(this.attributes); // CraftBukkit // CraftBukkit - setHealth(getMaxHealth()) inlined and simplified to skip the instanceof check for EntityPlayer, as getBukkitEntity() is not initialized in constructor -@@ -342,6 +342,7 @@ public abstract class LivingEntity extends Entity implements Attackable { + this.entityData.set(LivingEntity.DATA_HEALTH_ID, (float) this.getAttribute(Attributes.MAX_HEALTH).getValue()); +@@ -339,6 +339,7 @@ public abstract class LivingEntity extends Entity implements Attackable { public static AttributeSupplier.Builder createLivingAttributes() { return AttributeSupplier.builder().add(Attributes.MAX_HEALTH).add(Attributes.KNOCKBACK_RESISTANCE).add(Attributes.MOVEMENT_SPEED).add(Attributes.ARMOR).add(Attributes.ARMOR_TOUGHNESS); } @@ -224,7 +224,7 @@ index 91309d12ae4a1157d507062b27147cdcc4053658..9d9cb6e697c4f09badc3ca121f2ef987 @Override protected void checkFallDamage(double heightDifference, boolean onGround, BlockState state, BlockPos landedPosition) { -@@ -2674,7 +2675,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2671,7 +2672,7 @@ public abstract class LivingEntity extends Entity implements Attackable { } protected long lastJumpTime = 0L; // Paper @@ -233,7 +233,7 @@ index 91309d12ae4a1157d507062b27147cdcc4053658..9d9cb6e697c4f09badc3ca121f2ef987 Vec3 vec3d = this.getDeltaMovement(); // Paper start long time = System.nanoTime(); -@@ -3446,8 +3447,10 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3443,8 +3444,10 @@ public abstract class LivingEntity extends Entity implements Attackable { this.pushEntities(); this.level().getProfiler().pop(); // Paper start @@ -246,7 +246,7 @@ index 91309d12ae4a1157d507062b27147cdcc4053658..9d9cb6e697c4f09badc3ca121f2ef987 Location from = new Location(this.level().getWorld(), this.xo, this.yo, this.zo, this.yRotO, this.xRotO); Location to = new Location (this.level().getWorld(), this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); io.papermc.paper.event.entity.EntityMoveEvent event = new io.papermc.paper.event.entity.EntityMoveEvent(this.getBukkitLivingEntity(), from, to.clone()); -@@ -3457,6 +3460,21 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3454,6 +3457,21 @@ public abstract class LivingEntity extends Entity implements Attackable { this.absMoveTo(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ(), event.getTo().getYaw(), event.getTo().getPitch()); } } @@ -269,7 +269,7 @@ index 91309d12ae4a1157d507062b27147cdcc4053658..9d9cb6e697c4f09badc3ca121f2ef987 // Paper end if (!this.level().isClientSide && this.isSensitiveToWater() && this.isInWaterRainOrBubble()) { diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index e2a25c29ec74147b3e66aa0b3deb85a8f6ee53a5..d8fc6216067cd03e10ec0bb5c13abc85215ac822 100644 +index e2a25c29ec74147b3e66aa0b3deb85a8f6ee53a5..89ea4208bc30bcf3ed59b3a28384c0796b9204c4 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java @@ -145,8 +145,8 @@ public abstract class Mob extends LivingEntity implements Targeting { @@ -326,12 +326,12 @@ index e2a25c29ec74147b3e66aa0b3deb85a8f6ee53a5..d8fc6216067cd03e10ec0bb5c13abc85 + if (tamable.isTame() && !tamable.isOwnedBy(player)) { + return InteractionResult.PASS; + } -+ if (!tamable.isTame() && !level.purpurConfig.untamedTamablesAreRidable) { ++ if (!tamable.isTame() && !level().purpurConfig.untamedTamablesAreRidable) { + return InteractionResult.PASS; + } + } + if (this instanceof AgeableMob ageable) { -+ if (ageable.isBaby() && !level.purpurConfig.babiesAreRidable) { ++ if (ageable.isBaby() && !level().purpurConfig.babiesAreRidable) { + return InteractionResult.PASS; + } + } @@ -526,7 +526,7 @@ index 7df56705a4a0de2dc4ff7ab133fc26612c219162..384bed4505b6cabb1ae151cd2c4eb5e5 --this.lookAtCooldown; this.getYRotD().ifPresent((yaw) -> { diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -index eb6ced824d024a6402772e4df56e867e18fae988..052304db93aa2996d292df6b5d1e8593351239e4 100644 +index 940cd932e74bc2e6754186731d7aa6f10d56eb68..7798e8df6156d71878b7c1f60c5636be64a25591 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java @@ -18,6 +18,7 @@ import net.minecraft.world.entity.EntityDimensions; @@ -554,22 +554,22 @@ index eb6ced824d024a6402772e4df56e867e18fae988..052304db93aa2996d292df6b5d1e8593 + + @Override + public boolean isRidable() { -+ return level.purpurConfig.batRidable; ++ return level().purpurConfig.batRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.batRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.batRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.batControllable; ++ return level().purpurConfig.batControllable; + } + + @Override + public double getMaxY() { -+ return level.purpurConfig.batMaxY; ++ return level().purpurConfig.batMaxY; + } + + @Override @@ -678,7 +678,7 @@ index 2249fc6dd98afb8d52623b5864955fdd3b3fc042..2ccfaab0a02cf5ff9779e250fb79a75a double d = this.wantedX - this.fish.getX(); double e = this.wantedY - this.fish.getY(); 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 cd960eaeb3b86177b962db69173112f746bc52e1..5c1d0546c014c3a739311c8a8432e5cd1d8cacbc 100644 +index f6062bf8c888baeb7b421150a2c64bf1af1a312b..79a2d45f10aa1afb5d1192284cd48ea026411845 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java @@ -43,6 +43,7 @@ import net.minecraft.world.entity.EntityType; @@ -779,7 +779,7 @@ index cd960eaeb3b86177b962db69173112f746bc52e1..5c1d0546c014c3a739311c8a8432e5cd this.targetSelector.addGoal(1, (new Bee.BeeHurtByOtherGoal(this)).setAlertOthers(new Class[0])); this.targetSelector.addGoal(2, new Bee.BeeBecomeAngryTargetGoal(this)); this.targetSelector.addGoal(3, new ResetUniversalAngerTargetGoal<>(this, true)); -@@ -882,16 +933,16 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -877,16 +928,16 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { } } @@ -800,27 +800,27 @@ index cd960eaeb3b86177b962db69173112f746bc52e1..5c1d0546c014c3a739311c8a8432e5cd } diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java -index 3981a2b7501ceb62562785b2ace5990473919fa0..845781610102d2ef89522619b8059073cc48b75d 100644 +index 90ce201bc7c47cef9bc59d7b535a7453854bac75..90ec526b135a6de6e7ba16fdd3a113ef92b42ef6 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -102,6 +102,31 @@ public class Cat extends TamableAnimal implements VariantHolder { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.catMaxHealth); +@@ -97,6 +97,31 @@ public class Cat extends TamableAnimal implements VariantHolder { + super(type, world); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.catRidable; ++ return level().purpurConfig.catRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.catRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.catRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.catControllable; ++ return level().purpurConfig.catControllable; + } + + @Override @@ -835,7 +835,7 @@ index 3981a2b7501ceb62562785b2ace5990473919fa0..845781610102d2ef89522619b8059073 public ResourceLocation getResourceLocation() { return this.getVariant().texture(); } -@@ -110,6 +135,7 @@ public class Cat extends TamableAnimal implements VariantHolder { +@@ -105,6 +130,7 @@ public class Cat extends TamableAnimal implements VariantHolder { protected void registerGoals() { this.temptGoal = new Cat.CatTemptGoal(this, 0.6D, Cat.TEMPT_INGREDIENT, true); this.goalSelector.addGoal(1, new FloatGoal(this)); @@ -843,7 +843,7 @@ index 3981a2b7501ceb62562785b2ace5990473919fa0..845781610102d2ef89522619b8059073 this.goalSelector.addGoal(1, new PanicGoal(this, 1.5D)); this.goalSelector.addGoal(2, new SitWhenOrderedToGoal(this)); this.goalSelector.addGoal(3, new Cat.CatRelaxOnOwnerGoal(this)); -@@ -122,6 +148,7 @@ public class Cat extends TamableAnimal implements VariantHolder { +@@ -117,6 +143,7 @@ public class Cat extends TamableAnimal implements VariantHolder { this.goalSelector.addGoal(10, new BreedGoal(this, 0.8D)); this.goalSelector.addGoal(11, new WaterAvoidingRandomStrollGoal(this, 0.8D, 1.0000001E-5F)); this.goalSelector.addGoal(12, new LookAtPlayerGoal(this, Player.class, 10.0F)); @@ -851,7 +851,7 @@ index 3981a2b7501ceb62562785b2ace5990473919fa0..845781610102d2ef89522619b8059073 this.targetSelector.addGoal(1, new NonTameRandomTargetGoal<>(this, Rabbit.class, false, (Predicate) null)); this.targetSelector.addGoal(1, new NonTameRandomTargetGoal<>(this, Turtle.class, false, Turtle.BABY_ON_LAND_SELECTOR)); } -@@ -378,6 +405,7 @@ public class Cat extends TamableAnimal implements VariantHolder { +@@ -373,6 +400,7 @@ public class Cat extends TamableAnimal implements VariantHolder { @Override public InteractionResult mobInteract(Player player, InteractionHand hand) { @@ -860,27 +860,27 @@ index 3981a2b7501ceb62562785b2ace5990473919fa0..845781610102d2ef89522619b8059073 Item item = itemstack.getItem(); diff --git a/src/main/java/net/minecraft/world/entity/animal/Chicken.java b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -index c7ff22ee963e3d7ca3c5b819b38cca466c5d78c5..cbaf7993adb03cdb61c8e0cb29a7362b63ae3914 100644 +index 84cefbc339ca368ac306d521012ce2f826a660b5..600b7b4e510871de0dee4051158d344734f04966 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Chicken.java +++ b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -@@ -59,9 +59,27 @@ public class Chicken extends Animal { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.chickenMaxHealth); +@@ -54,9 +54,27 @@ public class Chicken extends Animal { + this.setPathfindingMalus(BlockPathTypes.WATER, 0.0F); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.chickenRidable; ++ return level().purpurConfig.chickenRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.chickenRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.chickenRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.chickenControllable; ++ return level().purpurConfig.chickenControllable; + } + // Purpur end + @@ -892,22 +892,22 @@ index c7ff22ee963e3d7ca3c5b819b38cca466c5d78c5..cbaf7993adb03cdb61c8e0cb29a7362b this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); this.goalSelector.addGoal(3, new TemptGoal(this, 1.0D, Chicken.FOOD_ITEMS, false)); diff --git a/src/main/java/net/minecraft/world/entity/animal/Cod.java b/src/main/java/net/minecraft/world/entity/animal/Cod.java -index 3e213264f5991ccfcb5c207621334b8e9d6cc9bc..d6a9281208f6462628e5e9547c40590a42be89d0 100644 +index 824e5e4fe7619ae46061c3c978c9a044db8c84ab..e2a98b45e56a368de19bb65e304370a5998c7cb9 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cod.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cod.java -@@ -18,6 +18,18 @@ public class Cod extends AbstractSchoolingFish { - this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.codMaxHealth); +@@ -13,6 +13,18 @@ public class Cod extends AbstractSchoolingFish { + super(type, world); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.codRidable; ++ return level().purpurConfig.codRidable; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.codControllable; ++ return level().purpurConfig.codControllable; + } + // Purpur end + @@ -915,27 +915,27 @@ index 3e213264f5991ccfcb5c207621334b8e9d6cc9bc..d6a9281208f6462628e5e9547c40590a public ItemStack getBucketItemStack() { return new ItemStack(Items.COD_BUCKET); diff --git a/src/main/java/net/minecraft/world/entity/animal/Cow.java b/src/main/java/net/minecraft/world/entity/animal/Cow.java -index 2f45444ad13e5ef3619788b19ec9c16be1f87950..9a973e2dc94aa1c8928eea87a6a12789381d15d8 100644 +index 4b63f6aa3d19cc4f47b05d531df3a43bf398c9ea..3ac30ed0a411384be5102de498815561915a7903 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java -@@ -46,9 +46,27 @@ public class Cow extends Animal { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.cowMaxHealth); +@@ -41,9 +41,27 @@ public class Cow extends Animal { + super(type, world); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.cowRidable; ++ return level().purpurConfig.cowRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.cowRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.cowRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.cowControllable; ++ return level().purpurConfig.cowControllable; + } + // Purpur end + @@ -946,7 +946,7 @@ index 2f45444ad13e5ef3619788b19ec9c16be1f87950..9a973e2dc94aa1c8928eea87a6a12789 this.goalSelector.addGoal(1, new PanicGoal(this, 2.0D)); this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); this.goalSelector.addGoal(3, new TemptGoal(this, 1.25D, Ingredient.of(Items.WHEAT), false)); -@@ -89,6 +107,7 @@ public class Cow extends Animal { +@@ -84,6 +102,7 @@ public class Cow extends Animal { @Override public InteractionResult mobInteract(Player player, InteractionHand hand) { @@ -954,7 +954,7 @@ index 2f45444ad13e5ef3619788b19ec9c16be1f87950..9a973e2dc94aa1c8928eea87a6a12789 ItemStack itemstack = player.getItemInHand(hand); if (itemstack.is(Items.BUCKET) && !this.isBaby()) { -@@ -96,7 +115,7 @@ public class Cow extends Animal { +@@ -91,7 +110,7 @@ public class Cow extends Animal { org.bukkit.event.player.PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent((ServerLevel) player.level(), player, this.blockPosition(), this.blockPosition(), null, itemstack, Items.MILK_BUCKET, hand); if (event.isCancelled()) { @@ -964,10 +964,10 @@ index 2f45444ad13e5ef3619788b19ec9c16be1f87950..9a973e2dc94aa1c8928eea87a6a12789 // CraftBukkit end diff --git a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java -index 376fe57c3518d42c887726338b15f59d072d8d87..d8395f47cdf5ceffc1c65442e9d632847d22cca6 100644 +index 501e6cb4aa83f81c1f657e41f4e7f11d19d46831..057ebdba945caa27db8982fe140d858bdb84fa39 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java +++ b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java -@@ -78,10 +78,42 @@ public class Dolphin extends WaterAnimal { +@@ -78,14 +78,82 @@ public class Dolphin extends WaterAnimal { public static final Predicate ALLOWED_ITEMS = (entityitem) -> { return !entityitem.hasPickUpDelay() && entityitem.isAlive() && entityitem.isInWater(); }; @@ -1011,25 +1011,22 @@ index 376fe57c3518d42c887726338b15f59d072d8d87..d8395f47cdf5ceffc1c65442e9d63284 this.lookControl = new SmoothSwimmingLookControl(this, 10); this.setCanPickUpLoot(true); } -@@ -91,6 +123,42 @@ public class Dolphin extends WaterAnimal { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.dolphinMaxHealth); - } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.dolphinRidable; ++ return level().purpurConfig.dolphinRidable; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.dolphinControllable; ++ return level().purpurConfig.dolphinControllable; + } + + @Override + public boolean onSpacebar() { + if (spitCooldown == 0 && getRider() != null) { -+ spitCooldown = level.purpurConfig.dolphinSpitCooldown; ++ spitCooldown = level().purpurConfig.dolphinSpitCooldown; + + org.bukkit.craftbukkit.entity.CraftPlayer player = (org.bukkit.craftbukkit.entity.CraftPlayer) getRider().getBukkitEntity(); + if (!player.hasPermission("allow.special.dolphin")) { @@ -1041,7 +1038,7 @@ index 376fe57c3518d42c887726338b15f59d072d8d87..d8395f47cdf5ceffc1c65442e9d63284 + org.bukkit.util.Vector target = loc.getDirection().normalize().multiply(10).add(loc.toVector()); + + org.purpurmc.purpur.entity.DolphinSpit spit = new org.purpurmc.purpur.entity.DolphinSpit(level, this); -+ spit.shoot(target.getX() - getX(), target.getY() - getY(), target.getZ() - getZ(), level.purpurConfig.dolphinSpitSpeed, 5.0F); ++ spit.shoot(target.getX() - getX(), target.getY() - getY(), target.getZ() - getZ(), level().purpurConfig.dolphinSpitSpeed, 5.0F); + + level.addFreshEntity(spit); + playSound(SoundEvents.DOLPHIN_ATTACK, 1.0F, 1.0F + (random.nextFloat() - random.nextFloat()) * 0.2F); @@ -1054,7 +1051,7 @@ index 376fe57c3518d42c887726338b15f59d072d8d87..d8395f47cdf5ceffc1c65442e9d63284 @Nullable @Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, @Nullable SpawnGroupData entityData, @Nullable CompoundTag entityNbt) { -@@ -165,6 +233,7 @@ public class Dolphin extends WaterAnimal { +@@ -160,6 +228,7 @@ public class Dolphin extends WaterAnimal { protected void registerGoals() { this.goalSelector.addGoal(0, new BreathAirGoal(this)); this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); @@ -1062,7 +1059,7 @@ index 376fe57c3518d42c887726338b15f59d072d8d87..d8395f47cdf5ceffc1c65442e9d63284 this.goalSelector.addGoal(1, new Dolphin.DolphinSwimToTreasureGoal(this)); this.goalSelector.addGoal(2, new Dolphin.DolphinSwimWithPlayerGoal(this, 4.0D)); this.goalSelector.addGoal(4, new RandomSwimmingGoal(this, 1.0D, 10)); -@@ -175,6 +244,7 @@ public class Dolphin extends WaterAnimal { +@@ -170,6 +239,7 @@ public class Dolphin extends WaterAnimal { this.goalSelector.addGoal(8, new Dolphin.PlayWithItemsGoal()); this.goalSelector.addGoal(8, new FollowBoatGoal(this)); this.goalSelector.addGoal(9, new AvoidEntityGoal<>(this, Guardian.class, 8.0F, 1.0D, 1.0D)); @@ -1070,7 +1067,7 @@ index 376fe57c3518d42c887726338b15f59d072d8d87..d8395f47cdf5ceffc1c65442e9d63284 this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, new Class[]{Guardian.class})).setAlertOthers()); } -@@ -226,7 +296,7 @@ public class Dolphin extends WaterAnimal { +@@ -221,7 +291,7 @@ public class Dolphin extends WaterAnimal { @Override protected boolean canRide(Entity entity) { @@ -1079,7 +1076,7 @@ index 376fe57c3518d42c887726338b15f59d072d8d87..d8395f47cdf5ceffc1c65442e9d63284 } @Override -@@ -261,6 +331,11 @@ public class Dolphin extends WaterAnimal { +@@ -256,6 +326,11 @@ public class Dolphin extends WaterAnimal { @Override public void tick() { super.tick(); @@ -1092,11 +1089,11 @@ index 376fe57c3518d42c887726338b15f59d072d8d87..d8395f47cdf5ceffc1c65442e9d63284 this.setAirSupply(this.getMaxAirSupply()); } else { diff --git a/src/main/java/net/minecraft/world/entity/animal/Fox.java b/src/main/java/net/minecraft/world/entity/animal/Fox.java -index b75c942e212e6659723c4fea3f06f85a627096f0..b143032e87ecd74203e6486eea1248a3f6ce13f1 100644 +index 844083101e9763330af0175388f6cdda27a97ecc..c56aaf2d0460d5a4432f893300140d071a95cc38 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java -@@ -146,6 +146,44 @@ public class Fox extends Animal implements VariantHolder { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.foxMaxHealth); +@@ -141,6 +141,44 @@ public class Fox extends Animal implements VariantHolder { + this.setCanPickUpLoot(true); } + // Purpur start @@ -1140,7 +1137,7 @@ index b75c942e212e6659723c4fea3f06f85a627096f0..b143032e87ecd74203e6486eea1248a3 @Override protected void defineSynchedData() { super.defineSynchedData(); -@@ -165,6 +203,7 @@ public class Fox extends Animal implements VariantHolder { +@@ -160,6 +198,7 @@ public class Fox extends Animal implements VariantHolder { return entityliving instanceof AbstractSchoolingFish; }); this.goalSelector.addGoal(0, new Fox.FoxFloatGoal()); @@ -1148,7 +1145,7 @@ index b75c942e212e6659723c4fea3f06f85a627096f0..b143032e87ecd74203e6486eea1248a3 this.goalSelector.addGoal(0, new ClimbOnTopOfPowderSnowGoal(this, this.level())); this.goalSelector.addGoal(1, new Fox.FaceplantGoal()); this.goalSelector.addGoal(2, new Fox.FoxPanicGoal(2.2D)); -@@ -191,6 +230,7 @@ public class Fox extends Animal implements VariantHolder { +@@ -186,6 +225,7 @@ public class Fox extends Animal implements VariantHolder { this.goalSelector.addGoal(11, new Fox.FoxSearchForItemsGoal()); this.goalSelector.addGoal(12, new Fox.FoxLookAtPlayerGoal(this, Player.class, 24.0F)); this.goalSelector.addGoal(13, new Fox.PerchAndSearchGoal()); @@ -1156,7 +1153,7 @@ index b75c942e212e6659723c4fea3f06f85a627096f0..b143032e87ecd74203e6486eea1248a3 this.targetSelector.addGoal(3, new Fox.DefendTrustedTargetGoal(LivingEntity.class, false, false, (entityliving) -> { return Fox.TRUSTED_TARGET_SELECTOR.test(entityliving) && !this.trusts(entityliving.getUUID()); })); -@@ -763,16 +803,16 @@ public class Fox extends Animal implements VariantHolder { +@@ -758,16 +798,16 @@ public class Fox extends Animal implements VariantHolder { return new Vec3(0.0D, (double) (0.55F * this.getEyeHeight()), (double) (this.getBbWidth() * 0.4F)); } @@ -1176,7 +1173,7 @@ index b75c942e212e6659723c4fea3f06f85a627096f0..b143032e87ecd74203e6486eea1248a3 } } -@@ -783,16 +823,16 @@ public class Fox extends Animal implements VariantHolder { +@@ -778,16 +818,16 @@ public class Fox extends Animal implements VariantHolder { } } @@ -1197,43 +1194,38 @@ index b75c942e212e6659723c4fea3f06f85a627096f0..b143032e87ecd74203e6486eea1248a3 } diff --git a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -index 4bdef5dd01b69ff64f632a71096c1a87b2fc1195..1a4992dbe62b908b21f6b44b39a55237e7127cde 100644 +index f383928fc5b331ddf128bdcb6a23010d8fe088d3..6815d7350a82c6d32f60aa6116466ebd06a920f9 100644 --- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -@@ -66,6 +66,23 @@ public class IronGolem extends AbstractGolem implements NeutralMob { +@@ -66,8 +66,27 @@ public class IronGolem extends AbstractGolem implements NeutralMob { this.setMaxUpStep(1.0F); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.ironGolemRidable; ++ return level().purpurConfig.ironGolemRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.ironGolemRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.ironGolemRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.ironGolemControllable; ++ return level().purpurConfig.ironGolemControllable; + } + // Purpur end + - @Override - public void initAttributes() { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.ironGolemMaxHealth); -@@ -73,6 +90,8 @@ public class IronGolem extends AbstractGolem implements NeutralMob { - @Override protected void registerGoals() { -+ if (level.purpurConfig.ironGolemCanSwim) this.goalSelector.addGoal(0, new net.minecraft.world.entity.ai.goal.FloatGoal(this)); // Purpur ++ if (level().purpurConfig.ironGolemCanSwim) this.goalSelector.addGoal(0, new net.minecraft.world.entity.ai.goal.FloatGoal(this)); // Purpur + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0D, true)); this.goalSelector.addGoal(2, new MoveTowardsTargetGoal(this, 0.9D, 32.0F)); this.goalSelector.addGoal(2, new MoveBackToVillageGoal(this, 0.6D, false)); -@@ -80,6 +99,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { +@@ -75,6 +94,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { this.goalSelector.addGoal(5, new OfferFlowerGoal(this)); this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 6.0F)); this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); @@ -1241,7 +1233,7 @@ index 4bdef5dd01b69ff64f632a71096c1a87b2fc1195..1a4992dbe62b908b21f6b44b39a55237 this.targetSelector.addGoal(1, new DefendVillageTargetGoal(this)); this.targetSelector.addGoal(2, new HurtByTargetGoal(this, new Class[0])); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::isAngryAt)); -@@ -275,13 +295,13 @@ public class IronGolem extends AbstractGolem implements NeutralMob { +@@ -270,13 +290,13 @@ public class IronGolem extends AbstractGolem implements NeutralMob { ItemStack itemstack = player.getItemInHand(hand); if (!itemstack.is(Items.IRON_INGOT)) { @@ -1258,34 +1250,34 @@ index 4bdef5dd01b69ff64f632a71096c1a87b2fc1195..1a4992dbe62b908b21f6b44b39a55237 float f1 = 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F; diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index 9e5a1d8a406ad43d762f421a2589f649402b6f7d..2eac9d3c1069f79c3fcbfb87518b5d5d1e17c6dd 100644 +index a04374f91f2fbb31219d86b6ae63bcf8fdf7318c..7b0e3b46e3d318ee856d53cfc5532f3432447438 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -@@ -68,6 +68,23 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder> optional = this.getEffectFromItemStack(itemstack); if (!optional.isPresent()) { @@ -1304,34 +1296,34 @@ index 9e5a1d8a406ad43d762f421a2589f649402b6f7d..2eac9d3c1069f79c3fcbfb87518b5d5d Pair pair = (Pair) optional.get(); diff --git a/src/main/java/net/minecraft/world/entity/animal/Ocelot.java b/src/main/java/net/minecraft/world/entity/animal/Ocelot.java -index 68b5a8c608fea6fa110313a6353471e758655e27..1561ee4f27f05adfbb4a0a838615ce47e4bf84c8 100644 +index 8974c3cdae25bef239a908ce688e153d902c48c5..9f1187f5af0594da1c8450a05e0181815375c782 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Ocelot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Ocelot.java -@@ -73,6 +73,23 @@ public class Ocelot extends Animal { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.ocelotMaxHealth); +@@ -68,6 +68,23 @@ public class Ocelot extends Animal { + this.reassessTrustingGoals(); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.ocelotRidable; ++ return level().purpurConfig.ocelotRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.ocelotRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.ocelotRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.ocelotControllable; ++ return level().purpurConfig.ocelotControllable; + } + // Purpur end + public boolean isTrusting() { return (Boolean) this.entityData.get(Ocelot.DATA_TRUSTING); } -@@ -104,12 +121,14 @@ public class Ocelot extends Animal { +@@ -99,12 +116,14 @@ public class Ocelot extends Animal { protected void registerGoals() { this.temptGoal = new Ocelot.OcelotTemptGoal(this, 0.6D, Ocelot.TEMPT_INGREDIENT, true); this.goalSelector.addGoal(1, new FloatGoal(this)); @@ -1347,27 +1339,27 @@ index 68b5a8c608fea6fa110313a6353471e758655e27..1561ee4f27f05adfbb4a0a838615ce47 this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, false, false, Turtle.BABY_ON_LAND_SELECTOR)); } diff --git a/src/main/java/net/minecraft/world/entity/animal/Panda.java b/src/main/java/net/minecraft/world/entity/animal/Panda.java -index 1ce3b2d3b69b702155ac344482d588be738edf8d..e1b4092d245c4e30f8a028378b16f480a710d274 100644 +index 9b807b318a2843810c3963277d464439a865cfb6..490a2b416366136c082371d39beaa65b5f6b102f 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Panda.java +++ b/src/main/java/net/minecraft/world/entity/animal/Panda.java -@@ -114,6 +114,32 @@ public class Panda extends Animal { - setAttributes(); +@@ -108,6 +108,32 @@ public class Panda extends Animal { + } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.pandaRidable; ++ return level().purpurConfig.pandaRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.pandaRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.pandaRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.pandaControllable; ++ return level().purpurConfig.pandaControllable; + } + + @Override @@ -1383,7 +1375,7 @@ index 1ce3b2d3b69b702155ac344482d588be738edf8d..e1b4092d245c4e30f8a028378b16f480 @Override public boolean canTakeItem(ItemStack stack) { EquipmentSlot enumitemslot = Mob.getEquipmentSlotForItem(stack); -@@ -275,6 +301,7 @@ public class Panda extends Animal { +@@ -269,6 +295,7 @@ public class Panda extends Animal { @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); @@ -1391,7 +1383,7 @@ index 1ce3b2d3b69b702155ac344482d588be738edf8d..e1b4092d245c4e30f8a028378b16f480 this.goalSelector.addGoal(2, new Panda.PandaPanicGoal(this, 2.0D)); this.goalSelector.addGoal(2, new Panda.PandaBreedGoal(this, 1.0D)); this.goalSelector.addGoal(3, new Panda.PandaAttackGoal(this, 1.2000000476837158D, true)); -@@ -290,6 +317,7 @@ public class Panda extends Animal { +@@ -284,6 +311,7 @@ public class Panda extends Animal { this.goalSelector.addGoal(12, new Panda.PandaRollGoal(this)); this.goalSelector.addGoal(13, new FollowParentGoal(this, 1.25D)); this.goalSelector.addGoal(14, new WaterAvoidingRandomStrollGoal(this, 1.0D)); @@ -1399,7 +1391,7 @@ index 1ce3b2d3b69b702155ac344482d588be738edf8d..e1b4092d245c4e30f8a028378b16f480 this.targetSelector.addGoal(1, (new Panda.PandaHurtByTargetGoal(this, new Class[0])).setAlertOthers(new Class[0])); } -@@ -639,7 +667,7 @@ public class Panda extends Animal { +@@ -630,7 +658,7 @@ public class Panda extends Animal { ItemStack itemstack = player.getItemInHand(hand); if (this.isScared()) { @@ -1408,7 +1400,7 @@ index 1ce3b2d3b69b702155ac344482d588be738edf8d..e1b4092d245c4e30f8a028378b16f480 } else if (this.isOnBack()) { this.setOnBack(false); return InteractionResult.sidedSuccess(this.level().isClientSide); -@@ -656,7 +684,7 @@ public class Panda extends Animal { +@@ -647,7 +675,7 @@ public class Panda extends Animal { this.setInLove(player); } else { if (this.level().isClientSide || this.isSitting() || this.isInWater()) { @@ -1417,7 +1409,7 @@ index 1ce3b2d3b69b702155ac344482d588be738edf8d..e1b4092d245c4e30f8a028378b16f480 } this.tryToSit(); -@@ -675,7 +703,7 @@ public class Panda extends Animal { +@@ -666,7 +694,7 @@ public class Panda extends Animal { return InteractionResult.SUCCESS; } else { @@ -1426,7 +1418,7 @@ index 1ce3b2d3b69b702155ac344482d588be738edf8d..e1b4092d245c4e30f8a028378b16f480 } } -@@ -715,7 +743,7 @@ public class Panda extends Animal { +@@ -706,7 +734,7 @@ public class Panda extends Animal { return !this.isOnBack() && !this.isScared() && !this.isEating() && !this.isRolling() && !this.isSitting(); } @@ -1435,7 +1427,7 @@ index 1ce3b2d3b69b702155ac344482d588be738edf8d..e1b4092d245c4e30f8a028378b16f480 private final Panda panda; -@@ -725,9 +753,9 @@ public class Panda extends Animal { +@@ -716,9 +744,9 @@ public class Panda extends Animal { } @Override @@ -1448,10 +1440,10 @@ index 1ce3b2d3b69b702155ac344482d588be738edf8d..e1b4092d245c4e30f8a028378b16f480 } } diff --git a/src/main/java/net/minecraft/world/entity/animal/Parrot.java b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -index 55fd983a41714a6cf8af950d0222bb70ab38ced4..d32fdd557fff9b99835c97967a49455da7872237 100644 +index 3cc7af656433117991547476c118b58cff95e8e2..39c5da4e037f57cca0316804d0e363c32a441c6b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Parrot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -@@ -129,7 +129,29 @@ public class Parrot extends ShoulderRidingEntity implements VariantHolder type, Level world) { super(type, world); @@ -1482,29 +1474,27 @@ index 55fd983a41714a6cf8af950d0222bb70ab38ced4..d32fdd557fff9b99835c97967a49455d this.setPathfindingMalus(BlockPathTypes.DANGER_FIRE, -1.0F); this.setPathfindingMalus(BlockPathTypes.DAMAGE_FIRE, -1.0F); this.setPathfindingMalus(BlockPathTypes.COCOA, -1.0F); -@@ -140,6 +162,40 @@ public class Parrot extends ShoulderRidingEntity implements VariantHolder type, Level world) { super(type, world); -@@ -70,6 +71,34 @@ public class PolarBear extends Animal implements NeutralMob { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.polarBearMaxHealth); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.polarBearRidable; ++ return level().purpurConfig.polarBearRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.polarBearRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.polarBearRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.polarBearControllable; ++ return level().purpurConfig.polarBearControllable; + } + + @Override @@ -1614,7 +1602,7 @@ index 71f75dd1d0c9b77f73138297a1be642c67c78c01..3f185b02dc23942d2216cf9a8bdc493f @Nullable @Override public AgeableMob getBreedOffspring(ServerLevel world, AgeableMob entity) { -@@ -85,12 +114,14 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -80,12 +109,14 @@ public class PolarBear extends Animal implements NeutralMob { protected void registerGoals() { super.registerGoals(); this.goalSelector.addGoal(0, new FloatGoal(this)); @@ -1629,7 +1617,7 @@ index 71f75dd1d0c9b77f73138297a1be642c67c78c01..3f185b02dc23942d2216cf9a8bdc493f this.targetSelector.addGoal(1, new PolarBear.PolarBearHurtByTargetGoal()); this.targetSelector.addGoal(2, new PolarBear.PolarBearAttackPlayersGoal()); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::isAngryAt)); -@@ -207,6 +238,11 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -202,6 +233,11 @@ public class PolarBear extends Animal implements NeutralMob { this.updatePersistentAnger((ServerLevel)this.level(), true); } @@ -1641,7 +1629,7 @@ index 71f75dd1d0c9b77f73138297a1be642c67c78c01..3f185b02dc23942d2216cf9a8bdc493f } @Override -@@ -236,6 +272,7 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -231,6 +267,7 @@ public class PolarBear extends Animal implements NeutralMob { public void setStanding(boolean warning) { this.entityData.set(DATA_STANDING_ID, warning); @@ -1650,22 +1638,22 @@ index 71f75dd1d0c9b77f73138297a1be642c67c78c01..3f185b02dc23942d2216cf9a8bdc493f public float getStandingAnimationScale(float tickDelta) { diff --git a/src/main/java/net/minecraft/world/entity/animal/Pufferfish.java b/src/main/java/net/minecraft/world/entity/animal/Pufferfish.java -index 86270f51c69836ba88c08de6ad36bacf2c433b3f..5ee99fcf9201187dd2083ca9ab63832e6c58b7a7 100644 +index a197337f2e09f53cf382022569c8836745d78769..95383e246a8e1b311e4f26a66372966b6bc51de5 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Pufferfish.java +++ b/src/main/java/net/minecraft/world/entity/animal/Pufferfish.java -@@ -50,6 +50,18 @@ public class Pufferfish extends AbstractFish { - this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.pufferfishMaxHealth); +@@ -45,6 +45,18 @@ public class Pufferfish extends AbstractFish { + this.refreshDimensions(); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.pufferfishRidable; ++ return level().purpurConfig.pufferfishRidable; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.pufferfishControllable; ++ return level().purpurConfig.pufferfishControllable; + } + // Purpur end + @@ -1673,7 +1661,7 @@ index 86270f51c69836ba88c08de6ad36bacf2c433b3f..5ee99fcf9201187dd2083ca9ab63832e protected void defineSynchedData() { super.defineSynchedData(); diff --git a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -index 1cb36eb937084c6dbc72d33e51c52af6f14c885d..c43bb09caa560e9ea4596b5bb167e1273e599ed7 100644 +index 01a58fe71669bf199511c906363d036ed880aa91..22188b537271d6cfd276027bb5df86404fa73ed4 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java @@ -83,6 +83,7 @@ public class Rabbit extends Animal implements VariantHolder { @@ -1684,8 +1672,8 @@ index 1cb36eb937084c6dbc72d33e51c52af6f14c885d..c43bb09caa560e9ea4596b5bb167e127 public Rabbit(EntityType type, Level world) { super(type, world); -@@ -96,6 +97,51 @@ public class Rabbit extends Animal implements VariantHolder { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.rabbitMaxHealth); +@@ -91,6 +92,51 @@ public class Rabbit extends Animal implements VariantHolder { + this.initializePathFinderGoals(); // CraftBukkit - moved code } + // Purpur start @@ -1736,7 +1724,7 @@ index 1cb36eb937084c6dbc72d33e51c52af6f14c885d..c43bb09caa560e9ea4596b5bb167e127 // CraftBukkit start - code from constructor public void initializePathFinderGoals(){ this.setSpeedModifier(0.0D); -@@ -105,6 +151,7 @@ public class Rabbit extends Animal implements VariantHolder { +@@ -100,6 +146,7 @@ public class Rabbit extends Animal implements VariantHolder { @Override public void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); @@ -1744,7 +1732,7 @@ index 1cb36eb937084c6dbc72d33e51c52af6f14c885d..c43bb09caa560e9ea4596b5bb167e127 this.goalSelector.addGoal(1, new ClimbOnTopOfPowderSnowGoal(this, this.level())); this.goalSelector.addGoal(1, new Rabbit.RabbitPanicGoal(this, 2.2D)); this.goalSelector.addGoal(2, new BreedGoal(this, 0.8D)); -@@ -119,6 +166,14 @@ public class Rabbit extends Animal implements VariantHolder { +@@ -114,6 +161,14 @@ public class Rabbit extends Animal implements VariantHolder { @Override protected float getJumpPower() { @@ -1759,7 +1747,7 @@ index 1cb36eb937084c6dbc72d33e51c52af6f14c885d..c43bb09caa560e9ea4596b5bb167e127 float f = 0.3F; if (this.horizontalCollision || this.moveControl.hasWanted() && this.moveControl.getWantedY() > this.getY() + 0.5D) { -@@ -143,7 +198,7 @@ public class Rabbit extends Animal implements VariantHolder { +@@ -138,7 +193,7 @@ public class Rabbit extends Animal implements VariantHolder { } @Override @@ -1768,7 +1756,7 @@ index 1cb36eb937084c6dbc72d33e51c52af6f14c885d..c43bb09caa560e9ea4596b5bb167e127 super.jumpFromGround(); double d0 = this.moveControl.getSpeedModifier(); -@@ -193,6 +248,13 @@ public class Rabbit extends Animal implements VariantHolder { +@@ -188,6 +243,13 @@ public class Rabbit extends Animal implements VariantHolder { @Override public void customServerAiStep() { @@ -1782,7 +1770,7 @@ index 1cb36eb937084c6dbc72d33e51c52af6f14c885d..c43bb09caa560e9ea4596b5bb167e127 if (this.jumpDelayTicks > 0) { --this.jumpDelayTicks; } -@@ -477,7 +539,7 @@ public class Rabbit extends Animal implements VariantHolder { +@@ -472,7 +534,7 @@ public class Rabbit extends Animal implements VariantHolder { } } @@ -1791,7 +1779,7 @@ index 1cb36eb937084c6dbc72d33e51c52af6f14c885d..c43bb09caa560e9ea4596b5bb167e127 private final Rabbit rabbit; private double nextJumpSpeed; -@@ -488,14 +550,14 @@ public class Rabbit extends Animal implements VariantHolder { +@@ -483,14 +545,14 @@ public class Rabbit extends Animal implements VariantHolder { } @Override @@ -1809,22 +1797,22 @@ index 1cb36eb937084c6dbc72d33e51c52af6f14c885d..c43bb09caa560e9ea4596b5bb167e127 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Salmon.java b/src/main/java/net/minecraft/world/entity/animal/Salmon.java -index 40196aa0f8abc8be68dffd397f706a0c2c0fc320..a1ad0c0eb4c7b6d39bc24be24b8d511697a5b628 100644 +index 0af79daa357f53a8871e293b57e16c099e5d3f64..87c442fb198cad8671ad1419e589a5a67c4fdca8 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Salmon.java +++ b/src/main/java/net/minecraft/world/entity/animal/Salmon.java -@@ -18,6 +18,18 @@ public class Salmon extends AbstractSchoolingFish { - this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.salmonMaxHealth); +@@ -13,6 +13,18 @@ public class Salmon extends AbstractSchoolingFish { + super(type, world); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.salmonRidable; ++ return level().purpurConfig.salmonRidable; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.salmonControllable; ++ return level().purpurConfig.salmonControllable; + } + // Purpur end + @@ -1832,27 +1820,27 @@ index 40196aa0f8abc8be68dffd397f706a0c2c0fc320..a1ad0c0eb4c7b6d39bc24be24b8d5116 public int getMaxSchoolSize() { return 5; diff --git a/src/main/java/net/minecraft/world/entity/animal/Sheep.java b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -index 5886a9a40cbac1a97d4213d4a806802359953d18..99ed0cf1bb04df94f3ac3b9acd2076a26d43ab1e 100644 +index c0e89262c596fbdd0bb3c3f76baccb17a1bb5fcd..0e2f10fa133281477ab96ba743266ade4d5f2119 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java +++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -@@ -122,10 +122,28 @@ public class Sheep extends Animal implements Shearable { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.sheepMaxHealth); +@@ -117,10 +117,28 @@ public class Sheep extends Animal implements Shearable { + super(type, world); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.sheepRidable; ++ return level().purpurConfig.sheepRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.sheepRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.sheepRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.sheepControllable; ++ return level().purpurConfig.sheepControllable; + } + // Purpur end + @@ -1865,35 +1853,30 @@ index 5886a9a40cbac1a97d4213d4a806802359953d18..99ed0cf1bb04df94f3ac3b9acd2076a2 this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); this.goalSelector.addGoal(3, new TemptGoal(this, 1.1D, Ingredient.of(Items.WHEAT), false)); diff --git a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -index 64919b11f1b73f63a44e5f395687704e50e76c9a..f95a472f3696061d5c1b0ac3bf281ae099871084 100644 +index 96bfba9d3ccdbf95b8eea4038bf42e6b1430181d..190d123a87ef8ca84e5e0cc485a5cc65fe5ed8e8 100644 --- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -@@ -54,6 +54,23 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -54,12 +54,31 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM super(type, world); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.snowGolemRidable; ++ return level().purpurConfig.snowGolemRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.snowGolemRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.snowGolemRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.snowGolemControllable; ++ return level().purpurConfig.snowGolemControllable; + } + // Purpur end + - @Override - public void initAttributes() { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.snowGolemMaxHealth); -@@ -61,10 +78,12 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM - @Override protected void registerGoals() { + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur @@ -1905,15 +1888,15 @@ index 64919b11f1b73f63a44e5f395687704e50e76c9a..f95a472f3696061d5c1b0ac3bf281ae0 this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Mob.class, 10, true, false, (entityliving) -> { return entityliving instanceof Enemy; })); -@@ -112,6 +131,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -107,6 +126,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM return; } -+ if (getRider() != null && this.isControllable() && !level.purpurConfig.snowGolemLeaveTrailWhenRidden) return; // Purpur - don't leave snow trail when being ridden ++ if (getRider() != null && this.isControllable() && !level().purpurConfig.snowGolemLeaveTrailWhenRidden) return; // Purpur - don't leave snow trail when being ridden BlockState iblockdata = Blocks.SNOW.defaultBlockState(); for (int i = 0; i < 4; ++i) { -@@ -159,7 +179,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -154,7 +174,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM if (itemstack.is(Items.SHEARS) && this.readyForShearing()) { // CraftBukkit start if (!CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemstack, hand)) { @@ -1922,7 +1905,7 @@ index 64919b11f1b73f63a44e5f395687704e50e76c9a..f95a472f3696061d5c1b0ac3bf281ae0 } // CraftBukkit end this.shear(SoundSource.PLAYERS); -@@ -172,7 +192,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -167,7 +187,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM return InteractionResult.sidedSuccess(this.level().isClientSide); } else { @@ -1932,22 +1915,22 @@ index 64919b11f1b73f63a44e5f395687704e50e76c9a..f95a472f3696061d5c1b0ac3bf281ae0 } diff --git a/src/main/java/net/minecraft/world/entity/animal/Squid.java b/src/main/java/net/minecraft/world/entity/animal/Squid.java -index 55ca4f5e136cd902b2df425c8e65b12bfb45b28e..47842db438bac4c571a11306b0621f30832bbd68 100644 +index b72006c4b2342ca9d9a81f54f89fa6d979c33c85..fa635fa6828c4d7e0fd80ae00cc21e5598542703 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Squid.java +++ b/src/main/java/net/minecraft/world/entity/animal/Squid.java -@@ -55,9 +55,32 @@ public class Squid extends WaterAnimal { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.squidMaxHealth); +@@ -50,9 +50,32 @@ public class Squid extends WaterAnimal { + this.tentacleSpeed = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F; } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.squidRidable; ++ return level().purpurConfig.squidRidable; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.squidControllable; ++ return level().purpurConfig.squidControllable; + } + + protected void rotateVectorAroundY(org.bukkit.util.Vector vector, double degrees) { @@ -1968,7 +1951,7 @@ index 55ca4f5e136cd902b2df425c8e65b12bfb45b28e..47842db438bac4c571a11306b0621f30 this.goalSelector.addGoal(1, new Squid.SquidFleeGoal()); } -@@ -249,6 +272,38 @@ public class Squid extends WaterAnimal { +@@ -244,6 +267,38 @@ public class Squid extends WaterAnimal { @Override public void tick() { @@ -2008,22 +1991,22 @@ index 55ca4f5e136cd902b2df425c8e65b12bfb45b28e..47842db438bac4c571a11306b0621f30 if (i > 100) { diff --git a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -index c0605ccfd050417189595cdcb68eb9d56e9fc4ee..1904e78ad39d2dd8e4dfbc64d187065a860b2103 100644 +index b05b560b7570e97bc234b75f26233909fcf575b3..71234b258157579d3a47064e7e299bb7fb90908f 100644 --- a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java +++ b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -@@ -47,6 +47,18 @@ public class TropicalFish extends AbstractSchoolingFish implements VariantHolder - this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.tropicalFishMaxHealth); +@@ -42,6 +42,18 @@ public class TropicalFish extends AbstractSchoolingFish implements VariantHolder + super(type, world); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.tropicalFishRidable; ++ return level().purpurConfig.tropicalFishRidable; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.tropicalFishControllable; ++ return level().purpurConfig.tropicalFishControllable; + } + // Purpur end + @@ -2031,34 +2014,34 @@ index c0605ccfd050417189595cdcb68eb9d56e9fc4ee..1904e78ad39d2dd8e4dfbc64d187065a return "entity.minecraft.tropical_fish.predefined." + variant; } diff --git a/src/main/java/net/minecraft/world/entity/animal/Turtle.java b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -index fc98554897f009352f1869d3e5a42d209a8d520c..68b50ffd17e4061c0dba0fb3452cb86014c88e89 100644 +index 9f7fa132997829e9a34aaae7aac7a6f7d529eee2..9022f5fa0ff94ccf2c46f96c541e77e1f82b81da 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java +++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -@@ -88,6 +88,23 @@ public class Turtle extends Animal { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.turtleMaxHealth); +@@ -83,6 +83,23 @@ public class Turtle extends Animal { + this.setMaxUpStep(1.0F); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.turtleRidable; ++ return level().purpurConfig.turtleRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.turtleRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.turtleRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.turtleControllable; ++ return level().purpurConfig.turtleControllable; + } + // Purpur end + public void setHomePos(BlockPos pos) { this.entityData.set(Turtle.HOME_POS, pos.immutable()); // Paper - called with mutablepos... } -@@ -190,6 +207,7 @@ public class Turtle extends Animal { +@@ -185,6 +202,7 @@ public class Turtle extends Animal { @Override protected void registerGoals() { @@ -2066,7 +2049,7 @@ index fc98554897f009352f1869d3e5a42d209a8d520c..68b50ffd17e4061c0dba0fb3452cb860 this.goalSelector.addGoal(0, new Turtle.TurtlePanicGoal(this, 1.2D)); this.goalSelector.addGoal(1, new Turtle.TurtleBreedGoal(this, 1.0D)); this.goalSelector.addGoal(1, new Turtle.TurtleLayEggGoal(this, 1.0D)); -@@ -347,13 +365,15 @@ public class Turtle extends Animal { +@@ -342,13 +360,15 @@ public class Turtle extends Animal { org.bukkit.craftbukkit.event.CraftEventFactory.entityDamage = null; // CraftBukkit } @@ -2083,7 +2066,7 @@ index fc98554897f009352f1869d3e5a42d209a8d520c..68b50ffd17e4061c0dba0fb3452cb860 } private void updateSpeed() { -@@ -372,8 +392,18 @@ public class Turtle extends Animal { +@@ -367,8 +387,18 @@ public class Turtle extends Animal { } @@ -2103,7 +2086,7 @@ index fc98554897f009352f1869d3e5a42d209a8d520c..68b50ffd17e4061c0dba0fb3452cb860 this.updateSpeed(); if (this.operation == MoveControl.Operation.MOVE_TO && !this.turtle.getNavigation().isDone()) { double d0 = this.wantedX - this.turtle.getX(); -@@ -389,7 +419,7 @@ public class Turtle extends Animal { +@@ -384,7 +414,7 @@ public class Turtle extends Animal { this.turtle.setYRot(this.rotlerp(this.turtle.getYRot(), f, 90.0F)); this.turtle.yBodyRot = this.turtle.getYRot(); @@ -2113,22 +2096,22 @@ index fc98554897f009352f1869d3e5a42d209a8d520c..68b50ffd17e4061c0dba0fb3452cb860 this.turtle.setSpeed(Mth.lerp(0.125F, this.turtle.getSpeed(), f1)); this.turtle.setDeltaMovement(this.turtle.getDeltaMovement().add(0.0D, (double) this.turtle.getSpeed() * d1 * 0.1D, 0.0D)); diff --git a/src/main/java/net/minecraft/world/entity/animal/Wolf.java b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -index 123bb0b0a8437935ae5dafbe93b44eb268d1b4c0..d74b9426116770ad42b5ceb85ce9a19fe11db74a 100644 +index 27c4dd3605373f08078048fe923a8f6f4d3ccf3b..cb2b8c7cbbe882ae0ca876edaa66bea1d5cd141d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -@@ -107,9 +107,32 @@ public class Wolf extends TamableAnimal implements NeutralMob { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.wolfMaxHealth); +@@ -102,9 +102,32 @@ public class Wolf extends TamableAnimal implements NeutralMob { + this.setPathfindingMalus(BlockPathTypes.DANGER_POWDER_SNOW, -1.0F); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.wolfRidable; ++ return level().purpurConfig.wolfRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.wolfRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.wolfRidableInWater; + } + + public void onMount(Player rider) { @@ -2138,7 +2121,7 @@ index 123bb0b0a8437935ae5dafbe93b44eb268d1b4c0..d74b9426116770ad42b5ceb85ce9a19f + + @Override + public boolean isControllable() { -+ return level.purpurConfig.wolfControllable; ++ return level().purpurConfig.wolfControllable; + } + // Purpur end + @@ -2149,7 +2132,7 @@ index 123bb0b0a8437935ae5dafbe93b44eb268d1b4c0..d74b9426116770ad42b5ceb85ce9a19f this.goalSelector.addGoal(1, new Wolf.WolfPanicGoal(1.5D)); this.goalSelector.addGoal(2, new SitWhenOrderedToGoal(this)); this.goalSelector.addGoal(3, new Wolf.WolfAvoidEntityGoal<>(this, Llama.class, 24.0F, 1.5D, 1.5D)); -@@ -121,6 +144,7 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -116,6 +139,7 @@ public class Wolf extends TamableAnimal implements NeutralMob { this.goalSelector.addGoal(9, new BegGoal(this, 8.0F)); this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Player.class, 8.0F)); this.goalSelector.addGoal(10, new RandomLookAroundGoal(this)); @@ -2158,7 +2141,7 @@ index 123bb0b0a8437935ae5dafbe93b44eb268d1b4c0..d74b9426116770ad42b5ceb85ce9a19f this.targetSelector.addGoal(2, new OwnerHurtTargetGoal(this)); this.targetSelector.addGoal(3, (new HurtByTargetGoal(this, new Class[0])).setAlertOthers()); diff --git a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java -index 339c70f101d026a100a801e66cf514b3329a89d2..81c10577b176b8325092457d0b543ed098ca54f2 100644 +index 339c70f101d026a100a801e66cf514b3329a89d2..9588f9adad23aa6f2240d1ddb2f92aa82e8e740b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java +++ b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java @@ -101,10 +101,23 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS @@ -2193,17 +2176,17 @@ index 339c70f101d026a100a801e66cf514b3329a89d2..81c10577b176b8325092457d0b543ed0 + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.allayRidable; ++ return level().purpurConfig.allayRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.allayRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.allayRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.allayControllable; ++ return level().purpurConfig.allayControllable; + } + + @Override @@ -2216,22 +2199,22 @@ index 339c70f101d026a100a801e66cf514b3329a89d2..81c10577b176b8325092457d0b543ed0 protected Brain.Provider brainProvider() { return Brain.provider(Allay.MEMORY_TYPES, Allay.SENSOR_TYPES); diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index d90bf5a45466525c9a04d54b02d366861423be8f..11f24bf5886ffccd05b8f78ce960fa3c1ad76856 100644 +index 2682a49cd3948e0f80e2d7e58abcd3e6d8f7ac4e..ede5469f26f530beacfc655581e213d39276c7d9 100644 --- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -@@ -103,6 +103,23 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder getModelRotationValues() { return this.modelRotationValues; -@@ -524,14 +541,22 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder { @@ -2321,17 +2304,17 @@ index 22eb0a8fc35baa04b34265b62aa29a71f3cc7343..b6751a90d5ae004accd08ad23c12e18b + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.frogRidable; ++ return level().purpurConfig.frogRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.frogRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.frogRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.frogControllable; ++ return level().purpurConfig.frogControllable; + } + + @Override @@ -2342,7 +2325,7 @@ index 22eb0a8fc35baa04b34265b62aa29a71f3cc7343..b6751a90d5ae004accd08ad23c12e18b + + @Override + public float getJumpPower() { -+ return (getRider() != null && isControllable()) ? level.purpurConfig.frogRidableJumpHeight * this.getBlockJumpFactor() : super.getJumpPower(); ++ return (getRider() != null && isControllable()) ? level().purpurConfig.frogRidableJumpHeight * this.getBlockJumpFactor() : super.getJumpPower(); + } + // Purpur end + @@ -2359,7 +2342,7 @@ index 22eb0a8fc35baa04b34265b62aa29a71f3cc7343..b6751a90d5ae004accd08ad23c12e18b super(entity); } diff --git a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java -index 4aeab90e778629c355189dfe79c39c4b21f5f5ac..80cace56286c3969f306737faefe2d851a458edd 100644 +index 4aeab90e778629c355189dfe79c39c4b21f5f5ac..955e112f52898ffde28e1b49b6e91d3e33e057b5 100644 --- a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java +++ b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java @@ -45,13 +45,50 @@ public class Tadpole extends AbstractFish { @@ -2392,17 +2375,17 @@ index 4aeab90e778629c355189dfe79c39c4b21f5f5ac..80cace56286c3969f306737faefe2d85 + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.tadpoleRidable; ++ return level().purpurConfig.tadpoleRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.tadpoleRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.tadpoleRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.tadpoleControllable; ++ return level().purpurConfig.tadpoleControllable; + } + + @Override @@ -2415,7 +2398,7 @@ index 4aeab90e778629c355189dfe79c39c4b21f5f5ac..80cace56286c3969f306737faefe2d85 protected PathNavigation createNavigation(Level world) { return new WaterBoundPathNavigation(this, world); diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -index 528e7ba29dcd38726b2c1bbc1d8ac208c64ba9df..b1d78fd5674826b021b9f300647b1957daa8ba08 100644 +index 528e7ba29dcd38726b2c1bbc1d8ac208c64ba9df..98f9489623a755778bec2f8977b57882ad2f0b4f 100644 --- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java +++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java @@ -89,6 +89,23 @@ public class Goat extends Animal { @@ -2425,17 +2408,17 @@ index 528e7ba29dcd38726b2c1bbc1d8ac208c64ba9df..b1d78fd5674826b021b9f300647b1957 + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.goatRidable; ++ return level().purpurConfig.goatRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.goatRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.goatRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.goatControllable; ++ return level().purpurConfig.goatControllable; + } + // Purpur end + @@ -2451,10 +2434,10 @@ index 528e7ba29dcd38726b2c1bbc1d8ac208c64ba9df..b1d78fd5674826b021b9f300647b1957 this.level().getProfiler().pop(); this.level().getProfiler().push("goatActivityUpdate"); 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 7827187afa738776908d1c2151556af95affcbe8..05405f22fa9001560eb3a6701f3bb0179a584fae 100644 +index 79b6e241f425622fdc575b77d8dce7061c0ab783..b948f8ac7072afa7a60cdbb2775b0e2fa0a052e9 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 -@@ -144,10 +144,19 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, +@@ -144,12 +144,22 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, protected AbstractHorse(EntityType type, Level world) { super(type, world); @@ -2471,18 +2454,13 @@ index 7827187afa738776908d1c2151556af95affcbe8..05405f22fa9001560eb3a6701f3bb017 + } + // Purpur end + - @Override - public void initAttributes() { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.generateMaxHealth(random)); -@@ -188,6 +197,7 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, - @Override protected void registerGoals() { + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HorseHasRider(this)); // Purpur this.goalSelector.addGoal(1, new PanicGoal(this, 1.2D)); this.goalSelector.addGoal(1, new RunAroundLikeCrazyGoal(this, 1.2D)); this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D, AbstractHorse.class)); -@@ -198,6 +208,7 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, +@@ -160,6 +170,7 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, if (this.canPerformRearing()) { this.goalSelector.addGoal(9, new RandomStandGoal(this)); } @@ -2491,17 +2469,17 @@ index 7827187afa738776908d1c2151556af95affcbe8..05405f22fa9001560eb3a6701f3bb017 this.addBehaviourGoals(); } diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java b/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java -index d3e8b9ddc42c506f8a0b696becc2ca63414db76f..e0568b3401f42ffd5cfd35da52c0a20d8626776e 100644 +index e0dfee0e0ce091d5ae0ec740e939c2c50915c104..6a5fb18523545ccc788b09ab4fbee1b14a64bc63 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java -@@ -30,6 +30,13 @@ public class Donkey extends AbstractChestedHorse { - return generateSpeed(this.level.purpurConfig.donkeyMovementSpeedMin, this.level.purpurConfig.donkeyMovementSpeedMax); +@@ -15,6 +15,13 @@ public class Donkey extends AbstractChestedHorse { + super(type, world); } + // Purpur start + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.donkeyRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.donkeyRidableInWater; + } + // Purpur end + @@ -2509,17 +2487,17 @@ index d3e8b9ddc42c506f8a0b696becc2ca63414db76f..e0568b3401f42ffd5cfd35da52c0a20d protected SoundEvent getAmbientSound() { return SoundEvents.DONKEY_AMBIENT; diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java b/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java -index 62f7cdc02e7eb15a96f20ff48470d9869ec82d59..508111fef316d765d284af31263d5c0dda751774 100644 +index 5f5dc651d570989ec1294c31a14dcfede466b80a..3e50581033e88e8eddcbd85bfa890cbe0b88a7e6 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java -@@ -55,6 +55,13 @@ public class Horse extends AbstractHorse implements VariantHolder { - return generateSpeed(this.level.purpurConfig.horseMovementSpeedMin, this.level.purpurConfig.horseMovementSpeedMax); +@@ -40,6 +40,13 @@ public class Horse extends AbstractHorse implements VariantHolder { + super(type, world); } + // Purpur start + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.horseRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.horseRidableInWater; + } + // Purpur end + @@ -2527,10 +2505,10 @@ index 62f7cdc02e7eb15a96f20ff48470d9869ec82d59..508111fef316d765d284af31263d5c0d protected void randomizeAttributes(RandomSource random) { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue((double)generateMaxHealth(random::nextInt)); diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index fbcd47e656a8d33da08d1d852a959bc7cf3a2394..9dbfefa7311d4c0f6805fce24429bec2739c6c49 100644 +index 3bbb1455773570e3f7f6b8b144d3c589e2705b81..e05f917c462ba5bfb114e402b4f5309f421651fb 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -@@ -77,6 +77,44 @@ public class Llama extends AbstractChestedHorse implements VariantHolder type, Level world) { super(type, world); @@ -2561,34 +2539,28 @@ index fbcd47e656a8d33da08d1d852a959bc7cf3a2394..9dbfefa7311d4c0f6805fce24429bec2 + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.llamaRidable; ++ return level().purpurConfig.llamaRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.llamaRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.llamaRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.llamaControllable; - } - - @Override -@@ -94,6 +132,12 @@ public class Llama extends AbstractChestedHorse implements VariantHolder(this, LivingEntity.class, 0, false, false, WitherBoss.LIVING_ENTITY_SELECTOR)); } -@@ -261,6 +381,16 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -256,6 +376,16 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob @Override protected void customServerAiStep() { @@ -3094,7 +3066,7 @@ index 29c3ae08cdd9b5516f4ae783e6ac0458ba3d3a6d..1fcf73cfe789bfe89c5ac01d4bd260e8 int i; if (this.getInvulnerableTicks() > 0) { -@@ -581,11 +711,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -576,11 +706,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob } public int getAlternativeTarget(int headIndex) { @@ -3128,7 +3100,7 @@ index 9ca1e9d95e62929c0015d5ca2c2f9c70e421842e..93443238b77c04f6a9da3c25427d200c this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, IronGolem.class, true)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Blaze.java b/src/main/java/net/minecraft/world/entity/monster/Blaze.java -index f91fd938ac941a780e1dc72d766985d865cfcb76..f1432703511aee491744c06c1dbfaf2f21b11785 100644 +index 17aa7676ab624440651850bbe5689f8a6c9dbeed..63049b0b4a4ae09e5925129dc363e43dbae23272 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Blaze.java +++ b/src/main/java/net/minecraft/world/entity/monster/Blaze.java @@ -32,6 +32,7 @@ public class Blaze extends Monster { @@ -3139,29 +3111,29 @@ index f91fd938ac941a780e1dc72d766985d865cfcb76..f1432703511aee491744c06c1dbfaf2f this.setPathfindingMalus(BlockPathTypes.WATER, -1.0F); this.setPathfindingMalus(BlockPathTypes.LAVA, 8.0F); this.setPathfindingMalus(BlockPathTypes.DANGER_FIRE, 0.0F); -@@ -39,6 +40,40 @@ public class Blaze extends Monster { +@@ -39,19 +40,55 @@ public class Blaze extends Monster { this.xpReward = 10; } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.blazeRidable; ++ return level().purpurConfig.blazeRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.blazeRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.blazeRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.blazeControllable; ++ return level().purpurConfig.blazeControllable; + } + + @Override + public double getMaxY() { -+ return level.purpurConfig.blazeMaxY; ++ return level().purpurConfig.blazeMaxY; + } + + @Override @@ -3177,11 +3149,6 @@ index f91fd938ac941a780e1dc72d766985d865cfcb76..f1432703511aee491744c06c1dbfaf2f + } + // Purpur end + - @Override - public void initAttributes() { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.blazeMaxHealth); -@@ -46,17 +81,19 @@ public class Blaze extends Monster { - @Override protected void registerGoals() { + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur @@ -3201,7 +3168,7 @@ index f91fd938ac941a780e1dc72d766985d865cfcb76..f1432703511aee491744c06c1dbfaf2f } @Override -@@ -111,6 +148,14 @@ public class Blaze extends Monster { +@@ -106,6 +143,14 @@ public class Blaze extends Monster { @Override protected void customServerAiStep() { @@ -3217,27 +3184,27 @@ index f91fd938ac941a780e1dc72d766985d865cfcb76..f1432703511aee491744c06c1dbfaf2f if (this.nextHeightOffsetChangeTick <= 0) { this.nextHeightOffsetChangeTick = 100; diff --git a/src/main/java/net/minecraft/world/entity/monster/CaveSpider.java b/src/main/java/net/minecraft/world/entity/monster/CaveSpider.java -index 4367d14654aa3e85b821d72ca8243d3976fda072..c232cdd7cde6bcbb2302ff609206f6be8ccf99b3 100644 +index da48bd8e15463be8170262ae90a8e95575959bf2..34abd8093015d7cdaf2faca2396d3950ca0a361b 100644 --- a/src/main/java/net/minecraft/world/entity/monster/CaveSpider.java +++ b/src/main/java/net/minecraft/world/entity/monster/CaveSpider.java -@@ -33,6 +33,23 @@ public class CaveSpider extends Spider { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.caveSpiderMaxHealth); +@@ -28,6 +28,23 @@ public class CaveSpider extends Spider { + return Spider.createAttributes().add(Attributes.MAX_HEALTH, 12.0D); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.caveSpiderRidable; ++ return level().purpurConfig.caveSpiderRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.caveSpiderRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.caveSpiderRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.caveSpiderControllable; ++ return level().purpurConfig.caveSpiderControllable; + } + // Purpur end + @@ -3245,7 +3212,7 @@ index 4367d14654aa3e85b821d72ca8243d3976fda072..c232cdd7cde6bcbb2302ff609206f6be public boolean doHurtTarget(Entity target) { if (super.doHurtTarget(target)) { diff --git a/src/main/java/net/minecraft/world/entity/monster/Creeper.java b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -index d2d7ca4666d4cfd43dfcc8697e0957921bc48e61..e208a743d161f53944cb5756041522658c3c9ce6 100644 +index 71587510ef1b6cbd95cb55556cd93c6c194ea5f5..8782e1b1150dd23fd4a66acdab963b2af5bd4425 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java @@ -59,21 +59,98 @@ public class Creeper extends Monster implements PowerableMob { @@ -3265,17 +3232,17 @@ index d2d7ca4666d4cfd43dfcc8697e0957921bc48e61..e208a743d161f53944cb575604152265 + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.creeperRidable; ++ return level().purpurConfig.creeperRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.creeperRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.creeperRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.creeperControllable; ++ return level().purpurConfig.creeperControllable; + } + + @Override @@ -3347,7 +3314,7 @@ index d2d7ca4666d4cfd43dfcc8697e0957921bc48e61..e208a743d161f53944cb575604152265 this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, true)); this.targetSelector.addGoal(2, new HurtByTargetGoal(this, new Class[0])); } -@@ -327,6 +404,7 @@ public class Creeper extends Monster implements PowerableMob { +@@ -322,6 +399,7 @@ public class Creeper extends Monster implements PowerableMob { com.destroystokyo.paper.event.entity.CreeperIgniteEvent event = new com.destroystokyo.paper.event.entity.CreeperIgniteEvent((org.bukkit.entity.Creeper) getBukkitEntity(), ignited); if (event.callEvent()) { this.entityData.set(Creeper.DATA_IS_IGNITED, event.isIgnited()); @@ -3356,34 +3323,34 @@ index d2d7ca4666d4cfd43dfcc8697e0957921bc48e61..e208a743d161f53944cb575604152265 } // Paper end diff --git a/src/main/java/net/minecraft/world/entity/monster/Drowned.java b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -index c379b5396de408724ccab41d2255a8ce8bcd892a..8fcda30fd2ae9882d7101b24cff70e832db1eee0 100644 +index 991d728db2a3b64316fc2102cf3aee470327a62e..c64c88ddd929d49fcfc6ebc2d0030bc86c8ac337 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java +++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -@@ -78,6 +78,23 @@ public class Drowned extends Zombie implements RangedAttackMob { - this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level.purpurConfig.drownedSpawnReinforcements); +@@ -68,6 +68,23 @@ public class Drowned extends Zombie implements RangedAttackMob { + this.groundNavigation = new GroundPathNavigation(this, world); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.drownedRidable; ++ return level().purpurConfig.drownedRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.drownedRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.drownedRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.drownedControllable; ++ return level().purpurConfig.drownedControllable; + } + // Purpur end + @Override protected void addBehaviourGoals() { this.goalSelector.addGoal(1, new Drowned.DrownedGoToWaterGoal(this, 1.0D)); -@@ -269,8 +286,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -259,8 +276,7 @@ public class Drowned extends Zombie implements RangedAttackMob { this.searchingForLand = targetingUnderwater; } @@ -3393,7 +3360,7 @@ index c379b5396de408724ccab41d2255a8ce8bcd892a..8fcda30fd2ae9882d7101b24cff70e83 private final Drowned drowned; public DrownedMoveControl(Drowned drowned) { -@@ -279,7 +295,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -269,7 +285,7 @@ public class Drowned extends Zombie implements RangedAttackMob { } @Override @@ -3402,7 +3369,7 @@ index c379b5396de408724ccab41d2255a8ce8bcd892a..8fcda30fd2ae9882d7101b24cff70e83 LivingEntity entityliving = this.drowned.getTarget(); if (this.drowned.wantsToSwim() && this.drowned.isInWater()) { -@@ -302,7 +318,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -292,7 +308,7 @@ public class Drowned extends Zombie implements RangedAttackMob { this.drowned.setYRot(this.rotlerp(this.drowned.getYRot(), f, 90.0F)); this.drowned.yBodyRot = this.drowned.getYRot(); @@ -3411,7 +3378,7 @@ index c379b5396de408724ccab41d2255a8ce8bcd892a..8fcda30fd2ae9882d7101b24cff70e83 float f2 = Mth.lerp(0.125F, this.drowned.getSpeed(), f1); this.drowned.setSpeed(f2); -@@ -312,7 +328,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -302,7 +318,7 @@ public class Drowned extends Zombie implements RangedAttackMob { this.drowned.setDeltaMovement(this.drowned.getDeltaMovement().add(0.0D, -0.008D, 0.0D)); } @@ -3421,22 +3388,22 @@ index c379b5396de408724ccab41d2255a8ce8bcd892a..8fcda30fd2ae9882d7101b24cff70e83 } diff --git a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java -index 61fa65292c75661a48012e215368055708560360..63a02ce34b3cf1cd6bfb61cef7488aea67da9046 100644 +index 8f481e11815d7162dd62a2b850b3d2af6d904519..16486ece9fc415d875ff94d9b806b0b5884ebc11 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java +++ b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java -@@ -38,6 +38,18 @@ public class ElderGuardian extends Guardian { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.elderGuardianMaxHealth); +@@ -33,6 +33,18 @@ public class ElderGuardian extends Guardian { + } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.elderGuardianRidable; ++ return level().purpurConfig.elderGuardianRidable; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.elderGuardianControllable; ++ return level().purpurConfig.elderGuardianControllable; + } + // Purpur end + @@ -3444,11 +3411,11 @@ index 61fa65292c75661a48012e215368055708560360..63a02ce34b3cf1cd6bfb61cef7488aea return Guardian.createAttributes().add(Attributes.MOVEMENT_SPEED, 0.30000001192092896D).add(Attributes.ATTACK_DAMAGE, 8.0D).add(Attributes.MAX_HEALTH, 80.0D); } 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 81b3f96b1fe8d592cac95e2deff8395edb6d589c..50925ae443a52833d34304dec30be899dbdaee14 100644 +index 4616addb05fcc20b1ec6ca1dea01cbefed697acd..57637dd43b109ec26bddf389d16452c573aecc07 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -97,9 +97,27 @@ public class EnderMan extends Monster implements NeutralMob { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.endermanMaxHealth); +@@ -92,9 +92,27 @@ public class EnderMan extends Monster implements NeutralMob { + this.setPathfindingMalus(BlockPathTypes.WATER, -1.0F); } + // Purpur start @@ -3475,7 +3442,7 @@ index 81b3f96b1fe8d592cac95e2deff8395edb6d589c..50925ae443a52833d34304dec30be899 this.goalSelector.addGoal(1, new EnderMan.EndermanFreezeWhenLookedAt(this)); this.goalSelector.addGoal(2, new MeleeAttackGoal(this, 1.0D, false)); this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0D, 0.0F)); -@@ -107,6 +125,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -102,6 +120,7 @@ public class EnderMan extends Monster implements NeutralMob { this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); this.goalSelector.addGoal(10, new EnderMan.EndermanLeaveBlockGoal(this)); this.goalSelector.addGoal(11, new EnderMan.EndermanTakeBlockGoal(this)); @@ -3483,7 +3450,7 @@ index 81b3f96b1fe8d592cac95e2deff8395edb6d589c..50925ae443a52833d34304dec30be899 this.targetSelector.addGoal(1, new EnderMan.EndermanLookForPlayerGoal(this, this::isAngryAt)); this.targetSelector.addGoal(2, new HurtByTargetGoal(this, new Class[0])); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Endermite.class, true, false)); -@@ -288,7 +307,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -283,7 +302,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override protected void customServerAiStep() { @@ -3492,7 +3459,7 @@ index 81b3f96b1fe8d592cac95e2deff8395edb6d589c..50925ae443a52833d34304dec30be899 float f = this.getLightLevelDependentMagicValue(); if (f > 0.5F && this.level().canSeeSky(this.blockPosition()) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.RUNAWAY)) { // Paper -@@ -403,6 +422,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -398,6 +417,7 @@ public class EnderMan extends Monster implements NeutralMob { public boolean hurt(DamageSource source, float amount) { if (this.isInvulnerableTo(source)) { return false; @@ -3501,27 +3468,27 @@ index 81b3f96b1fe8d592cac95e2deff8395edb6d589c..50925ae443a52833d34304dec30be899 boolean flag = source.getDirectEntity() instanceof ThrownPotion; boolean flag1; diff --git a/src/main/java/net/minecraft/world/entity/monster/Endermite.java b/src/main/java/net/minecraft/world/entity/monster/Endermite.java -index 07e709f886bd182511d92e27a2f77f8a0c93500f..a3bf2e2d629b7db3c66e684460e79f73857f0f84 100644 +index 29b8771ec85f07fcd9d9ba041c9a25a212009b16..638665391f7552d054965f7e449b96ec6bceb03d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Endermite.java +++ b/src/main/java/net/minecraft/world/entity/monster/Endermite.java -@@ -42,14 +42,33 @@ public class Endermite extends Monster { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.endermiteMaxHealth); +@@ -37,14 +37,33 @@ public class Endermite extends Monster { + this.xpReward = 3; } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.endermiteRidable; ++ return level().purpurConfig.endermiteRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.endermiteRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.endermiteRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.endermiteControllable; ++ return level().purpurConfig.endermiteControllable; + } + // Purpur end + @@ -3539,27 +3506,27 @@ index 07e709f886bd182511d92e27a2f77f8a0c93500f..a3bf2e2d629b7db3c66e684460e79f73 this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); } diff --git a/src/main/java/net/minecraft/world/entity/monster/Evoker.java b/src/main/java/net/minecraft/world/entity/monster/Evoker.java -index a2dc53d9ce6c3bc2278fa389a98f1506bbcccefa..f113c96af07eeceef2e51cd310d46b2763c8224b 100644 +index a6dde4e31790eaecff27135a4036627192c85702..13e0fc756c6f572d0d688ae788e784eda6ce6d98 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Evoker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Evoker.java -@@ -53,10 +53,28 @@ public class Evoker extends SpellcasterIllager { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.evokerMaxHealth); +@@ -48,10 +48,28 @@ public class Evoker extends SpellcasterIllager { + this.xpReward = 10; } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.evokerRidable; ++ return level().purpurConfig.evokerRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.evokerRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.evokerRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.evokerControllable; ++ return level().purpurConfig.evokerControllable; + } + // Purpur end + @@ -3571,7 +3538,7 @@ index a2dc53d9ce6c3bc2278fa389a98f1506bbcccefa..f113c96af07eeceef2e51cd310d46b27 this.goalSelector.addGoal(1, new Evoker.EvokerCastingSpellGoal()); this.goalSelector.addGoal(2, new AvoidEntityGoal<>(this, Player.class, 8.0F, 0.6D, 1.0D)); this.goalSelector.addGoal(4, new Evoker.EvokerSummonSpellGoal()); -@@ -65,6 +83,7 @@ public class Evoker extends SpellcasterIllager { +@@ -60,6 +78,7 @@ public class Evoker extends SpellcasterIllager { this.goalSelector.addGoal(8, new RandomStrollGoal(this, 0.6D)); this.goalSelector.addGoal(9, new LookAtPlayerGoal(this, Player.class, 3.0F, 1.0F)); this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Mob.class, 8.0F)); @@ -3580,7 +3547,7 @@ index a2dc53d9ce6c3bc2278fa389a98f1506bbcccefa..f113c96af07eeceef2e51cd310d46b27 this.targetSelector.addGoal(2, (new NearestAttackableTargetGoal<>(this, Player.class, true)).setUnseenMemoryTicks(300)); this.targetSelector.addGoal(3, (new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)).setUnseenMemoryTicks(300)); 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 2cb35b9b35f1c449784226caf200e8e19dccc64a..20d6c7b352ce13812205ae021f52837647076fe0 100644 +index 592b0dae251800552a0771ec46b4b8532b63075d..9f09ccd41320423179dd1cf81c2a7094b88a008b 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ghast.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ghast.java @@ -44,11 +44,47 @@ public class Ghast extends FlyingMob implements Enemy { @@ -3590,22 +3557,22 @@ index 2cb35b9b35f1c449784226caf200e8e19dccc64a..20d6c7b352ce13812205ae021f528376 + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.ghastRidable; ++ return level().purpurConfig.ghastRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.ghastRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.ghastRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.ghastControllable; ++ return level().purpurConfig.ghastControllable; + } + + @Override + public double getMaxY() { -+ return level.purpurConfig.ghastMaxY; ++ return level().purpurConfig.ghastMaxY; + } + + @Override @@ -3631,7 +3598,7 @@ index 2cb35b9b35f1c449784226caf200e8e19dccc64a..20d6c7b352ce13812205ae021f528376 this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, (entityliving) -> { return Math.abs(entityliving.getY() - this.getY()) <= 4.0D; })); -@@ -108,7 +144,7 @@ public class Ghast extends FlyingMob implements Enemy { +@@ -103,7 +139,7 @@ public class Ghast extends FlyingMob implements Enemy { } public static AttributeSupplier.Builder createAttributes() { @@ -3640,7 +3607,7 @@ index 2cb35b9b35f1c449784226caf200e8e19dccc64a..20d6c7b352ce13812205ae021f528376 } @Override -@@ -165,7 +201,7 @@ public class Ghast extends FlyingMob implements Enemy { +@@ -160,7 +196,7 @@ public class Ghast extends FlyingMob implements Enemy { return 2.6F; } @@ -3649,7 +3616,7 @@ index 2cb35b9b35f1c449784226caf200e8e19dccc64a..20d6c7b352ce13812205ae021f528376 private final Ghast ghast; private int floatDuration; -@@ -176,7 +212,7 @@ public class Ghast extends FlyingMob implements Enemy { +@@ -171,7 +207,7 @@ public class Ghast extends FlyingMob implements Enemy { } @Override @@ -3659,27 +3626,27 @@ index 2cb35b9b35f1c449784226caf200e8e19dccc64a..20d6c7b352ce13812205ae021f528376 if (this.floatDuration-- <= 0) { this.floatDuration += this.ghast.getRandom().nextInt(5) + 2; diff --git a/src/main/java/net/minecraft/world/entity/monster/Giant.java b/src/main/java/net/minecraft/world/entity/monster/Giant.java -index 4a38296843048d3fff255370f980d81d0808bbef..e7e85c830d2a4804c625884010c5fec33008b014 100644 +index 41004c28edb748e12c4f868aa07b4672891197c1..33d9d90495efc8b80a8f948752becfb203ee8e63 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Giant.java +++ b/src/main/java/net/minecraft/world/entity/monster/Giant.java -@@ -21,6 +21,29 @@ public class Giant extends Monster { - this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(this.level.purpurConfig.giantAttackDamage); +@@ -14,6 +14,29 @@ public class Giant extends Monster { + super(type, world); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.giantRidable; ++ return level().purpurConfig.giantRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.giantRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.giantRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.giantControllable; ++ return level().purpurConfig.giantControllable; + } + + @Override @@ -3693,10 +3660,10 @@ index 4a38296843048d3fff255370f980d81d0808bbef..e7e85c830d2a4804c625884010c5fec3 protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) { return 10.440001F; diff --git a/src/main/java/net/minecraft/world/entity/monster/Guardian.java b/src/main/java/net/minecraft/world/entity/monster/Guardian.java -index afae01e4bf1c22eafe06243a23dd21cd6894ca92..773ba2ff81a97f046e795c52bfa534b3cb44cfb9 100644 +index 5e9b9e9f124ec6103b2e832ae94bc5b334a2c533..a893a8cb6f9aa79520d9a7814be459d48e3c6853 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Guardian.java +++ b/src/main/java/net/minecraft/world/entity/monster/Guardian.java -@@ -69,6 +69,14 @@ public class Guardian extends Monster { +@@ -69,15 +69,36 @@ public class Guardian extends Monster { this.xpReward = 10; this.setPathfindingMalus(BlockPathTypes.WATER, 0.0F); this.moveControl = new Guardian.GuardianMoveControl(this); @@ -3711,19 +3678,16 @@ index afae01e4bf1c22eafe06243a23dd21cd6894ca92..773ba2ff81a97f046e795c52bfa534b3 this.clientSideTailAnimation = this.random.nextFloat(); this.clientSideTailAnimationO = this.clientSideTailAnimation; } -@@ -78,11 +86,24 @@ public class Guardian extends Monster { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.guardianMaxHealth); - } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.guardianRidable; ++ return level().purpurConfig.guardianRidable; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.guardianControllable; ++ return level().purpurConfig.guardianControllable; + } + // Purpur end + @@ -3736,7 +3700,7 @@ index afae01e4bf1c22eafe06243a23dd21cd6894ca92..773ba2ff81a97f046e795c52bfa534b3 this.goalSelector.addGoal(4, this.guardianAttackGoal = new Guardian.GuardianAttackGoal(this)); // CraftBukkit - assign field this.goalSelector.addGoal(5, pathfindergoalmovetowardsrestriction); this.goalSelector.addGoal(7, this.randomStrollGoal); -@@ -91,6 +112,7 @@ public class Guardian extends Monster { +@@ -86,6 +107,7 @@ public class Guardian extends Monster { this.goalSelector.addGoal(9, new RandomLookAroundGoal(this)); this.randomStrollGoal.setFlags(EnumSet.of(Goal.Flag.MOVE, Goal.Flag.LOOK)); pathfindergoalmovetowardsrestriction.setFlags(EnumSet.of(Goal.Flag.MOVE, Goal.Flag.LOOK)); @@ -3744,7 +3708,7 @@ index afae01e4bf1c22eafe06243a23dd21cd6894ca92..773ba2ff81a97f046e795c52bfa534b3 this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, LivingEntity.class, 10, true, false, new Guardian.GuardianAttackSelector(this))); } -@@ -356,7 +378,7 @@ public class Guardian extends Monster { +@@ -351,7 +373,7 @@ public class Guardian extends Monster { @Override public void travel(Vec3 movementInput) { if (this.isControlledByLocalInstance() && this.isInWater()) { @@ -3753,7 +3717,7 @@ index afae01e4bf1c22eafe06243a23dd21cd6894ca92..773ba2ff81a97f046e795c52bfa534b3 this.move(MoverType.SELF, this.getDeltaMovement()); this.setDeltaMovement(this.getDeltaMovement().scale(0.9D)); if (!this.isMoving() && this.getTarget() == null) { -@@ -368,7 +390,7 @@ public class Guardian extends Monster { +@@ -363,7 +385,7 @@ public class Guardian extends Monster { } @@ -3762,7 +3726,7 @@ index afae01e4bf1c22eafe06243a23dd21cd6894ca92..773ba2ff81a97f046e795c52bfa534b3 private final Guardian guardian; -@@ -377,8 +399,17 @@ public class Guardian extends Monster { +@@ -372,8 +394,17 @@ public class Guardian extends Monster { this.guardian = guardian; } @@ -3781,7 +3745,7 @@ index afae01e4bf1c22eafe06243a23dd21cd6894ca92..773ba2ff81a97f046e795c52bfa534b3 if (this.operation == MoveControl.Operation.MOVE_TO && !this.guardian.getNavigation().isDone()) { Vec3 vec3d = new Vec3(this.wantedX - this.guardian.getX(), this.wantedY - this.guardian.getY(), this.wantedZ - this.guardian.getZ()); double d0 = vec3d.length(); -@@ -389,7 +420,7 @@ public class Guardian extends Monster { +@@ -384,7 +415,7 @@ public class Guardian extends Monster { this.guardian.setYRot(this.rotlerp(this.guardian.getYRot(), f, 90.0F)); this.guardian.yBodyRot = this.guardian.getYRot(); @@ -3791,27 +3755,27 @@ index afae01e4bf1c22eafe06243a23dd21cd6894ca92..773ba2ff81a97f046e795c52bfa534b3 this.guardian.setSpeed(f2); diff --git a/src/main/java/net/minecraft/world/entity/monster/Husk.java b/src/main/java/net/minecraft/world/entity/monster/Husk.java -index 9e84a90f42c4a526ef067b7aff457c9dcda571ef..83fba266721f17efb92f62cc61dbecf4024fb5d6 100644 +index efe8e6b895da1a81e5de42697fda58443cf15a59..5beed21038f88ebb4826b66013d0ae45a1f1ec34 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Husk.java +++ b/src/main/java/net/minecraft/world/entity/monster/Husk.java -@@ -32,6 +32,23 @@ public class Husk extends Zombie { - this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level.purpurConfig.huskSpawnReinforcements); +@@ -22,6 +22,23 @@ public class Husk extends Zombie { + super(type, world); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.huskRidable; ++ return level().purpurConfig.huskRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.huskRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.huskRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.huskControllable; ++ return level().purpurConfig.huskControllable; + } + // Purpur end + @@ -3819,27 +3783,27 @@ index 9e84a90f42c4a526ef067b7aff457c9dcda571ef..83fba266721f17efb92f62cc61dbecf4 return checkMonsterSpawnRules(type, world, spawnReason, pos, random) && (spawnReason == MobSpawnType.SPAWNER || world.canSeeSky(pos)); } diff --git a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java -index 03646f5ffa43b19679241999877da1e93b293744..d85f8e126832193d6080328d474312d30a81c301 100644 +index 63fce7e3d9f59f36e29bc827a46396d73143bb8b..f83f09f7568c44a1165aac73f7127c5d1af0478f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java +++ b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java -@@ -66,10 +66,28 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.illusionerMaxHealth); +@@ -59,10 +59,28 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { + } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.illusionerRidable; ++ return level().purpurConfig.illusionerRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.illusionerRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.illusionerRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.illusionerControllable; ++ return level().purpurConfig.illusionerControllable; + } + // Purpur end + @@ -3851,7 +3815,7 @@ index 03646f5ffa43b19679241999877da1e93b293744..d85f8e126832193d6080328d474312d3 this.goalSelector.addGoal(1, new SpellcasterIllager.SpellcasterCastingSpellGoal()); this.goalSelector.addGoal(4, new Illusioner.IllusionerMirrorSpellGoal()); this.goalSelector.addGoal(5, new Illusioner.IllusionerBlindnessSpellGoal()); -@@ -77,6 +95,7 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { +@@ -70,6 +88,7 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { this.goalSelector.addGoal(8, new RandomStrollGoal(this, 0.6D)); this.goalSelector.addGoal(9, new LookAtPlayerGoal(this, Player.class, 3.0F, 1.0F)); this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Mob.class, 8.0F)); @@ -3860,27 +3824,27 @@ index 03646f5ffa43b19679241999877da1e93b293744..d85f8e126832193d6080328d474312d3 this.targetSelector.addGoal(2, (new NearestAttackableTargetGoal<>(this, Player.class, true)).setUnseenMemoryTicks(300)); this.targetSelector.addGoal(3, (new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)).setUnseenMemoryTicks(300)); diff --git a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java -index 0f375ed5073435f6826c4d946e50a2d24ae54be0..291e7a1331aade8a413d132d215bc494440b9f51 100644 +index 2858ea5562d06c11e5c7337a2b123f9be7a3f62e..aad51022eac584fbc058c2b25e2bf1929fccca6f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java +++ b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java -@@ -45,6 +45,28 @@ public class MagmaCube extends Slime { - return level.purpurConfig.magmaCubeAttackDamageCache; +@@ -25,6 +25,28 @@ public class MagmaCube extends Slime { + super(type, world); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.magmaCubeRidable; ++ return level().purpurConfig.magmaCubeRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.magmaCubeRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.magmaCubeRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.magmaCubeControllable; ++ return level().purpurConfig.magmaCubeControllable; + } + + @Override @@ -3892,7 +3856,7 @@ index 0f375ed5073435f6826c4d946e50a2d24ae54be0..291e7a1331aade8a413d132d215bc494 public static AttributeSupplier.Builder createAttributes() { return Monster.createMonsterAttributes().add(Attributes.MOVEMENT_SPEED, (double)0.2F); } -@@ -90,11 +112,12 @@ public class MagmaCube extends Slime { +@@ -70,11 +92,12 @@ public class MagmaCube extends Slime { } @Override @@ -3907,7 +3871,7 @@ index 0f375ed5073435f6826c4d946e50a2d24ae54be0..291e7a1331aade8a413d132d215bc494 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -index 07070846057b80eb24e6afa4ddcf39221df0c7b3..5a44bead0ad10deb4ec7d90c86305ae178632e6c 100644 +index 4a132c3eff6978e927bcd4df56b9ce0306af6d19..ea613fe67fcd977aebaae891f95272970ba23698 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java @@ -60,6 +60,64 @@ public class Phantom extends FlyingMob implements Enemy { @@ -3917,22 +3881,22 @@ index 07070846057b80eb24e6afa4ddcf39221df0c7b3..5a44bead0ad10deb4ec7d90c86305ae1 + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.phantomRidable; ++ return level().purpurConfig.phantomRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.phantomRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.phantomRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.phantomControllable; ++ return level().purpurConfig.phantomControllable; + } + + @Override + public double getMaxY() { -+ return level.purpurConfig.phantomMaxY; ++ return level().purpurConfig.phantomMaxY; + } + + @Override @@ -3965,7 +3929,7 @@ index 07070846057b80eb24e6afa4ddcf39221df0c7b3..5a44bead0ad10deb4ec7d90c86305ae1 + org.bukkit.util.Vector target = loc.getDirection().normalize().multiply(100).add(loc.toVector()); + + org.purpurmc.purpur.entity.PhantomFlames flames = new org.purpurmc.purpur.entity.PhantomFlames(level, this); -+ flames.canGrief = level.purpurConfig.phantomAllowGriefing; ++ flames.canGrief = level().purpurConfig.phantomAllowGriefing; + flames.shoot(target.getX() - getX(), target.getY() - getY(), target.getZ() - getZ(), 1.0F, 5.0F); + level.addFreshEntity(flames); + return true; @@ -3987,7 +3951,7 @@ index 07070846057b80eb24e6afa4ddcf39221df0c7b3..5a44bead0ad10deb4ec7d90c86305ae1 this.targetSelector.addGoal(1, new Phantom.PhantomAttackPlayerTargetGoal()); } -@@ -163,6 +223,7 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -145,6 +205,7 @@ public class Phantom extends FlyingMob implements Enemy { @Override public void aiStep() { if (this.isAlive() && shouldBurnInDay && this.isSunBurnTick()) { // Paper - Configurable Burning @@ -3995,7 +3959,7 @@ index 07070846057b80eb24e6afa4ddcf39221df0c7b3..5a44bead0ad10deb4ec7d90c86305ae1 this.setSecondsOnFire(8); } -@@ -287,7 +348,7 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -269,7 +330,7 @@ public class Phantom extends FlyingMob implements Enemy { private AttackPhase() {} } @@ -4004,7 +3968,7 @@ index 07070846057b80eb24e6afa4ddcf39221df0c7b3..5a44bead0ad10deb4ec7d90c86305ae1 private float speed = 0.1F; -@@ -295,8 +356,19 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -277,8 +338,19 @@ public class Phantom extends FlyingMob implements Enemy { super(entity); } @@ -4025,7 +3989,7 @@ index 07070846057b80eb24e6afa4ddcf39221df0c7b3..5a44bead0ad10deb4ec7d90c86305ae1 if (Phantom.this.horizontalCollision) { Phantom.this.setYRot(Phantom.this.getYRot() + 180.0F); this.speed = 0.1F; -@@ -342,14 +414,20 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -324,14 +396,20 @@ public class Phantom extends FlyingMob implements Enemy { } } @@ -4049,27 +4013,27 @@ index 07070846057b80eb24e6afa4ddcf39221df0c7b3..5a44bead0ad10deb4ec7d90c86305ae1 private class PhantomBodyRotationControl extends BodyRotationControl { diff --git a/src/main/java/net/minecraft/world/entity/monster/Pillager.java b/src/main/java/net/minecraft/world/entity/monster/Pillager.java -index 508d76f5120ec614092669af7d7c61f7216c8dc3..594573c2e1f27617dc11e72b97eaf4b6de12e8ed 100644 +index cec545c3baa6599d47b9cf1a4b97de8771062a22..31d204d8d81ccc30371070af3678d82dc721618d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Pillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Pillager.java -@@ -67,15 +67,34 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.pillagerMaxHealth); +@@ -62,15 +62,34 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve + super(type, world); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.pillagerRidable; ++ return level().purpurConfig.pillagerRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.pillagerRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.pillagerRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.pillagerControllable; ++ return level().purpurConfig.pillagerControllable; + } + // Purpur end + @@ -4088,27 +4052,27 @@ index 508d76f5120ec614092669af7d7c61f7216c8dc3..594573c2e1f27617dc11e72b97eaf4b6 this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Ravager.java b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -index 45ac92467b5cdadcc692c8867a52277e1754a934..c35266d89bfacf193662738366a8c91943b29250 100644 +index 75d661c23cde1ba09ea0b673860c9659c32ef77e..4aa0f1a4848411a83b5d211e799c30e743b148fe 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -@@ -70,14 +70,39 @@ public class Ravager extends Raider { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.ravagerMaxHealth); +@@ -65,14 +65,39 @@ public class Ravager extends Raider { + this.setPathfindingMalus(BlockPathTypes.LEAVES, 0.0F); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.ravagerRidable; ++ return level().purpurConfig.ravagerRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.ravagerRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.ravagerRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.ravagerControllable; ++ return level().purpurConfig.ravagerControllable; + } + + @Override @@ -4131,7 +4095,7 @@ index 45ac92467b5cdadcc692c8867a52277e1754a934..c35266d89bfacf193662738366a8c919 this.targetSelector.addGoal(2, (new HurtByTargetGoal(this, new Class[]{Raider.class})).setAlertOthers()); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Player.class, true)); this.targetSelector.addGoal(4, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, true, (entityliving) -> { -@@ -155,7 +180,7 @@ public class Ravager extends Raider { +@@ -150,7 +175,7 @@ public class Ravager extends Raider { @Override public void aiStep() { super.aiStep(); @@ -4141,35 +4105,30 @@ index 45ac92467b5cdadcc692c8867a52277e1754a934..c35266d89bfacf193662738366a8c919 this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(0.0D); } else { diff --git a/src/main/java/net/minecraft/world/entity/monster/Shulker.java b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -index b7900691214fabe130f163253879c38952b9a20b..ba3246b099ae13f83b4aa94903192018518c2b6e 100644 +index cdccbe68fb591181517893a5dd1e93489b578f4d..d4b318fc6382cd043e34db0d12d78e3561023dd5 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -@@ -98,6 +98,23 @@ public class Shulker extends AbstractGolem implements VariantHolder(this, Player.class, true)); } diff --git a/src/main/java/net/minecraft/world/entity/monster/Skeleton.java b/src/main/java/net/minecraft/world/entity/monster/Skeleton.java -index f0bbfa0317b56a7ddb829ba55879d371632c9320..a0e73a09ce443d5ce0031acd2d5bf4559b48893f 100644 +index 8b818a7cb835512c4bd2ea9641d4bfd904150332..4db19589d19d1a0e488ddd0b691e81152ac236e4 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Skeleton.java +++ b/src/main/java/net/minecraft/world/entity/monster/Skeleton.java -@@ -31,6 +31,23 @@ public class Skeleton extends AbstractSkeleton { - this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.skeletonMaxHealth); +@@ -26,6 +26,23 @@ public class Skeleton extends AbstractSkeleton { + super(type, world); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.skeletonRidable; ++ return level().purpurConfig.skeletonRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.skeletonRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.skeletonRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.skeletonControllable; ++ return level().purpurConfig.skeletonControllable; + } + // Purpur end + @@ -4257,7 +4216,7 @@ index f0bbfa0317b56a7ddb829ba55879d371632c9320..a0e73a09ce443d5ce0031acd2d5bf455 protected void defineSynchedData() { super.defineSynchedData(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Slime.java b/src/main/java/net/minecraft/world/entity/monster/Slime.java -index ccbe63cae3a719e73013dd3da1c5179bdf9ccc75..18a7257de4fffd9d4edebbad8eb0f64546284748 100644 +index 343433158507451152e5b2fc5e5fd0b0e6b229db..c74db4080ad3d726c4b5cb374e20e6df2a262d2f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Slime.java +++ b/src/main/java/net/minecraft/world/entity/monster/Slime.java @@ -64,6 +64,7 @@ public class Slime extends Mob implements Enemy { @@ -4268,24 +4227,24 @@ index ccbe63cae3a719e73013dd3da1c5179bdf9ccc75..18a7257de4fffd9d4edebbad8eb0f645 public Slime(EntityType type, Level world) { super(type, world); -@@ -102,12 +103,48 @@ public class Slime extends Mob implements Enemy { - return value; +@@ -71,12 +72,48 @@ public class Slime extends Mob implements Enemy { + this.moveControl = new Slime.SlimeMoveControl(this); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.slimeRidable; ++ return level().purpurConfig.slimeRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.slimeRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.slimeRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.slimeControllable; ++ return level().purpurConfig.slimeControllable; + } + + @Override @@ -4317,7 +4276,7 @@ index ccbe63cae3a719e73013dd3da1c5179bdf9ccc75..18a7257de4fffd9d4edebbad8eb0f645 this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, (entityliving) -> { return Math.abs(entityliving.getY() - this.getY()) <= 4.0D; })); -@@ -399,11 +436,12 @@ public class Slime extends Mob implements Enemy { +@@ -368,11 +405,12 @@ public class Slime extends Mob implements Enemy { } @Override @@ -4331,7 +4290,7 @@ index ccbe63cae3a719e73013dd3da1c5179bdf9ccc75..18a7257de4fffd9d4edebbad8eb0f645 } @Nullable -@@ -437,7 +475,7 @@ public class Slime extends Mob implements Enemy { +@@ -406,7 +444,7 @@ public class Slime extends Mob implements Enemy { return super.getDimensions(pose).scale(0.255F * (float) this.getSize()); } @@ -4340,7 +4299,7 @@ index ccbe63cae3a719e73013dd3da1c5179bdf9ccc75..18a7257de4fffd9d4edebbad8eb0f645 private float yRot; private int jumpDelay; -@@ -456,21 +494,33 @@ public class Slime extends Mob implements Enemy { +@@ -425,21 +463,33 @@ public class Slime extends Mob implements Enemy { } public void setWantedMovement(double speed) { @@ -4377,7 +4336,7 @@ index ccbe63cae3a719e73013dd3da1c5179bdf9ccc75..18a7257de4fffd9d4edebbad8eb0f645 if (this.jumpDelay-- <= 0) { this.jumpDelay = this.slime.getJumpDelay(); if (this.isAggressive) { -@@ -487,7 +537,7 @@ public class Slime extends Mob implements Enemy { +@@ -456,7 +506,7 @@ public class Slime extends Mob implements Enemy { this.mob.setSpeed(0.0F); } } else { @@ -4387,27 +4346,27 @@ index ccbe63cae3a719e73013dd3da1c5179bdf9ccc75..18a7257de4fffd9d4edebbad8eb0f645 } diff --git a/src/main/java/net/minecraft/world/entity/monster/Spider.java b/src/main/java/net/minecraft/world/entity/monster/Spider.java -index 4d9be4599d7181bc891bf86c01299b8ed460d916..9ae41d3baf305baed2642af1d2935e36aa312516 100644 +index 05432184077752b1d0cb764a5e39ed875748b2d6..9f6eaf76a39a9c3e7aed2e0ce91960200b4de664 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Spider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Spider.java -@@ -56,14 +56,33 @@ public class Spider extends Monster { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.spiderMaxHealth); +@@ -51,14 +51,33 @@ public class Spider extends Monster { + super(type, world); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.spiderRidable; ++ return level().purpurConfig.spiderRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.spiderRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.spiderRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.spiderControllable; ++ return level().purpurConfig.spiderControllable; + } + // Purpur end + @@ -4425,27 +4384,27 @@ index 4d9be4599d7181bc891bf86c01299b8ed460d916..9ae41d3baf305baed2642af1d2935e36 this.targetSelector.addGoal(2, new Spider.SpiderTargetGoal<>(this, Player.class)); this.targetSelector.addGoal(3, new Spider.SpiderTargetGoal<>(this, IronGolem.class)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Stray.java b/src/main/java/net/minecraft/world/entity/monster/Stray.java -index 36ae65cb4510f8706f55fb851d37b121ca431ace..05b52df61a8c4c939f687e3988f25ab215a29632 100644 +index 118b636a44e4b062e812e433f603b039276337da..137ee6d1aa8ec334009b6fab21b9f30303ace45f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Stray.java +++ b/src/main/java/net/minecraft/world/entity/monster/Stray.java -@@ -26,6 +26,23 @@ public class Stray extends AbstractSkeleton { - this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.strayMaxHealth); +@@ -21,6 +21,23 @@ public class Stray extends AbstractSkeleton { + super(type, world); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.strayRidable; ++ return level().purpurConfig.strayRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.strayRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.strayRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.strayControllable; ++ return level().purpurConfig.strayControllable; + } + // Purpur end + @@ -4453,34 +4412,34 @@ index 36ae65cb4510f8706f55fb851d37b121ca431ace..05b52df61a8c4c939f687e3988f25ab2 BlockPos blockPos = pos; diff --git a/src/main/java/net/minecraft/world/entity/monster/Strider.java b/src/main/java/net/minecraft/world/entity/monster/Strider.java -index bf44fc59eb4f2d18c728a7c24fd8b5c518208f09..abefdf6679a4e15ccec4b67147d85bfc6271ac4b 100644 +index ebf54d6e36fdee2833250816fae14195ac45eb67..ccc76bf5431af723eef8e4d39c96daa44d1f6b5c 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Strider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java -@@ -105,6 +105,23 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.striderMaxHealth); +@@ -100,6 +100,23 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { + this.setPathfindingMalus(BlockPathTypes.DAMAGE_FIRE, 0.0F); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.striderRidable; ++ return level().purpurConfig.striderRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.striderRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.striderRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.striderControllable; ++ return level().purpurConfig.striderControllable; + } + // Purpur end + public static boolean checkStriderSpawnRules(EntityType type, LevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { BlockPos.MutableBlockPos blockposition_mutableblockposition = pos.mutable(); -@@ -166,6 +183,7 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { +@@ -161,6 +178,7 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { @Override protected void registerGoals() { this.panicGoal = new PanicGoal(this, 1.65D); @@ -4488,7 +4447,7 @@ index bf44fc59eb4f2d18c728a7c24fd8b5c518208f09..abefdf6679a4e15ccec4b67147d85bfc this.goalSelector.addGoal(1, this.panicGoal); this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); this.temptGoal = new TemptGoal(this, 1.4D, Strider.TEMPT_ITEMS, false); -@@ -475,7 +493,7 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { +@@ -470,7 +488,7 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { if (!enuminteractionresult.consumesAction()) { ItemStack itemstack = player.getItemInHand(hand); @@ -4498,32 +4457,32 @@ index bf44fc59eb4f2d18c728a7c24fd8b5c518208f09..abefdf6679a4e15ccec4b67147d85bfc if (flag && !this.isSilent()) { this.level().playSound((Player) null, this.getX(), this.getY(), this.getZ(), SoundEvents.STRIDER_EAT, this.getSoundSource(), 1.0F, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F); diff --git a/src/main/java/net/minecraft/world/entity/monster/Vex.java b/src/main/java/net/minecraft/world/entity/monster/Vex.java -index 41b6c2d33121144e062f0733db55ec6a40603020..f63b6c2a61af9b518a59aba4152a76afbf8df592 100644 +index 65cb385ab294e362d666a6d03c4496cdc3b64890..40f42c83d6417258123753ba9315ca27c2b43b22 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vex.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vex.java -@@ -68,6 +68,50 @@ public class Vex extends Monster implements TraceableEntity { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.vexMaxHealth); +@@ -63,6 +63,50 @@ public class Vex extends Monster implements TraceableEntity { + this.xpReward = 3; } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.vexRidable; ++ return level().purpurConfig.vexRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.vexRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.vexRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.vexControllable; ++ return level().purpurConfig.vexControllable; + } + + @Override + public double getMaxY() { -+ return level.purpurConfig.vexMaxY; ++ return level().purpurConfig.vexMaxY; + } + + @Override @@ -4552,7 +4511,7 @@ index 41b6c2d33121144e062f0733db55ec6a40603020..f63b6c2a61af9b518a59aba4152a76af @Override protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) { return dimensions.height - 0.28125F; -@@ -86,7 +130,7 @@ public class Vex extends Monster implements TraceableEntity { +@@ -81,7 +125,7 @@ public class Vex extends Monster implements TraceableEntity { @Override public void tick() { @@ -4561,7 +4520,7 @@ index 41b6c2d33121144e062f0733db55ec6a40603020..f63b6c2a61af9b518a59aba4152a76af super.tick(); this.noPhysics = false; this.setNoGravity(true); -@@ -101,17 +145,19 @@ public class Vex extends Monster implements TraceableEntity { +@@ -96,17 +140,19 @@ public class Vex extends Monster implements TraceableEntity { protected void registerGoals() { super.registerGoals(); this.goalSelector.addGoal(0, new FloatGoal(this)); @@ -4582,7 +4541,7 @@ index 41b6c2d33121144e062f0733db55ec6a40603020..f63b6c2a61af9b518a59aba4152a76af } @Override -@@ -240,14 +286,14 @@ public class Vex extends Monster implements TraceableEntity { +@@ -235,14 +281,14 @@ public class Vex extends Monster implements TraceableEntity { return 0.4D; } @@ -4599,7 +4558,7 @@ index 41b6c2d33121144e062f0733db55ec6a40603020..f63b6c2a61af9b518a59aba4152a76af if (this.operation == MoveControl.Operation.MOVE_TO) { Vec3 vec3d = new Vec3(this.wantedX - Vex.this.getX(), this.wantedY - Vex.this.getY(), this.wantedZ - Vex.this.getZ()); double d0 = vec3d.length(); -@@ -256,7 +302,7 @@ public class Vex extends Monster implements TraceableEntity { +@@ -251,7 +297,7 @@ public class Vex extends Monster implements TraceableEntity { this.operation = MoveControl.Operation.WAIT; Vex.this.setDeltaMovement(Vex.this.getDeltaMovement().scale(0.5D)); } else { @@ -4609,27 +4568,27 @@ index 41b6c2d33121144e062f0733db55ec6a40603020..f63b6c2a61af9b518a59aba4152a76af Vec3 vec3d1 = Vex.this.getDeltaMovement(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java -index 3bf6463d356f3ba64c2d5279cbf79c289fc09a8f..fdbcf72f35b6801fed4db127710a72579c823fe1 100644 +index 2acc531bd9e948251cac77d979f973678f576394..f8337259af80cede27e9a37c5634ccba9f837076 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java -@@ -63,14 +63,33 @@ public class Vindicator extends AbstractIllager { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.vindicatorMaxHealth); +@@ -58,14 +58,33 @@ public class Vindicator extends AbstractIllager { + super(type, world); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.vindicatorRidable; ++ return level().purpurConfig.vindicatorRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.vindicatorRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.vindicatorRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.vindicatorControllable; ++ return level().purpurConfig.vindicatorControllable; + } + // Purpur end + @@ -4647,34 +4606,34 @@ index 3bf6463d356f3ba64c2d5279cbf79c289fc09a8f..fdbcf72f35b6801fed4db127710a7257 this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, true)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Witch.java b/src/main/java/net/minecraft/world/entity/monster/Witch.java -index 956e0f5ea71f01f4ae192c8c8e0f1e8b323b06ba..2ca044d6ab0acf56fbbe43e936c844d370c1d97c 100644 +index 701f6bf1d558cf0ec4bc1abb9e1f66d96ea5a6c9..c7ceeb28b53879395c697cbb3778563511bc1209 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Witch.java +++ b/src/main/java/net/minecraft/world/entity/monster/Witch.java -@@ -62,6 +62,23 @@ public class Witch extends Raider implements RangedAttackMob { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.witchMaxHealth); +@@ -57,6 +57,23 @@ public class Witch extends Raider implements RangedAttackMob { + super(type, world); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.witchRidable; ++ return level().purpurConfig.witchRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.witchRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.witchRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.witchControllable; ++ return level().purpurConfig.witchControllable; + } + // Purpur end + @Override protected void registerGoals() { super.registerGoals(); -@@ -70,10 +87,12 @@ public class Witch extends Raider implements RangedAttackMob { +@@ -65,10 +82,12 @@ public class Witch extends Raider implements RangedAttackMob { }); this.attackPlayersGoal = new NearestAttackableWitchTargetGoal<>(this, Player.class, 10, true, false, (Predicate) null); this.goalSelector.addGoal(1, new FloatGoal(this)); @@ -4688,27 +4647,27 @@ index 956e0f5ea71f01f4ae192c8c8e0f1e8b323b06ba..2ca044d6ab0acf56fbbe43e936c844d3 this.targetSelector.addGoal(2, this.healRaidersGoal); this.targetSelector.addGoal(3, this.attackPlayersGoal); diff --git a/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java -index dda157fa91572198407a0840079cd18473adae4e..8baf2c7bf590620baeb6b93cae64c07df0f434e5 100644 +index 9a81cb0c3a5ac40ff50dc7c81f6196a447cd03c6..45c7d673cb15fc002538c2713e36f591fe33de92 100644 --- a/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java +++ b/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java -@@ -40,6 +40,23 @@ public class WitherSkeleton extends AbstractSkeleton { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.witherSkeletonMaxHealth); +@@ -35,6 +35,23 @@ public class WitherSkeleton extends AbstractSkeleton { + this.setPathfindingMalus(BlockPathTypes.LAVA, 8.0F); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.witherSkeletonRidable; ++ return level().purpurConfig.witherSkeletonRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.witherSkeletonRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.witherSkeletonRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.witherSkeletonControllable; ++ return level().purpurConfig.witherSkeletonControllable; + } + // Purpur end + @@ -4716,34 +4675,34 @@ index dda157fa91572198407a0840079cd18473adae4e..8baf2c7bf590620baeb6b93cae64c07d protected void registerGoals() { this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractPiglin.class, true)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -index 54ce647b16efcc15d378009e56691cdf47bd04e4..a5ce5e82f12bef3bdd5a4a87409aa31787bb90ac 100644 +index 7815af9b64ead32d6f7bcad6f86b2d21ec4aec22..393dde215894616c073efd28b529c9dac9815adc 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -@@ -72,6 +72,23 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.zoglinMaxHealth); +@@ -67,6 +67,23 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { + this.xpReward = 5; } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.zoglinRidable; ++ return level().purpurConfig.zoglinRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.zoglinRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.zoglinRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.zoglinControllable; ++ return level().purpurConfig.zoglinControllable; + } + // Purpur end + @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -@@ -204,6 +221,7 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { +@@ -199,6 +216,7 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { @Override protected void customServerAiStep() { this.level().getProfiler().push("zoglinBrain"); @@ -4752,35 +4711,30 @@ index 54ce647b16efcc15d378009e56691cdf47bd04e4..a5ce5e82f12bef3bdd5a4a87409aa317 this.level().getProfiler().pop(); this.updateActivity(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index 3263d467cbff5cd7382f9618c342314aafb2a004..a825c0e976a6bbddc5688bfe0010f8d653f27e08 100644 +index 3f8c1d1d3c408fc4f15c4b5680bc22c86f104a9d..d3f1bcd9daeea282bef549ea18cedf0fc7a9ad8d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -106,6 +106,23 @@ public class Zombie extends Monster { +@@ -106,11 +106,30 @@ public class Zombie extends Monster { this(EntityType.ZOMBIE, world); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.zombieRidable; ++ return level().purpurConfig.zombieRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.zombieRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.zombieRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.zombieControllable; ++ return level().purpurConfig.zombieControllable; + } + // Purpur end + - @Override - public void initAttributes() { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.zombieMaxHealth); -@@ -113,9 +130,11 @@ public class Zombie extends Monster { - @Override protected void registerGoals() { + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur @@ -4792,27 +4746,27 @@ index 3263d467cbff5cd7382f9618c342314aafb2a004..a825c0e976a6bbddc5688bfe0010f8d6 } 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 7ca69d4ae42f982eef7c4470d6a28a3eb334401c..0f42ae8062d2e3044accbc7fa296be9ae7ca7605 100644 +index 25ed5571b24e590bc95056020d84496492b53298..87ae149be7a3eaf14406a7df9f174574d77c63c5 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -89,6 +89,23 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { - this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level.purpurConfig.zombieVillagerSpawnReinforcements); +@@ -79,6 +79,23 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { + }); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.zombieVillagerRidable; ++ return level().purpurConfig.zombieVillagerRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.zombieVillagerRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.zombieVillagerRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.zombieVillagerControllable; ++ return level().purpurConfig.zombieVillagerControllable; + } + // Purpur end + @@ -4820,27 +4774,27 @@ index 7ca69d4ae42f982eef7c4470d6a28a3eb334401c..0f42ae8062d2e3044accbc7fa296be9a protected void defineSynchedData() { super.defineSynchedData(); diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index 5e97cec00a6ea97520f0e5acb6e30d5e7e5fab89..468923229dfda00eb704040461f8639bfa5082a7 100644 +index aff140cfb2bbdce8b512080cf394c84c5c4ff807..fe9bdc4006b916748e55a976b6c8621070fb73c5 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -68,6 +68,23 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.zombifiedPiglinMaxHealth); +@@ -63,6 +63,23 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { + this.setPathfindingMalus(BlockPathTypes.LAVA, 8.0F); } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.zombifiedPiglinRidable; ++ return level().purpurConfig.zombifiedPiglinRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.zombifiedPiglinRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.zombifiedPiglinRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.zombifiedPiglinControllable; ++ return level().purpurConfig.zombifiedPiglinControllable; + } + // Purpur end + @@ -4848,34 +4802,34 @@ index 5e97cec00a6ea97520f0e5acb6e30d5e7e5fab89..468923229dfda00eb704040461f8639b public void setPersistentAngerTarget(@Nullable UUID angryAt) { this.persistentAngerTarget = angryAt; diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index 139c0853d54f736d61ae8c2f90c8bef9e4acb164..419377b795f88a8ab67e048e78292a1387ca13e1 100644 +index e8f6c34ea789136d63c0aa88aec90203ef6282b5..e071796123ff391ea81ed765c2014e58b20cdc25 100644 --- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -72,6 +72,23 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.hoglinMaxHealth); +@@ -67,6 +67,23 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { + this.xpReward = 5; } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.hoglinRidable; ++ return level().purpurConfig.hoglinRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.hoglinRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.hoglinRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.hoglinControllable; ++ return level().purpurConfig.hoglinControllable; + } + // Purpur end + @Override public boolean canBeLeashed(Player player) { return !this.isLeashed(); -@@ -134,6 +151,7 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -129,6 +146,7 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { @Override protected void customServerAiStep() { this.level().getProfiler().push("hoglinBrain"); @@ -4884,34 +4838,34 @@ index 139c0853d54f736d61ae8c2f90c8bef9e4acb164..419377b795f88a8ab67e048e78292a13 this.level().getProfiler().pop(); HoglinAi.updateActivity(this); diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -index 7e1a46eba403e238c266680e9f1fae435a246e1c..bd084cfaecee1098b29e03f75d64e3fecd10a1ea 100644 +index 27d9145693a772cd1b5d171da303c934101f3be8..bc01cad31c977dc45f8d252ca742c409da7f1c30 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -101,6 +101,23 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.piglinMaxHealth); +@@ -96,6 +96,23 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento + this.xpReward = 5; } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.piglinRidable; ++ return level().purpurConfig.piglinRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.piglinRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.piglinRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.piglinControllable; ++ return level().purpurConfig.piglinControllable; + } + // Purpur end + @Override public void addAdditionalSaveData(CompoundTag nbt) { super.addAdditionalSaveData(nbt); -@@ -313,6 +330,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -308,6 +325,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @Override protected void customServerAiStep() { this.level().getProfiler().push("piglinBrain"); @@ -4920,34 +4874,34 @@ index 7e1a46eba403e238c266680e9f1fae435a246e1c..bd084cfaecee1098b29e03f75d64e3fe this.level().getProfiler().pop(); PiglinAi.updateActivity(this); diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -index 5f4dcb1d2fd8e3354fb5148512648062463b5bd8..349fb046ba7930af29251973efde4e1ecfef16f4 100644 +index e1be4a77fae0b9120781f460079269b85c993930..2d842c0dfce1c7e7229bd42b2a92c024a4162b68 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -@@ -46,6 +46,23 @@ public class PiglinBrute extends AbstractPiglin { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.piglinBruteMaxHealth); +@@ -41,6 +41,23 @@ public class PiglinBrute extends AbstractPiglin { + this.xpReward = 20; } + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.piglinBruteRidable; ++ return level().purpurConfig.piglinBruteRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.piglinBruteRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.piglinBruteRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.piglinBruteControllable; ++ return level().purpurConfig.piglinBruteControllable; + } + // Purpur end + public static AttributeSupplier.Builder createAttributes() { return Monster.createMonsterAttributes().add(Attributes.MAX_HEALTH, 50.0D).add(Attributes.MOVEMENT_SPEED, (double)0.35F).add(Attributes.ATTACK_DAMAGE, 7.0D); } -@@ -91,6 +108,7 @@ public class PiglinBrute extends AbstractPiglin { +@@ -86,6 +103,7 @@ public class PiglinBrute extends AbstractPiglin { @Override protected void customServerAiStep() { this.level().getProfiler().push("piglinBruteBrain"); @@ -4956,7 +4910,7 @@ index 5f4dcb1d2fd8e3354fb5148512648062463b5bd8..349fb046ba7930af29251973efde4e1e this.level().getProfiler().pop(); PiglinBruteAi.updateActivity(this); diff --git a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java -index 97b763431bc5015448ee7a26a340635a932c950b..fef81fe4db0f5e8a7dcc03bf821c9e8f2acff8aa 100644 +index 97b763431bc5015448ee7a26a340635a932c950b..9f5e44d3d44a7ca546c410a40c9397a4e3b27b79 100644 --- a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java +++ b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java @@ -121,8 +121,32 @@ public class Warden extends Monster implements VibrationSystem { @@ -4969,17 +4923,17 @@ index 97b763431bc5015448ee7a26a340635a932c950b..fef81fe4db0f5e8a7dcc03bf821c9e8f + // Purpur start + @Override + public boolean isRidable() { -+ return level.purpurConfig.wardenRidable; ++ return level().purpurConfig.wardenRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.wardenRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.wardenRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level.purpurConfig.wardenControllable; ++ return level().purpurConfig.wardenControllable; + } + + @Override @@ -5016,11 +4970,11 @@ index 97b763431bc5015448ee7a26a340635a932c950b..fef81fe4db0f5e8a7dcc03bf821c9e8f public static void applyDarknessAround(ServerLevel world, Vec3 pos, @Nullable Entity entity, int range) { diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 423d0eb98c144d98622884212235b33213aaac6e..dc8225eb864b0fead5990762669dc219e6e8c526 100644 +index e30d5ae3e2900f43d7cafde71b8196f26e872841..b1cde791f4994bb0b4ddc063d3c31d16a10b62a5 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -159,6 +159,28 @@ public class Villager extends AbstractVillager implements ReputationEventHandler - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.villagerMaxHealth); +@@ -154,6 +154,28 @@ public class Villager extends AbstractVillager implements ReputationEventHandler + this.setVillagerData(this.getVillagerData().setType(type).setProfession(VillagerProfession.NONE)); } + // Purpur start @@ -5048,7 +5002,7 @@ index 423d0eb98c144d98622884212235b33213aaac6e..dc8225eb864b0fead5990762669dc219 @Override public Brain getBrain() { return (Brain) super.getBrain(); // CraftBukkit - decompile error -@@ -259,6 +281,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -254,6 +276,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler // Paper end this.level().getProfiler().push("villagerBrain"); if (!inactive) this.getBrain().tick((ServerLevel) this.level(), this); // Paper @@ -5056,7 +5010,7 @@ index 423d0eb98c144d98622884212235b33213aaac6e..dc8225eb864b0fead5990762669dc219 this.level().getProfiler().pop(); if (this.assignProfessionWhenSpawned) { this.assignProfessionWhenSpawned = false; -@@ -315,7 +338,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -310,7 +333,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler if (!itemstack.is(Items.VILLAGER_SPAWN_EGG) && this.isAlive() && !this.isTrading() && !this.isSleeping()) { if (this.isBaby()) { this.setUnhappy(); @@ -5065,7 +5019,7 @@ index 423d0eb98c144d98622884212235b33213aaac6e..dc8225eb864b0fead5990762669dc219 } else { boolean flag = this.getOffers().isEmpty(); -@@ -328,8 +351,9 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -323,8 +346,9 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } if (flag) { @@ -5077,11 +5031,11 @@ index 423d0eb98c144d98622884212235b33213aaac6e..dc8225eb864b0fead5990762669dc219 this.startTrading(player); } diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index 5df4c2468ff809b805d4f16021e7ffd2c1c2dd33..bb8d422f8c2ac80457970f300390b797e8807dd8 100644 +index 2e7de2378e01aed514e237029d6d64e78871c9b4..d434b96b878652190fac4e2882b7b7373febbbd5 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -@@ -71,6 +71,23 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill - this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.wanderingTraderMaxHealth); +@@ -66,6 +66,23 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill + this.setDespawnDelay(48000); // CraftBukkit - set default from MobSpawnerTrader } + // Purpur - start @@ -5104,7 +5058,7 @@ index 5df4c2468ff809b805d4f16021e7ffd2c1c2dd33..bb8d422f8c2ac80457970f300390b797 @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); -@@ -118,8 +135,9 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill +@@ -113,8 +130,9 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill } if (this.getOffers().isEmpty()) { @@ -5116,10 +5070,10 @@ index 5df4c2468ff809b805d4f16021e7ffd2c1c2dd33..bb8d422f8c2ac80457970f300390b797 this.setTradingPlayer(player); this.openTradingScreen(player, this.getDisplayName(), 1); diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index 6b068863368e3f0c1102f35b87ffce3f77370fcb..96726f06b83193fd7c5156efe6411b10eb1db435 100644 +index 58152160d609d0e9d105153aeb166a56a7955603..cf008b8c7a2eb0c642fd9c2da376df86dcd588e2 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java -@@ -199,6 +199,19 @@ public abstract class Player extends LivingEntity { +@@ -198,6 +198,19 @@ public abstract class Player extends LivingEntity { } // CraftBukkit end @@ -5233,12 +5187,12 @@ index 1ced79cf92fe0b01a42f097794dacc3ce74518f3..f759b1b25e3f4fbbb1dd0b222c70698e event = new EntityDamageEvent(damagee.getBukkitEntity(), cause, modifiers, modifierFunctions); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index 5b10feadf1ec5e7bbba4244b6347fdedd0f4b1d4..687710a138edd8492e58aa026872851d00466508 100644 +index 9fe1cdafdafc3f718ef4eb4fd4150971e2832738..0cab29584c4d5205950571660b6c271d34e403eb 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -207,4 +207,9 @@ public class PurpurConfig { - org.bukkit.event.inventory.InventoryType.ENDER_CHEST.setDefaultSize(enderChestSixRows ? 54 : 27); - enderChestPermissionRows = getBoolean("settings.blocks.ender_chest.use-permissions-for-rows", enderChestPermissionRows); +@@ -172,4 +172,9 @@ public class PurpurConfig { + } + return builder.build(); } + + public static String cannotRideMob = "You cannot mount that mob"; @@ -5247,12 +5201,12 @@ index 5b10feadf1ec5e7bbba4244b6347fdedd0f4b1d4..687710a138edd8492e58aa026872851d + } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3a44c1fff53590ae5c65404564a3a2ee12be62cf..f004e4290c0711d2e04c05677981f31b463af9fe 100644 +index 2b7f1dedb3289efc7e42a138f4483f4969902801..ec168b917d60cc6d8c48620eb4dcd89b0b121aea 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -988,4 +988,717 @@ public class PurpurWorldConfig { - zombifiedPiglinMaxHealth = getDouble("mobs.zombified_piglin.attributes.max_health", zombifiedPiglinMaxHealth); - zombifiedPiglinSpawnReinforcements = getDouble("mobs.zombified_piglin.attributes.spawn_reinforcements", zombifiedPiglinSpawnReinforcements); +@@ -91,4 +91,717 @@ public class PurpurWorldConfig { + final Map value = PurpurConfig.getMap("world-settings." + worldName + "." + path, null); + return value.isEmpty() ? fallback : value; } + + public boolean babiesAreRidable = true; @@ -6349,7 +6303,7 @@ index 0000000000000000000000000000000000000000..ba2a37dad43e238e54632975abea8ee6 +} diff --git a/src/main/java/org/purpurmc/purpur/entity/DolphinSpit.java b/src/main/java/org/purpurmc/purpur/entity/DolphinSpit.java new file mode 100644 -index 0000000000000000000000000000000000000000..602df34e3ec0d05f58737a54a1e8585e8730095c +index 0000000000000000000000000000000000000000..a3512b14ecc5b855831e44e7a34d6eba37851e76 --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/entity/DolphinSpit.java @@ -0,0 +1,99 @@ @@ -6438,7 +6392,7 @@ index 0000000000000000000000000000000000000000..602df34e3ec0d05f58737a54a1e8585e + protected void onHitEntity(EntityHitResult entityHitResult) { + Entity shooter = this.getOwner(); + if (shooter instanceof LivingEntity) { -+ entityHitResult.getEntity().hurt(entityHitResult.getEntity().damageSources().mobProjectile(this, (LivingEntity) shooter), level.purpurConfig.dolphinSpitDamage); ++ entityHitResult.getEntity().hurt(entityHitResult.getEntity().damageSources().mobProjectile(this, (LivingEntity) shooter), level().purpurConfig.dolphinSpitDamage); + } + } + @@ -6454,7 +6408,7 @@ index 0000000000000000000000000000000000000000..602df34e3ec0d05f58737a54a1e8585e +} diff --git a/src/main/java/org/purpurmc/purpur/entity/PhantomFlames.java b/src/main/java/org/purpurmc/purpur/entity/PhantomFlames.java new file mode 100644 -index 0000000000000000000000000000000000000000..9ee7fc642d05fd61d91d09c754c6f0680bc39e56 +index 0000000000000000000000000000000000000000..c99c7d296126dc36641d2d391092fa1f383a62bf --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/entity/PhantomFlames.java @@ -0,0 +1,114 @@ @@ -6552,9 +6506,9 @@ index 0000000000000000000000000000000000000000..9ee7fc642d05fd61d91d09c754c6f068 + if (shooter instanceof LivingEntity) { + Entity target = entityHitResult.getEntity(); + if (canGrief || (target instanceof LivingEntity && !(target instanceof ArmorStand))) { -+ boolean hurt = target.hurt(target.damageSources().mobProjectile(this, (LivingEntity) shooter), level.purpurConfig.phantomFlameDamage); -+ if (hurt && level.purpurConfig.phantomFlameFireTime > 0) { -+ target.setSecondsOnFire(level.purpurConfig.phantomFlameFireTime); ++ boolean hurt = target.hurt(target.damageSources().mobProjectile(this, (LivingEntity) shooter), level().purpurConfig.phantomFlameDamage); ++ if (hurt && level().purpurConfig.phantomFlameFireTime > 0) { ++ target.setSecondsOnFire(level().purpurConfig.phantomFlameFireTime); + } + } + } diff --git a/patches/server/0006-Configurable-entity-base-attributes.patch b/patches/server/0007-Configurable-entity-base-attributes.patch similarity index 62% rename from patches/server/0006-Configurable-entity-base-attributes.patch rename to patches/server/0007-Configurable-entity-base-attributes.patch index 5c8450251..69bd9b8bf 100644 --- a/patches/server/0006-Configurable-entity-base-attributes.patch +++ b/patches/server/0007-Configurable-entity-base-attributes.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configurable entity base attributes diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index cf68705a5cfde9a1e5e3161c73e6308354e01043..05c3985cddae94e26fb70657c1add2f87bff8080 100644 +index 23bc033aad04fc73a211e9b304cf6d49bce59c4e..9b692140796eb5296a0478fd18d9b33278be6f5d 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -155,7 +155,7 @@ import org.bukkit.plugin.PluginManager; @@ -18,29 +18,29 @@ index cf68705a5cfde9a1e5e3161c73e6308354e01043..05c3985cddae94e26fb70657c1add2f8 private static final int CURRENT_LEVEL = 2; public boolean preserveMotion = true; // Paper - keep initial motion on first setPositionRotation diff --git a/src/main/java/net/minecraft/world/entity/GlowSquid.java b/src/main/java/net/minecraft/world/entity/GlowSquid.java -index 759713f7c646aaf1a918c87a2834a1d405385dad..213f89b22650f43daaec01e7c301e3e8a7e98684 100644 +index c6a06e07f0b4bb29b5f4c70dfa53ff6db2e4e6ea..730958dab7f074930cdccb88a89aa26e2b6a112b 100644 --- a/src/main/java/net/minecraft/world/entity/GlowSquid.java +++ b/src/main/java/net/minecraft/world/entity/GlowSquid.java -@@ -23,6 +23,11 @@ public class GlowSquid extends Squid { - super(type, world); +@@ -36,6 +36,11 @@ public class GlowSquid extends Squid { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.glowSquidMaxHealth); ++ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.glowSquidMaxHealth); + } + @Override protected ParticleOptions getInkParticle() { return ParticleTypes.GLOW_SQUID_INK; diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index a6d730eaee1df1c5c61aa0f8731b8c055080a9a6..91309d12ae4a1157d507062b27147cdcc4053658 100644 +index 218eaf5f18162422b3376335e32f25d03c0655ec..9d9cb6e697c4f09badc3ca121f2ef987900d65a8 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -289,6 +289,7 @@ public abstract class LivingEntity extends Entity implements Attackable { this.useItem = ItemStack.EMPTY; this.lastClimbablePos = Optional.empty(); - this.attributes = new AttributeMap(DefaultAttributes.getSupplier(type)); + this.attributes = new AttributeMap(DefaultAttributes.getSupplier(type), this); // Purpur + this.initAttributes(); // Purpur this.craftAttributes = new CraftAttributeMap(this.attributes); // CraftBukkit // CraftBukkit - setHealth(getMaxHealth()) inlined and simplified to skip the instanceof check for EntityPlayer, as getBukkitEntity() is not initialized in constructor @@ -55,206 +55,206 @@ index a6d730eaee1df1c5c61aa0f8731b8c055080a9a6..91309d12ae4a1157d507062b27147cdc return this.brain; } diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -index 940cd932e74bc2e6754186731d7aa6f10d56eb68..eb6ced824d024a6402772e4df56e867e18fae988 100644 +index 7798e8df6156d71878b7c1f60c5636be64a25591..0dc811f18724d3142561c0dddf840dbbb28bb12e 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -@@ -222,6 +222,18 @@ public class Bat extends AmbientCreature { +@@ -278,6 +278,18 @@ public class Bat extends AmbientCreature { } } + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.batMaxHealth); -+ this.getAttribute(Attributes.FOLLOW_RANGE).setBaseValue(this.level.purpurConfig.batFollowRange); -+ this.getAttribute(Attributes.KNOCKBACK_RESISTANCE).setBaseValue(this.level.purpurConfig.batKnockbackResistance); -+ this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(this.level.purpurConfig.batMovementSpeed); -+ this.getAttribute(Attributes.FLYING_SPEED).setBaseValue(this.level.purpurConfig.batFlyingSpeed); -+ this.getAttribute(Attributes.ARMOR).setBaseValue(this.level.purpurConfig.batArmor); -+ this.getAttribute(Attributes.ARMOR_TOUGHNESS).setBaseValue(this.level.purpurConfig.batArmorToughness); -+ this.getAttribute(Attributes.ATTACK_KNOCKBACK).setBaseValue(this.level.purpurConfig.batAttackKnockback); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.batMaxHealth); ++ this.getAttribute(Attributes.FOLLOW_RANGE).setBaseValue(this.level().purpurConfig.batFollowRange); ++ this.getAttribute(Attributes.KNOCKBACK_RESISTANCE).setBaseValue(this.level().purpurConfig.batKnockbackResistance); ++ this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(this.level().purpurConfig.batMovementSpeed); ++ this.getAttribute(Attributes.FLYING_SPEED).setBaseValue(this.level().purpurConfig.batFlyingSpeed); ++ this.getAttribute(Attributes.ARMOR).setBaseValue(this.level().purpurConfig.batArmor); ++ this.getAttribute(Attributes.ARMOR_TOUGHNESS).setBaseValue(this.level().purpurConfig.batArmorToughness); ++ this.getAttribute(Attributes.ATTACK_KNOCKBACK).setBaseValue(this.level().purpurConfig.batAttackKnockback); + } + @Override public void readAdditionalSaveData(CompoundTag nbt) { super.readAdditionalSaveData(nbt); 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 f6062bf8c888baeb7b421150a2c64bf1af1a312b..cd960eaeb3b86177b962db69173112f746bc52e1 100644 +index 79a2d45f10aa1afb5d1192284cd48ea026411845..aaf6f76cefc71f714bc9aeddc22149110ee76197 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java -@@ -415,6 +415,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -466,6 +466,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { } } + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.beeMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.beeMaxHealth); + } + @Override public int getRemainingPersistentAngerTime() { return (Integer) this.entityData.get(Bee.DATA_REMAINING_ANGER_TIME); diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java -index 90ce201bc7c47cef9bc59d7b535a7453854bac75..3981a2b7501ceb62562785b2ace5990473919fa0 100644 +index 90ec526b135a6de6e7ba16fdd3a113ef92b42ef6..49a6ac765e71b311c91cbfd4cf9cde2daa729239 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -97,6 +97,11 @@ public class Cat extends TamableAnimal implements VariantHolder { - super(type, world); +@@ -122,6 +122,11 @@ public class Cat extends TamableAnimal implements VariantHolder { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.catMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.catMaxHealth); + } + public ResourceLocation getResourceLocation() { return this.getVariant().texture(); } diff --git a/src/main/java/net/minecraft/world/entity/animal/Chicken.java b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -index 84cefbc339ca368ac306d521012ce2f826a660b5..c7ff22ee963e3d7ca3c5b819b38cca466c5d78c5 100644 +index 600b7b4e510871de0dee4051158d344734f04966..ea404a84a43a02a5614d5142bb78a586edfc69f6 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Chicken.java +++ b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -@@ -54,6 +54,11 @@ public class Chicken extends Animal { - this.setPathfindingMalus(BlockPathTypes.WATER, 0.0F); +@@ -71,6 +71,11 @@ public class Chicken extends Animal { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.chickenMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.chickenMaxHealth); + } + @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); diff --git a/src/main/java/net/minecraft/world/entity/animal/Cod.java b/src/main/java/net/minecraft/world/entity/animal/Cod.java -index 824e5e4fe7619ae46061c3c978c9a044db8c84ab..3e213264f5991ccfcb5c207621334b8e9d6cc9bc 100644 +index e2a98b45e56a368de19bb65e304370a5998c7cb9..3d61c2d5da103de68242c16d85c703813979d179 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cod.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cod.java -@@ -13,6 +13,11 @@ public class Cod extends AbstractSchoolingFish { - super(type, world); +@@ -25,6 +25,11 @@ public class Cod extends AbstractSchoolingFish { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.codMaxHealth); ++ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.codMaxHealth); + } + @Override public ItemStack getBucketItemStack() { return new ItemStack(Items.COD_BUCKET); diff --git a/src/main/java/net/minecraft/world/entity/animal/Cow.java b/src/main/java/net/minecraft/world/entity/animal/Cow.java -index 4b63f6aa3d19cc4f47b05d531df3a43bf398c9ea..2f45444ad13e5ef3619788b19ec9c16be1f87950 100644 +index 3ac30ed0a411384be5102de498815561915a7903..d26a44d634fe02e595654e573d02243b5eb66086 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java -@@ -41,6 +41,11 @@ public class Cow extends Animal { - super(type, world); +@@ -58,6 +58,11 @@ public class Cow extends Animal { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.cowMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.cowMaxHealth); + } + @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); diff --git a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java -index 501e6cb4aa83f81c1f657e41f4e7f11d19d46831..376fe57c3518d42c887726338b15f59d072d8d87 100644 +index 057ebdba945caa27db8982fe140d858bdb84fa39..b206686fe55f56b9c4d94a7b54927bf74842b46c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java +++ b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java -@@ -86,6 +86,11 @@ public class Dolphin extends WaterAnimal { - this.setCanPickUpLoot(true); +@@ -154,6 +154,11 @@ public class Dolphin extends WaterAnimal { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.dolphinMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.dolphinMaxHealth); + } + @Nullable @Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, @Nullable SpawnGroupData entityData, @Nullable CompoundTag entityNbt) { diff --git a/src/main/java/net/minecraft/world/entity/animal/Fox.java b/src/main/java/net/minecraft/world/entity/animal/Fox.java -index 844083101e9763330af0175388f6cdda27a97ecc..b75c942e212e6659723c4fea3f06f85a627096f0 100644 +index c56aaf2d0460d5a4432f893300140d071a95cc38..451abd7a6d7fb0926dcebdc4504b1c9c298766e3 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java -@@ -141,6 +141,11 @@ public class Fox extends Animal implements VariantHolder { - this.setCanPickUpLoot(true); +@@ -179,6 +179,11 @@ public class Fox extends Animal implements VariantHolder { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.foxMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.foxMaxHealth); + } + @Override protected void defineSynchedData() { super.defineSynchedData(); diff --git a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -index f383928fc5b331ddf128bdcb6a23010d8fe088d3..4bdef5dd01b69ff64f632a71096c1a87b2fc1195 100644 +index 6815d7350a82c6d32f60aa6116466ebd06a920f9..95ff109511c97d603aeaf9e73c49397a841fcbce 100644 --- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -@@ -66,6 +66,11 @@ public class IronGolem extends AbstractGolem implements NeutralMob { - this.setMaxUpStep(1.0F); +@@ -81,6 +81,11 @@ public class IronGolem extends AbstractGolem implements NeutralMob { + public boolean isControllable() { + return level().purpurConfig.ironGolemControllable; } - ++ + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.ironGolemMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.ironGolemMaxHealth); + } -+ + // Purpur end + @Override - protected void registerGoals() { - this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0D, true)); diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index a04374f91f2fbb31219d86b6ae63bcf8fdf7318c..9e5a1d8a406ad43d762f421a2589f649402b6f7d 100644 +index 7b0e3b46e3d318ee856d53cfc5532f3432447438..780a11339d2492dd607e3ef91867ffbb9062e2cd 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -@@ -63,6 +63,11 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder { - this.initializePathFinderGoals(); // CraftBukkit - moved code +@@ -137,6 +137,11 @@ public class Rabbit extends Animal implements VariantHolder { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.rabbitMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.rabbitMaxHealth); + } + // CraftBukkit start - code from constructor public void initializePathFinderGoals(){ this.setSpeedModifier(0.0D); diff --git a/src/main/java/net/minecraft/world/entity/animal/Salmon.java b/src/main/java/net/minecraft/world/entity/animal/Salmon.java -index 0af79daa357f53a8871e293b57e16c099e5d3f64..40196aa0f8abc8be68dffd397f706a0c2c0fc320 100644 +index 87c442fb198cad8671ad1419e589a5a67c4fdca8..742805994f29a18af444912b10af631d2c60cacf 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Salmon.java +++ b/src/main/java/net/minecraft/world/entity/animal/Salmon.java -@@ -13,6 +13,11 @@ public class Salmon extends AbstractSchoolingFish { - super(type, world); +@@ -25,6 +25,11 @@ public class Salmon extends AbstractSchoolingFish { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.salmonMaxHealth); ++ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.salmonMaxHealth); + } + @Override public int getMaxSchoolSize() { return 5; diff --git a/src/main/java/net/minecraft/world/entity/animal/Sheep.java b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -index c0e89262c596fbdd0bb3c3f76baccb17a1bb5fcd..5886a9a40cbac1a97d4213d4a806802359953d18 100644 +index 0e2f10fa133281477ab96ba743266ade4d5f2119..3d212b09258b9777079d4bc7ce950f529cdce69e 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java +++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -@@ -117,6 +117,11 @@ public class Sheep extends Animal implements Shearable { - super(type, world); +@@ -134,6 +134,11 @@ public class Sheep extends Animal implements Shearable { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.sheepMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.sheepMaxHealth); + } + @Override protected void registerGoals() { this.eatBlockGoal = new EatBlockGoal(this); diff --git a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -index 96bfba9d3ccdbf95b8eea4038bf42e6b1430181d..64919b11f1b73f63a44e5f395687704e50e76c9a 100644 +index 190d123a87ef8ca84e5e0cc485a5cc65fe5ed8e8..a8b411cc3dd1f61b4f949862a077e87e26e424de 100644 --- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -@@ -54,6 +54,11 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM - super(type, world); +@@ -71,6 +71,11 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.snowGolemMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.snowGolemMaxHealth); + } + @Override protected void registerGoals() { - this.goalSelector.addGoal(1, new RangedAttackGoal(this, 1.25D, 20, 10.0F)); + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur diff --git a/src/main/java/net/minecraft/world/entity/animal/Squid.java b/src/main/java/net/minecraft/world/entity/animal/Squid.java -index b72006c4b2342ca9d9a81f54f89fa6d979c33c85..55ca4f5e136cd902b2df425c8e65b12bfb45b28e 100644 +index fa635fa6828c4d7e0fd80ae00cc21e5598542703..42ca9df0735b4f928fbbf1e695d1756f77be52fc 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Squid.java +++ b/src/main/java/net/minecraft/world/entity/animal/Squid.java -@@ -50,6 +50,11 @@ public class Squid extends WaterAnimal { - this.tentacleSpeed = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F; +@@ -72,6 +72,11 @@ public class Squid extends WaterAnimal { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.squidMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.squidMaxHealth); + } + @Override protected void registerGoals() { this.goalSelector.addGoal(0, new Squid.SquidRandomMovementGoal(this)); diff --git a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -index b05b560b7570e97bc234b75f26233909fcf575b3..c0605ccfd050417189595cdcb68eb9d56e9fc4ee 100644 +index 71234b258157579d3a47064e7e299bb7fb90908f..7d02e552a27632939bb9c40a62f4e0df7bd60bbc 100644 --- a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java +++ b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -@@ -42,6 +42,11 @@ public class TropicalFish extends AbstractSchoolingFish implements VariantHolder - super(type, world); +@@ -54,6 +54,11 @@ public class TropicalFish extends AbstractSchoolingFish implements VariantHolder } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.tropicalFishMaxHealth); ++ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.tropicalFishMaxHealth); + } + public static String getPredefinedName(int variant) { return "entity.minecraft.tropical_fish.predefined." + variant; } diff --git a/src/main/java/net/minecraft/world/entity/animal/Turtle.java b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -index 9f7fa132997829e9a34aaae7aac7a6f7d529eee2..fc98554897f009352f1869d3e5a42d209a8d520c 100644 +index 9022f5fa0ff94ccf2c46f96c541e77e1f82b81da..39590707049a19f0763efa1083a1813b6f6fff9c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java +++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -@@ -83,6 +83,11 @@ public class Turtle extends Animal { - this.setMaxUpStep(1.0F); +@@ -100,6 +100,11 @@ public class Turtle extends Animal { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.turtleMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.turtleMaxHealth); + } + public void setHomePos(BlockPos pos) { this.entityData.set(Turtle.HOME_POS, pos.immutable()); // Paper - called with mutablepos... } diff --git a/src/main/java/net/minecraft/world/entity/animal/Wolf.java b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -index 27c4dd3605373f08078048fe923a8f6f4d3ccf3b..123bb0b0a8437935ae5dafbe93b44eb268d1b4c0 100644 +index cb2b8c7cbbe882ae0ca876edaa66bea1d5cd141d..c9ad084ce93eb618261221c7e19450c06fb8a5f5 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -@@ -102,6 +102,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { - this.setPathfindingMalus(BlockPathTypes.DANGER_POWDER_SNOW, -1.0F); +@@ -124,6 +124,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.wolfMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.wolfMaxHealth); + } + @Override protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index 2682a49cd3948e0f80e2d7e58abcd3e6d8f7ac4e..d90bf5a45466525c9a04d54b02d366861423be8f 100644 +index ede5469f26f530beacfc655581e213d39276c7d9..3b70849dca92ee4b0427396de6440f1c29fd724a 100644 --- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -@@ -98,6 +98,11 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder getModelRotationValues() { return this.modelRotationValues; diff --git a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java b/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java -index 4efa7e331cc974008c653a04687a336e97626445..95fbdb0e9c59edeb647fe0e5d51d5e6a35152cd6 100644 +index 4efa7e331cc974008c653a04687a336e97626445..e2540b7e28c8ba63a0360766a8afa57ac33e336f 100644 --- a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java +++ b/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java @@ -319,6 +319,23 @@ public class Camel extends AbstractHorse implements PlayerRideableJumping, Rider @@ -485,17 +485,17 @@ index 4efa7e331cc974008c653a04687a336e97626445..95fbdb0e9c59edeb647fe0e5d51d5e6a + // Purpur start + @Override + public float generateMaxHealth(net.minecraft.util.RandomSource random) { -+ return (float) generateMaxHealth(this.level.purpurConfig.camelMaxHealthMin, this.level.purpurConfig.camelMaxHealthMax); ++ return (float) generateMaxHealth(this.level().purpurConfig.camelMaxHealthMin, this.level().purpurConfig.camelMaxHealthMax); + } + + @Override + public double generateJumpStrength(net.minecraft.util.RandomSource random) { -+ return generateJumpStrength(this.level.purpurConfig.camelJumpStrengthMin, this.level.purpurConfig.camelJumpStrengthMax); ++ return generateJumpStrength(this.level().purpurConfig.camelJumpStrengthMin, this.level().purpurConfig.camelJumpStrengthMax); + } + + @Override + public double generateSpeed(net.minecraft.util.RandomSource random) { -+ return generateSpeed(this.level.purpurConfig.camelMovementSpeedMin, this.level.purpurConfig.camelMovementSpeedMax); ++ return generateSpeed(this.level().purpurConfig.camelMovementSpeedMin, this.level().purpurConfig.camelMovementSpeedMax); + } + // Purpur end + @@ -503,12 +503,12 @@ index 4efa7e331cc974008c653a04687a336e97626445..95fbdb0e9c59edeb647fe0e5d51d5e6a protected SoundEvent getAmbientSound() { return SoundEvents.CAMEL_AMBIENT; 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 79b6e241f425622fdc575b77d8dce7061c0ab783..7827187afa738776908d1c2151556af95affcbe8 100644 +index b948f8ac7072afa7a60cdbb2775b0e2fa0a052e9..05405f22fa9001560eb3a6701f3bb0179a584fae 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 -@@ -148,6 +148,44 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, - this.createInventory(); +@@ -157,6 +157,44 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, } + // Purpur end + @Override + public void initAttributes() { @@ -550,8 +550,8 @@ index 79b6e241f425622fdc575b77d8dce7061c0ab783..7827187afa738776908d1c2151556af9 + @Override protected void registerGoals() { - this.goalSelector.addGoal(1, new PanicGoal(this, 1.2D)); -@@ -1253,7 +1291,7 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HorseHasRider(this)); // Purpur +@@ -1264,7 +1302,7 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, entityData = new AgeableMob.AgeableMobGroupData(0.2F); } @@ -561,236 +561,236 @@ index 79b6e241f425622fdc575b77d8dce7061c0ab783..7827187afa738776908d1c2151556af9 } diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java b/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java -index e0dfee0e0ce091d5ae0ec740e939c2c50915c104..d3e8b9ddc42c506f8a0b696becc2ca63414db76f 100644 +index 6a5fb18523545ccc788b09ab4fbee1b14a64bc63..365273173e37e74470a1cf511334ea8cb25f8302 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java -@@ -15,6 +15,21 @@ public class Donkey extends AbstractChestedHorse { - super(type, world); +@@ -22,6 +22,21 @@ public class Donkey extends AbstractChestedHorse { } + // Purpur end + @Override + public float generateMaxHealth(net.minecraft.util.RandomSource random) { -+ return (float) generateMaxHealth(this.level.purpurConfig.donkeyMaxHealthMin, this.level.purpurConfig.donkeyMaxHealthMax); ++ return (float) generateMaxHealth(this.level().purpurConfig.donkeyMaxHealthMin, this.level().purpurConfig.donkeyMaxHealthMax); + } + + @Override + public double generateJumpStrength(net.minecraft.util.RandomSource random) { -+ return generateJumpStrength(this.level.purpurConfig.donkeyJumpStrengthMin, this.level.purpurConfig.donkeyJumpStrengthMax); ++ return generateJumpStrength(this.level().purpurConfig.donkeyJumpStrengthMin, this.level().purpurConfig.donkeyJumpStrengthMax); + } + + @Override + public double generateSpeed(net.minecraft.util.RandomSource random) { -+ return generateSpeed(this.level.purpurConfig.donkeyMovementSpeedMin, this.level.purpurConfig.donkeyMovementSpeedMax); ++ return generateSpeed(this.level().purpurConfig.donkeyMovementSpeedMin, this.level().purpurConfig.donkeyMovementSpeedMax); + } + @Override protected SoundEvent getAmbientSound() { return SoundEvents.DONKEY_AMBIENT; diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java b/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java -index 5f5dc651d570989ec1294c31a14dcfede466b80a..62f7cdc02e7eb15a96f20ff48470d9869ec82d59 100644 +index 3e50581033e88e8eddcbd85bfa890cbe0b88a7e6..92339f5a07dcb6bf7eb1bce6d584464ebd8430b5 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java -@@ -40,6 +40,21 @@ public class Horse extends AbstractHorse implements VariantHolder { - super(type, world); +@@ -47,6 +47,21 @@ public class Horse extends AbstractHorse implements VariantHolder { } + // Purpur end + @Override + public float generateMaxHealth(RandomSource random) { -+ return (float) generateMaxHealth(this.level.purpurConfig.horseMaxHealthMin, this.level.purpurConfig.horseMaxHealthMax); ++ return (float) generateMaxHealth(this.level().purpurConfig.horseMaxHealthMin, this.level().purpurConfig.horseMaxHealthMax); + } + + @Override + public double generateJumpStrength(RandomSource random) { -+ return generateJumpStrength(this.level.purpurConfig.horseJumpStrengthMin, this.level.purpurConfig.horseJumpStrengthMax); ++ return generateJumpStrength(this.level().purpurConfig.horseJumpStrengthMin, this.level().purpurConfig.horseJumpStrengthMax); + } + + @Override + public double generateSpeed(RandomSource random) { -+ return generateSpeed(this.level.purpurConfig.horseMovementSpeedMin, this.level.purpurConfig.horseMovementSpeedMax); ++ return generateSpeed(this.level().purpurConfig.horseMovementSpeedMin, this.level().purpurConfig.horseMovementSpeedMax); + } + @Override protected void randomizeAttributes(RandomSource random) { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue((double)generateMaxHealth(random::nextInt)); diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index 3bbb1455773570e3f7f6b8b144d3c589e2705b81..08fbfa5df3196ad3d9fe086dcd8210ec8747f053 100644 +index e05f917c462ba5bfb114e402b4f5309f421651fb..9ba0218910d7e5db9e735c50f2e60b5a1073816b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -@@ -78,6 +78,21 @@ public class Llama extends AbstractChestedHorse implements VariantHolder type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { return checkMonsterSpawnRules(type, world, spawnReason, pos, random) && (spawnReason == MobSpawnType.SPAWNER || world.canSeeSky(pos)); } diff --git a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java -index 63fce7e3d9f59f36e29bc827a46396d73143bb8b..03646f5ffa43b19679241999877da1e93b293744 100644 +index f83f09f7568c44a1165aac73f7127c5d1af0478f..0f3e6c19e55a18cde71f3cb84c1e92b433ebcb7f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java +++ b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java -@@ -59,6 +59,13 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { - +@@ -76,6 +76,13 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { } + // Purpur end + @Override + protected void initAttributes() { -+ this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(this.level.purpurConfig.illusionerMovementSpeed); -+ this.getAttribute(Attributes.FOLLOW_RANGE).setBaseValue(this.level.purpurConfig.illusionerFollowRange); -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.illusionerMaxHealth); ++ this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(this.level().purpurConfig.illusionerMovementSpeed); ++ this.getAttribute(Attributes.FOLLOW_RANGE).setBaseValue(this.level().purpurConfig.illusionerFollowRange); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.illusionerMaxHealth); + } + @Override protected void registerGoals() { super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java -index 2858ea5562d06c11e5c7337a2b123f9be7a3f62e..0f375ed5073435f6826c4d946e50a2d24ae54be0 100644 +index aad51022eac584fbc058c2b25e2bf1929fccca6f..b472309f97b24f1d7b97d8b6d464c479c2d602d5 100644 --- a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java +++ b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java -@@ -25,6 +25,26 @@ public class MagmaCube extends Slime { - super(type, world); +@@ -47,6 +47,26 @@ public class MagmaCube extends Slime { } + // Purpur end + @Override + protected String getMaxHealthEquation() { -+ return level.purpurConfig.magmaCubeMaxHealth; ++ return level().purpurConfig.magmaCubeMaxHealth; + } + + @Override + protected String getAttackDamageEquation() { -+ return level.purpurConfig.magmaCubeAttackDamage; ++ return level().purpurConfig.magmaCubeAttackDamage; + } + + @Override + protected java.util.Map getMaxHealthCache() { -+ return level.purpurConfig.magmaCubeMaxHealthCache; ++ return level().purpurConfig.magmaCubeMaxHealthCache; + } + + @Override + protected java.util.Map getAttackDamageCache() { -+ return level.purpurConfig.magmaCubeAttackDamageCache; ++ return level().purpurConfig.magmaCubeAttackDamageCache; + } + public static AttributeSupplier.Builder createAttributes() { return Monster.createMonsterAttributes().add(Attributes.MOVEMENT_SPEED, (double)0.2F); } diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -index 4a132c3eff6978e927bcd4df56b9ce0306af6d19..07070846057b80eb24e6afa4ddcf39221df0c7b3 100644 +index ea613fe67fcd977aebaae891f95272970ba23698..cd6a25bb101555d6c763a7023d1b05691e671b5f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -@@ -90,7 +90,10 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -150,7 +150,10 @@ public class Phantom extends FlyingMob implements Enemy { private void updatePhantomSizeInfo() { this.refreshDimensions(); - this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue((double) (6 + this.getPhantomSize())); + // Purpur start -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(getFromCache(() -> this.level.purpurConfig.phantomMaxHealth, () -> this.level.purpurConfig.phantomMaxHealthCache, () -> 20.0D)); -+ this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(getFromCache(() -> this.level.purpurConfig.phantomAttackDamage, () -> this.level.purpurConfig.phantomAttackDamageCache, () -> (double) 6 + this.getPhantomSize())); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(getFromCache(() -> this.level().purpurConfig.phantomMaxHealth, () -> this.level().purpurConfig.phantomMaxHealthCache, () -> 20.0D)); ++ this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(getFromCache(() -> this.level().purpurConfig.phantomAttackDamage, () -> this.level().purpurConfig.phantomAttackDamageCache, () -> (double) 6 + this.getPhantomSize())); + // Purpur end } public int getPhantomSize() { -@@ -120,6 +123,21 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -180,6 +183,21 @@ public class Phantom extends FlyingMob implements Enemy { return true; } @@ -1091,107 +1091,107 @@ index 4a132c3eff6978e927bcd4df56b9ce0306af6d19..07070846057b80eb24e6afa4ddcf3922 public void tick() { super.tick(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Pillager.java b/src/main/java/net/minecraft/world/entity/monster/Pillager.java -index cec545c3baa6599d47b9cf1a4b97de8771062a22..508d76f5120ec614092669af7d7c61f7216c8dc3 100644 +index 31d204d8d81ccc30371070af3678d82dc721618d..6a6349c7002439965422aa4979682b4ce6dfba1e 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Pillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Pillager.java -@@ -62,6 +62,11 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve - super(type, world); +@@ -79,6 +79,11 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.pillagerMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.pillagerMaxHealth); + } + @Override protected void registerGoals() { super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Ravager.java b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -index 75d661c23cde1ba09ea0b673860c9659c32ef77e..45ac92467b5cdadcc692c8867a52277e1754a934 100644 +index 4aa0f1a4848411a83b5d211e799c30e743b148fe..990a4ef6e2eccc228b06ba4cb3aadfce0733de5f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -@@ -65,6 +65,11 @@ public class Ravager extends Raider { - this.setPathfindingMalus(BlockPathTypes.LEAVES, 0.0F); +@@ -88,6 +88,11 @@ public class Ravager extends Raider { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.ravagerMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.ravagerMaxHealth); + } + @Override protected void registerGoals() { super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Shulker.java b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -index cdccbe68fb591181517893a5dd1e93489b578f4d..b7900691214fabe130f163253879c38952b9a20b 100644 +index d4b318fc6382cd043e34db0d12d78e3561023dd5..73c1c023e2c0511bca866cfbef86a9f4fa688592 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -@@ -98,6 +98,11 @@ public class Shulker extends AbstractGolem implements VariantHolder getMaxHealthCache() { -+ return level.purpurConfig.slimeMaxHealthCache; ++ return level().purpurConfig.slimeMaxHealthCache; + } + + protected java.util.Map getAttackDamageCache() { -+ return level.purpurConfig.slimeAttackDamageCache; ++ return level().purpurConfig.slimeAttackDamageCache; + } + + protected double getFromCache(java.util.function.Supplier equation, java.util.function.Supplier> cache, java.util.function.Supplier defaultValue) { @@ -1211,8 +1211,8 @@ index 343433158507451152e5b2fc5e5fd0b0e6b229db..ccbe63cae3a719e73013dd3da1c5179b + @Override protected void registerGoals() { - this.goalSelector.addGoal(1, new Slime.SlimeFloatGoal(this)); -@@ -96,9 +127,9 @@ public class Slime extends Mob implements Enemy { + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur +@@ -133,9 +164,9 @@ public class Slime extends Mob implements Enemy { this.entityData.set(Slime.ID_SIZE, j); this.reapplyPosition(); this.refreshDimensions(); @@ -1225,298 +1225,303 @@ index 343433158507451152e5b2fc5e5fd0b0e6b229db..ccbe63cae3a719e73013dd3da1c5179b this.setHealth(this.getMaxHealth()); } diff --git a/src/main/java/net/minecraft/world/entity/monster/Spider.java b/src/main/java/net/minecraft/world/entity/monster/Spider.java -index 05432184077752b1d0cb764a5e39ed875748b2d6..4d9be4599d7181bc891bf86c01299b8ed460d916 100644 +index 9f6eaf76a39a9c3e7aed2e0ce91960200b4de664..f302866ff34368c362540fa4163ad38060bf209f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Spider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Spider.java -@@ -51,6 +51,11 @@ public class Spider extends Monster { - super(type, world); +@@ -68,6 +68,11 @@ public class Spider extends Monster { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.spiderMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.spiderMaxHealth); + } + @Override protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Stray.java b/src/main/java/net/minecraft/world/entity/monster/Stray.java -index 118b636a44e4b062e812e433f603b039276337da..36ae65cb4510f8706f55fb851d37b121ca431ace 100644 +index 137ee6d1aa8ec334009b6fab21b9f30303ace45f..2bfc34d300627c17b2b34442665527c34ebea78a 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Stray.java +++ b/src/main/java/net/minecraft/world/entity/monster/Stray.java -@@ -21,6 +21,11 @@ public class Stray extends AbstractSkeleton { - super(type, world); +@@ -38,6 +38,11 @@ public class Stray extends AbstractSkeleton { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.strayMaxHealth); ++ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.strayMaxHealth); + } + public static boolean checkStraySpawnRules(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { BlockPos blockPos = pos; diff --git a/src/main/java/net/minecraft/world/entity/monster/Strider.java b/src/main/java/net/minecraft/world/entity/monster/Strider.java -index ebf54d6e36fdee2833250816fae14195ac45eb67..bf44fc59eb4f2d18c728a7c24fd8b5c518208f09 100644 +index ccc76bf5431af723eef8e4d39c96daa44d1f6b5c..eedfd4dffdc5586a0b50769b17c5515e5ccac916 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Strider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java -@@ -100,6 +100,11 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { - this.setPathfindingMalus(BlockPathTypes.DAMAGE_FIRE, 0.0F); +@@ -117,6 +117,11 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.striderMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.striderMaxHealth); + } + public static boolean checkStriderSpawnRules(EntityType type, LevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { BlockPos.MutableBlockPos blockposition_mutableblockposition = pos.mutable(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Vex.java b/src/main/java/net/minecraft/world/entity/monster/Vex.java -index 65cb385ab294e362d666a6d03c4496cdc3b64890..41b6c2d33121144e062f0733db55ec6a40603020 100644 +index 40f42c83d6417258123753ba9315ca27c2b43b22..764fdf4654b4fa2184493b77976fc29aedf592c2 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vex.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vex.java -@@ -63,6 +63,11 @@ public class Vex extends Monster implements TraceableEntity { - this.xpReward = 3; +@@ -107,6 +107,11 @@ public class Vex extends Monster implements TraceableEntity { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.vexMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.vexMaxHealth); + } + @Override protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) { return dimensions.height - 0.28125F; diff --git a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java -index 2acc531bd9e948251cac77d979f973678f576394..3bf6463d356f3ba64c2d5279cbf79c289fc09a8f 100644 +index f8337259af80cede27e9a37c5634ccba9f837076..40858ac2a9b58108472748d0ef2c2fd5ef5cfd98 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java -@@ -58,6 +58,11 @@ public class Vindicator extends AbstractIllager { - super(type, world); +@@ -75,6 +75,11 @@ public class Vindicator extends AbstractIllager { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.vindicatorMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.vindicatorMaxHealth); + } + @Override protected void registerGoals() { super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Witch.java b/src/main/java/net/minecraft/world/entity/monster/Witch.java -index 701f6bf1d558cf0ec4bc1abb9e1f66d96ea5a6c9..956e0f5ea71f01f4ae192c8c8e0f1e8b323b06ba 100644 +index c7ceeb28b53879395c697cbb3778563511bc1209..289c9261d0019b558c4447a75b3b03229cdd9498 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Witch.java +++ b/src/main/java/net/minecraft/world/entity/monster/Witch.java -@@ -57,6 +57,11 @@ public class Witch extends Raider implements RangedAttackMob { - super(type, world); +@@ -74,6 +74,11 @@ public class Witch extends Raider implements RangedAttackMob { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.witchMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.witchMaxHealth); + } + @Override protected void registerGoals() { super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java -index 9a81cb0c3a5ac40ff50dc7c81f6196a447cd03c6..dda157fa91572198407a0840079cd18473adae4e 100644 +index 45c7d673cb15fc002538c2713e36f591fe33de92..25e2aca9dafe63ccaf21dc42e79563c5a3c8e638 100644 --- a/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java +++ b/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java -@@ -35,6 +35,11 @@ public class WitherSkeleton extends AbstractSkeleton { - this.setPathfindingMalus(BlockPathTypes.LAVA, 8.0F); +@@ -52,6 +52,11 @@ public class WitherSkeleton extends AbstractSkeleton { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.witherSkeletonMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.witherSkeletonMaxHealth); + } + @Override protected void registerGoals() { this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractPiglin.class, true)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -index 7815af9b64ead32d6f7bcad6f86b2d21ec4aec22..54ce647b16efcc15d378009e56691cdf47bd04e4 100644 +index 393dde215894616c073efd28b529c9dac9815adc..323ec328226e3a46ef8afeaf07178bb9f4042134 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -@@ -67,6 +67,11 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { - this.xpReward = 5; +@@ -84,6 +84,11 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.zoglinMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zoglinMaxHealth); + } + @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index 3f8c1d1d3c408fc4f15c4b5680bc22c86f104a9d..3263d467cbff5cd7382f9618c342314aafb2a004 100644 +index d3f1bcd9daeea282bef549ea18cedf0fc7a9ad8d..b3a31549179760388bc2958b4339848d1f0b293d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -106,6 +106,11 @@ public class Zombie extends Monster { - this(EntityType.ZOMBIE, world); +@@ -123,6 +123,11 @@ public class Zombie extends Monster { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.zombieMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zombieMaxHealth); + } + @Override protected void registerGoals() { - if (this.level().paperConfig().entities.behavior.zombiesTargetTurtleEggs) this.goalSelector.addGoal(4, new Zombie.ZombieAttackTurtleEggGoal(this, 1.0D, 3)); // Paper -@@ -595,7 +600,7 @@ public class Zombie extends Monster { + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur +@@ -614,7 +619,7 @@ public class Zombie extends Monster { } protected void randomizeReinforcementsChance() { - this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * 0.10000000149011612D); -+ this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level.purpurConfig.zombieSpawnReinforcements); // Purpur ++ this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level().purpurConfig.zombieSpawnReinforcements); // Purpur } @Override 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 25ed5571b24e590bc95056020d84496492b53298..7ca69d4ae42f982eef7c4470d6a28a3eb334401c 100644 +index 87ae149be7a3eaf14406a7df9f174574d77c63c5..c89680f83275169728f923e70a17cb88d4480f01 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -79,6 +79,16 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { - }); +@@ -96,6 +96,16 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.zombieVillagerMaxHealth); ++ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zombieVillagerMaxHealth); + } + + @Override + protected void randomizeReinforcementsChance() { -+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level.purpurConfig.zombieVillagerSpawnReinforcements); ++ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level().purpurConfig.zombieVillagerSpawnReinforcements); + } + @Override protected void defineSynchedData() { super.defineSynchedData(); diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index aff140cfb2bbdce8b512080cf394c84c5c4ff807..5e97cec00a6ea97520f0e5acb6e30d5e7e5fab89 100644 +index fe9bdc4006b916748e55a976b6c8621070fb73c5..8f22bfcde4bb8ad73794f2b98b156113e5a2a6c9 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -63,6 +63,11 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { - this.setPathfindingMalus(BlockPathTypes.LAVA, 8.0F); +@@ -80,6 +80,11 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.zombifiedPiglinMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zombifiedPiglinMaxHealth); + } + @Override public void setPersistentAngerTarget(@Nullable UUID angryAt) { this.persistentAngerTarget = angryAt; -@@ -250,7 +255,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -267,7 +272,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { @Override protected void randomizeReinforcementsChance() { - this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(0.0D); -+ this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level.purpurConfig.zombifiedPiglinSpawnReinforcements); // Purpur ++ this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level().purpurConfig.zombifiedPiglinSpawnReinforcements); // Purpur } @Nullable diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index e8f6c34ea789136d63c0aa88aec90203ef6282b5..139c0853d54f736d61ae8c2f90c8bef9e4acb164 100644 +index e071796123ff391ea81ed765c2014e58b20cdc25..853fe631a7d665e2379296c89e433e761495a814 100644 --- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -67,6 +67,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { - this.xpReward = 5; +@@ -84,6 +84,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.hoglinMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.hoglinMaxHealth); + } + @Override public boolean canBeLeashed(Player player) { return !this.isLeashed(); diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -index 27d9145693a772cd1b5d171da303c934101f3be8..7e1a46eba403e238c266680e9f1fae435a246e1c 100644 +index bc01cad31c977dc45f8d252ca742c409da7f1c30..24b8fc91775bc3a305b0293916600d34fdd7eb00 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -96,6 +96,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento - this.xpReward = 5; +@@ -113,6 +113,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.piglinMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.piglinMaxHealth); + } + @Override public void addAdditionalSaveData(CompoundTag nbt) { super.addAdditionalSaveData(nbt); diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -index e1be4a77fae0b9120781f460079269b85c993930..5f4dcb1d2fd8e3354fb5148512648062463b5bd8 100644 +index 2d842c0dfce1c7e7229bd42b2a92c024a4162b68..04e54c241078e6cd6419a21ba1bf913fd3b413d1 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -@@ -41,6 +41,11 @@ public class PiglinBrute extends AbstractPiglin { - this.xpReward = 20; +@@ -58,6 +58,11 @@ public class PiglinBrute extends AbstractPiglin { } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.piglinBruteMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.piglinBruteMaxHealth); + } + public static AttributeSupplier.Builder createAttributes() { return Monster.createMonsterAttributes().add(Attributes.MAX_HEALTH, 50.0D).add(Attributes.MOVEMENT_SPEED, (double)0.35F).add(Attributes.ATTACK_DAMAGE, 7.0D); } diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index e30d5ae3e2900f43d7cafde71b8196f26e872841..423d0eb98c144d98622884212235b33213aaac6e 100644 +index b1cde791f4994bb0b4ddc063d3c31d16a10b62a5..6cbc3816d3f303d0646cd14a3648ebd2e88354aa 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -154,6 +154,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler - this.setVillagerData(this.getVillagerData().setType(type).setProfession(VillagerProfession.NONE)); +@@ -176,6 +176,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.villagerMaxHealth); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.villagerMaxHealth); + } + @Override public Brain getBrain() { return (Brain) super.getBrain(); // CraftBukkit - decompile error diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index 2e7de2378e01aed514e237029d6d64e78871c9b4..5df4c2468ff809b805d4f16021e7ffd2c1c2dd33 100644 +index d434b96b878652190fac4e2882b7b7373febbbd5..62deb4a443bf65655d2a4310c0dd9f40a02cb401 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -@@ -66,6 +66,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill - this.setDespawnDelay(48000); // CraftBukkit - set default from MobSpawnerTrader +@@ -83,6 +83,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill } + // Purpur end + @Override + public void initAttributes() { -+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.wanderingTraderMaxHealth); ++ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.wanderingTraderMaxHealth); + } + @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 2b7f1dedb3289efc7e42a138f4483f4969902801..3a44c1fff53590ae5c65404564a3a2ee12be62cf 100644 +index ec168b917d60cc6d8c48620eb4dcd89b0b121aea..b51c96e3f09d303f28675fc440ad402fca3db654 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -91,4 +91,901 @@ public class PurpurWorldConfig { - final Map value = PurpurConfig.getMap("world-settings." + worldName + "." + path, null); - return value.isEmpty() ? fallback : value; - } -+ +@@ -114,94 +114,173 @@ public class PurpurWorldConfig { + + public boolean axolotlRidable = false; + public boolean axolotlControllable = true; + public double axolotlMaxHealth = 14.0D; -+ private void axolotlSettings() { + private void axolotlSettings() { + axolotlRidable = getBoolean("mobs.axolotl.ridable", axolotlRidable); + axolotlControllable = getBoolean("mobs.axolotl.controllable", axolotlControllable); + axolotlMaxHealth = getDouble("mobs.axolotl.attributes.max_health", axolotlMaxHealth); -+ } -+ + } + + public boolean batRidable = false; + public boolean batRidableInWater = true; + public boolean batControllable = true; + public double batMaxY = 320D; + public double batMaxHealth = 6.0D; + public double batFollowRange = 16.0D; + public double batKnockbackResistance = 0.0D; @@ -1525,7 +1530,11 @@ index 2b7f1dedb3289efc7e42a138f4483f4969902801..3a44c1fff53590ae5c65404564a3a2ee + public double batArmor = 0.0D; + public double batArmorToughness = 0.0D; + public double batAttackKnockback = 0.0D; -+ private void batSettings() { + private void batSettings() { + batRidable = getBoolean("mobs.bat.ridable", batRidable); + batRidableInWater = getBoolean("mobs.bat.ridable-in-water", batRidableInWater); + batControllable = getBoolean("mobs.bat.controllable", batControllable); + batMaxY = getDouble("mobs.bat.ridable-max-y", batMaxY); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.bat.attributes.max-health", batMaxHealth); + set("mobs.bat.attributes.max-health", null); @@ -1539,26 +1548,198 @@ index 2b7f1dedb3289efc7e42a138f4483f4969902801..3a44c1fff53590ae5c65404564a3a2ee + batArmor = getDouble("mobs.bat.attributes.armor", batArmor); + batArmorToughness = getDouble("mobs.bat.attributes.armor_toughness", batArmorToughness); + batAttackKnockback = getDouble("mobs.bat.attributes.attack_knockback", batAttackKnockback); -+ } -+ + } + + public boolean beeRidable = false; + public boolean beeRidableInWater = true; + public boolean beeControllable = true; + public double beeMaxY = 320D; + public double beeMaxHealth = 10.0D; -+ private void beeSettings() { + private void beeSettings() { + beeRidable = getBoolean("mobs.bee.ridable", beeRidable); + beeRidableInWater = getBoolean("mobs.bee.ridable-in-water", beeRidableInWater); + beeControllable = getBoolean("mobs.bee.controllable", beeControllable); + beeMaxY = getDouble("mobs.bee.ridable-max-y", beeMaxY); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.bee.attributes.max-health", beeMaxHealth); + set("mobs.bee.attributes.max-health", null); + set("mobs.bee.attributes.max_health", oldValue); + } + beeMaxHealth = getDouble("mobs.bee.attributes.max_health", beeMaxHealth); -+ } -+ + } + + public boolean blazeRidable = false; + public boolean blazeRidableInWater = true; + public boolean blazeControllable = true; + public double blazeMaxY = 320D; + public double blazeMaxHealth = 20.0D; -+ private void blazeSettings() { + private void blazeSettings() { + blazeRidable = getBoolean("mobs.blaze.ridable", blazeRidable); + blazeRidableInWater = getBoolean("mobs.blaze.ridable-in-water", blazeRidableInWater); + blazeControllable = getBoolean("mobs.blaze.controllable", blazeControllable); + blazeMaxY = getDouble("mobs.blaze.ridable-max-y", blazeMaxY); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.blaze.attributes.max-health", blazeMaxHealth); + set("mobs.blaze.attributes.max-health", null); + set("mobs.blaze.attributes.max_health", oldValue); + } + blazeMaxHealth = getDouble("mobs.blaze.attributes.max_health", blazeMaxHealth); + } + + public boolean catRidable = false; + public boolean catRidableInWater = true; + public boolean catControllable = true; ++ public double catMaxHealth = 10.0D; + private void catSettings() { + catRidable = getBoolean("mobs.cat.ridable", catRidable); + catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); + catControllable = getBoolean("mobs.cat.controllable", catControllable); ++ if (PurpurConfig.version < 10) { ++ double oldValue = getDouble("mobs.cat.attributes.max-health", catMaxHealth); ++ set("mobs.cat.attributes.max-health", null); ++ set("mobs.cat.attributes.max_health", oldValue); ++ } ++ catMaxHealth = getDouble("mobs.cat.attributes.max_health", catMaxHealth); + } + + public boolean caveSpiderRidable = false; + public boolean caveSpiderRidableInWater = true; + public boolean caveSpiderControllable = true; ++ public double caveSpiderMaxHealth = 12.0D; + private void caveSpiderSettings() { + caveSpiderRidable = getBoolean("mobs.cave_spider.ridable", caveSpiderRidable); + caveSpiderRidableInWater = getBoolean("mobs.cave_spider.ridable-in-water", caveSpiderRidableInWater); + caveSpiderControllable = getBoolean("mobs.cave_spider.controllable", caveSpiderControllable); ++ if (PurpurConfig.version < 10) { ++ double oldValue = getDouble("mobs.cave_spider.attributes.max-health", caveSpiderMaxHealth); ++ set("mobs.cave_spider.attributes.max-health", null); ++ set("mobs.cave_spider.attributes.max_health", oldValue); ++ } ++ caveSpiderMaxHealth = getDouble("mobs.cave_spider.attributes.max_health", caveSpiderMaxHealth); + } + + public boolean chickenRidable = false; + public boolean chickenRidableInWater = false; + public boolean chickenControllable = true; ++ public double chickenMaxHealth = 4.0D; + private void chickenSettings() { + chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); + chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); + chickenControllable = getBoolean("mobs.chicken.controllable", chickenControllable); ++ if (PurpurConfig.version < 10) { ++ double oldValue = getDouble("mobs.chicken.attributes.max-health", chickenMaxHealth); ++ set("mobs.chicken.attributes.max-health", null); ++ set("mobs.chicken.attributes.max_health", oldValue); ++ } ++ chickenMaxHealth = getDouble("mobs.chicken.attributes.max_health", chickenMaxHealth); + } + + public boolean codRidable = false; + public boolean codControllable = true; ++ public double codMaxHealth = 3.0D; + private void codSettings() { + codRidable = getBoolean("mobs.cod.ridable", codRidable); + codControllable = getBoolean("mobs.cod.controllable", codControllable); ++ if (PurpurConfig.version < 10) { ++ double oldValue = getDouble("mobs.cod.attributes.max-health", codMaxHealth); ++ set("mobs.cod.attributes.max-health", null); ++ set("mobs.cod.attributes.max_health", oldValue); ++ } ++ codMaxHealth = getDouble("mobs.cod.attributes.max_health", codMaxHealth); + } + + public boolean cowRidable = false; + public boolean cowRidableInWater = true; + public boolean cowControllable = true; ++ public double cowMaxHealth = 10.0D; + private void cowSettings() { + cowRidable = getBoolean("mobs.cow.ridable", cowRidable); + cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); + cowControllable = getBoolean("mobs.cow.controllable", cowControllable); ++ if (PurpurConfig.version < 10) { ++ double oldValue = getDouble("mobs.cow.attributes.max-health", cowMaxHealth); ++ set("mobs.cow.attributes.max-health", null); ++ set("mobs.cow.attributes.max_health", oldValue); ++ } ++ cowMaxHealth = getDouble("mobs.cow.attributes.max_health", cowMaxHealth); + } + + public boolean creeperRidable = false; + public boolean creeperRidableInWater = true; + public boolean creeperControllable = true; ++ public double creeperMaxHealth = 20.0D; + private void creeperSettings() { + creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); + creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); + creeperControllable = getBoolean("mobs.creeper.controllable", creeperControllable); ++ if (PurpurConfig.version < 10) { ++ double oldValue = getDouble("mobs.creeper.attributes.max-health", creeperMaxHealth); ++ set("mobs.creeper.attributes.max-health", null); ++ set("mobs.creeper.attributes.max_health", oldValue); ++ } ++ creeperMaxHealth = getDouble("mobs.creeper.attributes.max_health", creeperMaxHealth); + } + + public boolean dolphinRidable = false; +@@ -209,80 +288,176 @@ public class PurpurWorldConfig { + public int dolphinSpitCooldown = 20; + public float dolphinSpitSpeed = 1.0F; + public float dolphinSpitDamage = 2.0F; ++ public double dolphinMaxHealth = 10.0D; + private void dolphinSettings() { + dolphinRidable = getBoolean("mobs.dolphin.ridable", dolphinRidable); + dolphinControllable = getBoolean("mobs.dolphin.controllable", dolphinControllable); + dolphinSpitCooldown = getInt("mobs.dolphin.spit.cooldown", dolphinSpitCooldown); + dolphinSpitSpeed = (float) getDouble("mobs.dolphin.spit.speed", dolphinSpitSpeed); + dolphinSpitDamage = (float) getDouble("mobs.dolphin.spit.damage", dolphinSpitDamage); ++ if (PurpurConfig.version < 10) { ++ double oldValue = getDouble("mobs.dolphin.attributes.max-health", dolphinMaxHealth); ++ set("mobs.dolphin.attributes.max-health", null); ++ set("mobs.dolphin.attributes.max_health", oldValue); ++ } ++ dolphinMaxHealth = getDouble("mobs.dolphin.attributes.max_health", dolphinMaxHealth); + } + + public boolean donkeyRidableInWater = false; ++ public double donkeyMaxHealthMin = 15.0D; ++ public double donkeyMaxHealthMax = 30.0D; ++ public double donkeyJumpStrengthMin = 0.5D; ++ public double donkeyJumpStrengthMax = 0.5D; ++ public double donkeyMovementSpeedMin = 0.175D; ++ public double donkeyMovementSpeedMax = 0.175D; + private void donkeySettings() { + donkeyRidableInWater = getBoolean("mobs.donkey.ridable-in-water", donkeyRidableInWater); ++ if (PurpurConfig.version < 10) { ++ double oldMin = getDouble("mobs.donkey.attributes.max-health.min", donkeyMaxHealthMin); ++ double oldMax = getDouble("mobs.donkey.attributes.max-health.max", donkeyMaxHealthMax); ++ set("mobs.donkey.attributes.max-health", null); ++ set("mobs.donkey.attributes.max_health.min", oldMin); ++ set("mobs.donkey.attributes.max_health.max", oldMax); ++ } ++ donkeyMaxHealthMin = getDouble("mobs.donkey.attributes.max_health.min", donkeyMaxHealthMin); ++ donkeyMaxHealthMax = getDouble("mobs.donkey.attributes.max_health.max", donkeyMaxHealthMax); ++ donkeyJumpStrengthMin = getDouble("mobs.donkey.attributes.jump_strength.min", donkeyJumpStrengthMin); ++ donkeyJumpStrengthMax = getDouble("mobs.donkey.attributes.jump_strength.max", donkeyJumpStrengthMax); ++ donkeyMovementSpeedMin = getDouble("mobs.donkey.attributes.movement_speed.min", donkeyMovementSpeedMin); ++ donkeyMovementSpeedMax = getDouble("mobs.donkey.attributes.movement_speed.max", donkeyMovementSpeedMax); + } + + public boolean drownedRidable = false; + public boolean drownedRidableInWater = true; + public boolean drownedControllable = true; ++ public double drownedMaxHealth = 20.0D; ++ public double drownedSpawnReinforcements = 0.1D; + private void drownedSettings() { + drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); + drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); + drownedControllable = getBoolean("mobs.drowned.controllable", drownedControllable); ++ if (PurpurConfig.version < 10) { ++ double oldValue = getDouble("mobs.drowned.attributes.max-health", drownedMaxHealth); ++ set("mobs.drowned.attributes.max-health", null); ++ set("mobs.drowned.attributes.max_health", oldValue); ++ } ++ drownedMaxHealth = getDouble("mobs.drowned.attributes.max_health", drownedMaxHealth); ++ drownedSpawnReinforcements = getDouble("mobs.drowned.attributes.spawn_reinforcements", drownedSpawnReinforcements); + } + + public double camelMaxHealthMin = 32.0D; @@ -1574,124 +1755,32 @@ index 2b7f1dedb3289efc7e42a138f4483f4969902801..3a44c1fff53590ae5c65404564a3a2ee + camelJumpStrengthMax = getDouble("mobs.camel.attributes.jump_strength.max", camelJumpStrengthMax); + camelMovementSpeedMin = getDouble("mobs.camel.attributes.movement_speed.min", camelMovementSpeedMin); + camelMovementSpeedMax = getDouble("mobs.camel.attributes.movement_speed.max", camelMovementSpeedMax); -+ } -+ -+ public double catMaxHealth = 10.0D; -+ private void catSettings() { -+ if (PurpurConfig.version < 10) { -+ double oldValue = getDouble("mobs.cat.attributes.max-health", catMaxHealth); -+ set("mobs.cat.attributes.max-health", null); -+ set("mobs.cat.attributes.max_health", oldValue); -+ } -+ catMaxHealth = getDouble("mobs.cat.attributes.max_health", catMaxHealth); -+ } -+ -+ public double caveSpiderMaxHealth = 12.0D; -+ private void caveSpiderSettings() { -+ if (PurpurConfig.version < 10) { -+ double oldValue = getDouble("mobs.cave_spider.attributes.max-health", caveSpiderMaxHealth); -+ set("mobs.cave_spider.attributes.max-health", null); -+ set("mobs.cave_spider.attributes.max_health", oldValue); -+ } -+ caveSpiderMaxHealth = getDouble("mobs.cave_spider.attributes.max_health", caveSpiderMaxHealth); -+ } -+ -+ public double chickenMaxHealth = 4.0D; -+ private void chickenSettings() { -+ if (PurpurConfig.version < 10) { -+ double oldValue = getDouble("mobs.chicken.attributes.max-health", chickenMaxHealth); -+ set("mobs.chicken.attributes.max-health", null); -+ set("mobs.chicken.attributes.max_health", oldValue); -+ } -+ chickenMaxHealth = getDouble("mobs.chicken.attributes.max_health", chickenMaxHealth); -+ } -+ -+ public double codMaxHealth = 3.0D; -+ private void codSettings() { -+ if (PurpurConfig.version < 10) { -+ double oldValue = getDouble("mobs.cod.attributes.max-health", codMaxHealth); -+ set("mobs.cod.attributes.max-health", null); -+ set("mobs.cod.attributes.max_health", oldValue); -+ } -+ codMaxHealth = getDouble("mobs.cod.attributes.max_health", codMaxHealth); -+ } -+ -+ public double cowMaxHealth = 10.0D; -+ private void cowSettings() { -+ if (PurpurConfig.version < 10) { -+ double oldValue = getDouble("mobs.cow.attributes.max-health", cowMaxHealth); -+ set("mobs.cow.attributes.max-health", null); -+ set("mobs.cow.attributes.max_health", oldValue); -+ } -+ cowMaxHealth = getDouble("mobs.cow.attributes.max_health", cowMaxHealth); -+ } -+ -+ public double creeperMaxHealth = 20.0D; -+ private void creeperSettings() { -+ if (PurpurConfig.version < 10) { -+ double oldValue = getDouble("mobs.creeper.attributes.max-health", creeperMaxHealth); -+ set("mobs.creeper.attributes.max-health", null); -+ set("mobs.creeper.attributes.max_health", oldValue); -+ } -+ creeperMaxHealth = getDouble("mobs.creeper.attributes.max_health", creeperMaxHealth); -+ } -+ -+ public double dolphinMaxHealth = 10.0D; -+ private void dolphinSettings() { -+ if (PurpurConfig.version < 10) { -+ double oldValue = getDouble("mobs.dolphin.attributes.max-health", dolphinMaxHealth); -+ set("mobs.dolphin.attributes.max-health", null); -+ set("mobs.dolphin.attributes.max_health", oldValue); -+ } -+ dolphinMaxHealth = getDouble("mobs.dolphin.attributes.max_health", dolphinMaxHealth); -+ } -+ -+ public double donkeyMaxHealthMin = 15.0D; -+ public double donkeyMaxHealthMax = 30.0D; -+ public double donkeyJumpStrengthMin = 0.5D; -+ public double donkeyJumpStrengthMax = 0.5D; -+ public double donkeyMovementSpeedMin = 0.175D; -+ public double donkeyMovementSpeedMax = 0.175D; -+ private void donkeySettings() { -+ if (PurpurConfig.version < 10) { -+ double oldMin = getDouble("mobs.donkey.attributes.max-health.min", donkeyMaxHealthMin); -+ double oldMax = getDouble("mobs.donkey.attributes.max-health.max", donkeyMaxHealthMax); -+ set("mobs.donkey.attributes.max-health", null); -+ set("mobs.donkey.attributes.max_health.min", oldMin); -+ set("mobs.donkey.attributes.max_health.max", oldMax); -+ } -+ donkeyMaxHealthMin = getDouble("mobs.donkey.attributes.max_health.min", donkeyMaxHealthMin); -+ donkeyMaxHealthMax = getDouble("mobs.donkey.attributes.max_health.max", donkeyMaxHealthMax); -+ donkeyJumpStrengthMin = getDouble("mobs.donkey.attributes.jump_strength.min", donkeyJumpStrengthMin); -+ donkeyJumpStrengthMax = getDouble("mobs.donkey.attributes.jump_strength.max", donkeyJumpStrengthMax); -+ donkeyMovementSpeedMin = getDouble("mobs.donkey.attributes.movement_speed.min", donkeyMovementSpeedMin); -+ donkeyMovementSpeedMax = getDouble("mobs.donkey.attributes.movement_speed.max", donkeyMovementSpeedMax); -+ } -+ -+ public double drownedMaxHealth = 20.0D; -+ public double drownedSpawnReinforcements = 0.1D; -+ private void drownedSettings() { -+ if (PurpurConfig.version < 10) { -+ double oldValue = getDouble("mobs.drowned.attributes.max-health", drownedMaxHealth); -+ set("mobs.drowned.attributes.max-health", null); -+ set("mobs.drowned.attributes.max_health", oldValue); -+ } -+ drownedMaxHealth = getDouble("mobs.drowned.attributes.max_health", drownedMaxHealth); -+ drownedSpawnReinforcements = getDouble("mobs.drowned.attributes.spawn_reinforcements", drownedSpawnReinforcements); -+ } -+ + } + + public boolean elderGuardianRidable = false; + public boolean elderGuardianControllable = true; + public double elderGuardianMaxHealth = 80.0D; -+ private void elderGuardianSettings() { + private void elderGuardianSettings() { + elderGuardianRidable = getBoolean("mobs.elder_guardian.ridable", elderGuardianRidable); + elderGuardianControllable = getBoolean("mobs.elder_guardian.controllable", elderGuardianControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.elder_guardian.attributes.max-health", elderGuardianMaxHealth); + set("mobs.elder_guardian.attributes.max-health", null); + set("mobs.elder_guardian.attributes.max_health", oldValue); + } + elderGuardianMaxHealth = getDouble("mobs.elder_guardian.attributes.max_health", elderGuardianMaxHealth); -+ } -+ + } + + public boolean enderDragonRidable = false; + public boolean enderDragonRidableInWater = true; + public boolean enderDragonControllable = true; + public double enderDragonMaxY = 320D; + public double enderDragonMaxHealth = 200.0D; -+ private void enderDragonSettings() { + private void enderDragonSettings() { + enderDragonRidable = getBoolean("mobs.ender_dragon.ridable", enderDragonRidable); + enderDragonRidableInWater = getBoolean("mobs.ender_dragon.ridable-in-water", enderDragonRidableInWater); + enderDragonControllable = getBoolean("mobs.ender_dragon.controllable", enderDragonControllable); + enderDragonMaxY = getDouble("mobs.ender_dragon.ridable-max-y", enderDragonMaxY); + if (PurpurConfig.version < 8) { + double oldValue = getDouble("mobs.ender_dragon.max-health", enderDragonMaxHealth); + set("mobs.ender_dragon.max-health", null); @@ -1702,62 +1791,101 @@ index 2b7f1dedb3289efc7e42a138f4483f4969902801..3a44c1fff53590ae5c65404564a3a2ee + set("mobs.ender_dragon.attributes.max_health", oldValue); + } + enderDragonMaxHealth = getDouble("mobs.ender_dragon.attributes.max_health", enderDragonMaxHealth); -+ } -+ + } + + public boolean endermanRidable = false; + public boolean endermanRidableInWater = true; + public boolean endermanControllable = true; + public double endermanMaxHealth = 40.0D; -+ private void endermanSettings() { + private void endermanSettings() { + endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); + endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); + endermanControllable = getBoolean("mobs.enderman.controllable", endermanControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.enderman.attributes.max-health", endermanMaxHealth); + set("mobs.enderman.attributes.max-health", null); + set("mobs.enderman.attributes.max_health", oldValue); + } + endermanMaxHealth = getDouble("mobs.enderman.attributes.max_health", endermanMaxHealth); -+ } -+ + } + + public boolean endermiteRidable = false; + public boolean endermiteRidableInWater = true; + public boolean endermiteControllable = true; + public double endermiteMaxHealth = 8.0D; -+ private void endermiteSettings() { + private void endermiteSettings() { + endermiteRidable = getBoolean("mobs.endermite.ridable", endermiteRidable); + endermiteRidableInWater = getBoolean("mobs.endermite.ridable-in-water", endermiteRidableInWater); + endermiteControllable = getBoolean("mobs.endermite.controllable", endermiteControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.endermite.attributes.max-health", endermiteMaxHealth); + set("mobs.endermite.attributes.max-health", null); + set("mobs.endermite.attributes.max_health", oldValue); + } + endermiteMaxHealth = getDouble("mobs.endermite.attributes.max_health", endermiteMaxHealth); -+ } -+ + } + + public boolean evokerRidable = false; + public boolean evokerRidableInWater = true; + public boolean evokerControllable = true; + public double evokerMaxHealth = 24.0D; -+ private void evokerSettings() { + private void evokerSettings() { + evokerRidable = getBoolean("mobs.evoker.ridable", evokerRidable); + evokerRidableInWater = getBoolean("mobs.evoker.ridable-in-water", evokerRidableInWater); + evokerControllable = getBoolean("mobs.evoker.controllable", evokerControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.evoker.attributes.max-health", evokerMaxHealth); + set("mobs.evoker.attributes.max-health", null); + set("mobs.evoker.attributes.max_health", oldValue); + } + evokerMaxHealth = getDouble("mobs.evoker.attributes.max_health", evokerMaxHealth); -+ } -+ + } + + public boolean foxRidable = false; + public boolean foxRidableInWater = true; + public boolean foxControllable = true; + public double foxMaxHealth = 10.0D; -+ private void foxSettings() { + private void foxSettings() { + foxRidable = getBoolean("mobs.fox.ridable", foxRidable); + foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); + foxControllable = getBoolean("mobs.fox.controllable", foxControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.fox.attributes.max-health", foxMaxHealth); + set("mobs.fox.attributes.max-health", null); + set("mobs.fox.attributes.max_health", oldValue); + } + foxMaxHealth = getDouble("mobs.fox.attributes.max_health", foxMaxHealth); -+ } -+ + } + + public boolean frogRidable = false; +@@ -300,147 +475,319 @@ public class PurpurWorldConfig { + public boolean ghastRidableInWater = true; + public boolean ghastControllable = true; + public double ghastMaxY = 320D; + public double ghastMaxHealth = 10.0D; -+ private void ghastSettings() { + private void ghastSettings() { + ghastRidable = getBoolean("mobs.ghast.ridable", ghastRidable); + ghastRidableInWater = getBoolean("mobs.ghast.ridable-in-water", ghastRidableInWater); + ghastControllable = getBoolean("mobs.ghast.controllable", ghastControllable); + ghastMaxY = getDouble("mobs.ghast.ridable-max-y", ghastMaxY); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.ghast.attributes.max-health", ghastMaxHealth); + set("mobs.ghast.attributes.max-health", null); + set("mobs.ghast.attributes.max_health", oldValue); + } + ghastMaxHealth = getDouble("mobs.ghast.attributes.max_health", ghastMaxHealth); -+ } -+ + } + + public boolean giantRidable = false; + public boolean giantRidableInWater = true; + public boolean giantControllable = true; + public double giantMovementSpeed = 0.5D; + public double giantAttackDamage = 50.0D; + public double giantMaxHealth = 100.0D; -+ private void giantSettings() { + private void giantSettings() { + giantRidable = getBoolean("mobs.giant.ridable", giantRidable); + giantRidableInWater = getBoolean("mobs.giant.ridable-in-water", giantRidableInWater); + giantControllable = getBoolean("mobs.giant.controllable", giantControllable); + giantMovementSpeed = getDouble("mobs.giant.movement-speed", giantMovementSpeed); + giantAttackDamage = getDouble("mobs.giant.attack-damage", giantAttackDamage); + if (PurpurConfig.version < 8) { @@ -1770,45 +1898,67 @@ index 2b7f1dedb3289efc7e42a138f4483f4969902801..3a44c1fff53590ae5c65404564a3a2ee + set("mobs.giant.attributes.max_health", oldValue); + } + giantMaxHealth = getDouble("mobs.giant.attributes.max_health", giantMaxHealth); -+ } -+ + } + + public boolean glowSquidRidable = false; + public boolean glowSquidControllable = true; + public double glowSquidMaxHealth = 10.0D; -+ private void glowSquidSettings() { + private void glowSquidSettings() { + glowSquidRidable = getBoolean("mobs.glow_squid.ridable", glowSquidRidable); + glowSquidControllable = getBoolean("mobs.glow_squid.controllable", glowSquidControllable); + glowSquidMaxHealth = getDouble("mobs.glow_squid.attributes.max_health", glowSquidMaxHealth); -+ } -+ + } + + public boolean goatRidable = false; + public boolean goatRidableInWater = true; + public boolean goatControllable = true; + public double goatMaxHealth = 10.0D; -+ private void goatSettings() { + private void goatSettings() { + goatRidable = getBoolean("mobs.goat.ridable", goatRidable); + goatRidableInWater = getBoolean("mobs.goat.ridable-in-water", goatRidableInWater); + goatControllable = getBoolean("mobs.goat.controllable", goatControllable); + goatMaxHealth = getDouble("mobs.goat.attributes.max_health", goatMaxHealth); -+ } -+ + } + + public boolean guardianRidable = false; + public boolean guardianControllable = true; + public double guardianMaxHealth = 30.0D; -+ private void guardianSettings() { + private void guardianSettings() { + guardianRidable = getBoolean("mobs.guardian.ridable", guardianRidable); + guardianControllable = getBoolean("mobs.guardian.controllable", guardianControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.guardian.attributes.max-health", guardianMaxHealth); + set("mobs.guardian.attributes.max-health", null); + set("mobs.guardian.attributes.max_health", oldValue); + } + guardianMaxHealth = getDouble("mobs.guardian.attributes.max_health", guardianMaxHealth); -+ } -+ + } + + public boolean hoglinRidable = false; + public boolean hoglinRidableInWater = true; + public boolean hoglinControllable = true; + public double hoglinMaxHealth = 40.0D; -+ private void hoglinSettings() { + private void hoglinSettings() { + hoglinRidable = getBoolean("mobs.hoglin.ridable", hoglinRidable); + hoglinRidableInWater = getBoolean("mobs.hoglin.ridable-in-water", hoglinRidableInWater); + hoglinControllable = getBoolean("mobs.hoglin.controllable", hoglinControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.hoglin.attributes.max-health", hoglinMaxHealth); + set("mobs.hoglin.attributes.max-health", null); + set("mobs.hoglin.attributes.max_health", oldValue); + } + hoglinMaxHealth = getDouble("mobs.hoglin.attributes.max_health", hoglinMaxHealth); -+ } -+ + } + + public boolean horseRidableInWater = false; + public double horseMaxHealthMin = 15.0D; + public double horseMaxHealthMax = 30.0D; + public double horseJumpStrengthMin = 0.4D; + public double horseJumpStrengthMax = 1.0D; + public double horseMovementSpeedMin = 0.1125D; + public double horseMovementSpeedMax = 0.3375D; -+ private void horseSettings() { + private void horseSettings() { + horseRidableInWater = getBoolean("mobs.horse.ridable-in-water", horseRidableInWater); + if (PurpurConfig.version < 10) { + double oldMin = getDouble("mobs.horse.attributes.max-health.min", horseMaxHealthMin); + double oldMax = getDouble("mobs.horse.attributes.max-health.max", horseMaxHealthMax); @@ -1822,11 +1972,17 @@ index 2b7f1dedb3289efc7e42a138f4483f4969902801..3a44c1fff53590ae5c65404564a3a2ee + horseJumpStrengthMax = getDouble("mobs.horse.attributes.jump_strength.max", horseJumpStrengthMax); + horseMovementSpeedMin = getDouble("mobs.horse.attributes.movement_speed.min", horseMovementSpeedMin); + horseMovementSpeedMax = getDouble("mobs.horse.attributes.movement_speed.max", horseMovementSpeedMax); -+ } -+ + } + + public boolean huskRidable = false; + public boolean huskRidableInWater = true; + public boolean huskControllable = true; + public double huskMaxHealth = 20.0D; + public double huskSpawnReinforcements = 0.1D; -+ private void huskSettings() { + private void huskSettings() { + huskRidable = getBoolean("mobs.husk.ridable", huskRidable); + huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); + huskControllable = getBoolean("mobs.husk.controllable", huskControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.husk.attributes.max-health", huskMaxHealth); + set("mobs.husk.attributes.max-health", null); @@ -1834,12 +1990,18 @@ index 2b7f1dedb3289efc7e42a138f4483f4969902801..3a44c1fff53590ae5c65404564a3a2ee + } + huskMaxHealth = getDouble("mobs.husk.attributes.max_health", huskMaxHealth); + huskSpawnReinforcements = getDouble("mobs.husk.attributes.spawn_reinforcements", huskSpawnReinforcements); -+ } -+ + } + + public boolean illusionerRidable = false; + public boolean illusionerRidableInWater = true; + public boolean illusionerControllable = true; + public double illusionerMovementSpeed = 0.5D; + public double illusionerFollowRange = 18.0D; + public double illusionerMaxHealth = 32.0D; -+ private void illusionerSettings() { + private void illusionerSettings() { + illusionerRidable = getBoolean("mobs.illusioner.ridable", illusionerRidable); + illusionerRidableInWater = getBoolean("mobs.illusioner.ridable-in-water", illusionerRidableInWater); + illusionerControllable = getBoolean("mobs.illusioner.controllable", illusionerControllable); + illusionerMovementSpeed = getDouble("mobs.illusioner.movement-speed", illusionerMovementSpeed); + illusionerFollowRange = getDouble("mobs.illusioner.follow-range", illusionerFollowRange); + if (PurpurConfig.version < 8) { @@ -1852,28 +2014,39 @@ index 2b7f1dedb3289efc7e42a138f4483f4969902801..3a44c1fff53590ae5c65404564a3a2ee + set("mobs.illusioner.attributes.max_health", oldValue); + } + illusionerMaxHealth = getDouble("mobs.illusioner.attributes.max_health", illusionerMaxHealth); -+ } -+ + } + + public boolean ironGolemRidable = false; + public boolean ironGolemRidableInWater = true; + public boolean ironGolemControllable = true; + public boolean ironGolemCanSwim = false; + public double ironGolemMaxHealth = 100.0D; -+ private void ironGolemSettings() { + private void ironGolemSettings() { + ironGolemRidable = getBoolean("mobs.iron_golem.ridable", ironGolemRidable); + ironGolemRidableInWater = getBoolean("mobs.iron_golem.ridable-in-water", ironGolemRidableInWater); + ironGolemControllable = getBoolean("mobs.iron_golem.controllable", ironGolemControllable); + ironGolemCanSwim = getBoolean("mobs.iron_golem.can-swim", ironGolemCanSwim); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.iron_golem.attributes.max-health", ironGolemMaxHealth); + set("mobs.iron_golem.attributes.max-health", null); + set("mobs.iron_golem.attributes.max_health", oldValue); + } + ironGolemMaxHealth = getDouble("mobs.iron_golem.attributes.max_health", ironGolemMaxHealth); -+ } -+ -+ public boolean llamaRidable = false; -+ public boolean llamaRidableInWater = false; -+ public boolean llamaControllable = true; + } + + public boolean llamaRidable = false; + public boolean llamaRidableInWater = false; + public boolean llamaControllable = true; + public double llamaMaxHealthMin = 15.0D; + public double llamaMaxHealthMax = 30.0D; + public double llamaJumpStrengthMin = 0.5D; + public double llamaJumpStrengthMax = 0.5D; + public double llamaMovementSpeedMin = 0.175D; + public double llamaMovementSpeedMax = 0.175D; -+ private void llamaSettings() { + private void llamaSettings() { + llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); + llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); + llamaControllable = getBoolean("mobs.llama.controllable", llamaControllable); + llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); + llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); + llamaControllable = getBoolean("mobs.llama.controllable", llamaControllable); @@ -1890,13 +2063,19 @@ index 2b7f1dedb3289efc7e42a138f4483f4969902801..3a44c1fff53590ae5c65404564a3a2ee + llamaJumpStrengthMax = getDouble("mobs.llama.attributes.jump_strength.max", llamaJumpStrengthMax); + llamaMovementSpeedMin = getDouble("mobs.llama.attributes.movement_speed.min", llamaMovementSpeedMin); + llamaMovementSpeedMax = getDouble("mobs.llama.attributes.movement_speed.max", llamaMovementSpeedMax); -+ } -+ + } + + public boolean magmaCubeRidable = false; + public boolean magmaCubeRidableInWater = true; + public boolean magmaCubeControllable = true; + public String magmaCubeMaxHealth = "size * size"; + public String magmaCubeAttackDamage = "size"; + public Map magmaCubeMaxHealthCache = new HashMap<>(); + public Map magmaCubeAttackDamageCache = new HashMap<>(); -+ private void magmaCubeSettings() { + private void magmaCubeSettings() { + magmaCubeRidable = getBoolean("mobs.magma_cube.ridable", magmaCubeRidable); + magmaCubeRidableInWater = getBoolean("mobs.magma_cube.ridable-in-water", magmaCubeRidableInWater); + magmaCubeControllable = getBoolean("mobs.magma_cube.controllable", magmaCubeControllable); + if (PurpurConfig.version < 10) { + String oldValue = getString("mobs.magma_cube.attributes.max-health", magmaCubeMaxHealth); + set("mobs.magma_cube.attributes.max-health", null); @@ -1906,25 +2085,33 @@ index 2b7f1dedb3289efc7e42a138f4483f4969902801..3a44c1fff53590ae5c65404564a3a2ee + magmaCubeAttackDamage = getString("mobs.magma_cube.attributes.attack_damage", magmaCubeAttackDamage); + magmaCubeMaxHealthCache.clear(); + magmaCubeAttackDamageCache.clear(); -+ } -+ + } + + public boolean mooshroomRidable = false; + public boolean mooshroomRidableInWater = true; + public boolean mooshroomControllable = true; + public double mooshroomMaxHealth = 10.0D; -+ private void mooshroomSettings() { + private void mooshroomSettings() { + mooshroomRidable = getBoolean("mobs.mooshroom.ridable", mooshroomRidable); + mooshroomRidableInWater = getBoolean("mobs.mooshroom.ridable-in-water", mooshroomRidableInWater); + mooshroomControllable = getBoolean("mobs.mooshroom.controllable", mooshroomControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.mooshroom.attributes.max-health", mooshroomMaxHealth); + set("mobs.mooshroom.attributes.max-health", null); + set("mobs.mooshroom.attributes.max_health", oldValue); + } + mooshroomMaxHealth = getDouble("mobs.mooshroom.attributes.max_health", mooshroomMaxHealth); -+ } -+ + } + + public boolean muleRidableInWater = false; + public double muleMaxHealthMin = 15.0D; + public double muleMaxHealthMax = 30.0D; + public double muleJumpStrengthMin = 0.5D; + public double muleJumpStrengthMax = 0.5D; + public double muleMovementSpeedMin = 0.175D; + public double muleMovementSpeedMax = 0.175D; -+ private void muleSettings() { + private void muleSettings() { + muleRidableInWater = getBoolean("mobs.mule.ridable-in-water", muleRidableInWater); + if (PurpurConfig.version < 10) { + double oldMin = getDouble("mobs.mule.attributes.max-health.min", muleMaxHealthMin); + double oldMax = getDouble("mobs.mule.attributes.max-health.max", muleMaxHealthMax); @@ -1938,43 +2125,74 @@ index 2b7f1dedb3289efc7e42a138f4483f4969902801..3a44c1fff53590ae5c65404564a3a2ee + muleJumpStrengthMax = getDouble("mobs.mule.attributes.jump_strength.max", muleJumpStrengthMax); + muleMovementSpeedMin = getDouble("mobs.mule.attributes.movement_speed.min", muleMovementSpeedMin); + muleMovementSpeedMax = getDouble("mobs.mule.attributes.movement_speed.max", muleMovementSpeedMax); -+ } -+ + } + + public boolean ocelotRidable = false; + public boolean ocelotRidableInWater = true; + public boolean ocelotControllable = true; + public double ocelotMaxHealth = 10.0D; -+ private void ocelotSettings() { + private void ocelotSettings() { + ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable); + ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater); + ocelotControllable = getBoolean("mobs.ocelot.controllable", ocelotControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.ocelot.attributes.max-health", ocelotMaxHealth); + set("mobs.ocelot.attributes.max-health", null); + set("mobs.ocelot.attributes.max_health", oldValue); + } + ocelotMaxHealth = getDouble("mobs.ocelot.attributes.max_health", ocelotMaxHealth); -+ } -+ + } + + public boolean pandaRidable = false; + public boolean pandaRidableInWater = true; + public boolean pandaControllable = true; + public double pandaMaxHealth = 20.0D; -+ private void pandaSettings() { + private void pandaSettings() { + pandaRidable = getBoolean("mobs.panda.ridable", pandaRidable); + pandaRidableInWater = getBoolean("mobs.panda.ridable-in-water", pandaRidableInWater); + pandaControllable = getBoolean("mobs.panda.controllable", pandaControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.panda.attributes.max-health", pandaMaxHealth); + set("mobs.panda.attributes.max-health", null); + set("mobs.panda.attributes.max_health", oldValue); + } + pandaMaxHealth = getDouble("mobs.panda.attributes.max_health", pandaMaxHealth); -+ } -+ + } + + public boolean parrotRidable = false; + public boolean parrotRidableInWater = true; + public boolean parrotControllable = true; + public double parrotMaxY = 320D; + public double parrotMaxHealth = 6.0D; -+ private void parrotSettings() { + private void parrotSettings() { + parrotRidable = getBoolean("mobs.parrot.ridable", parrotRidable); + parrotRidableInWater = getBoolean("mobs.parrot.ridable-in-water", parrotRidableInWater); + parrotControllable = getBoolean("mobs.parrot.controllable", parrotControllable); + parrotMaxY = getDouble("mobs.parrot.ridable-max-y", parrotMaxY); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.parrot.attributes.max-health", parrotMaxHealth); + set("mobs.parrot.attributes.max-health", null); + set("mobs.parrot.attributes.max_health", oldValue); + } + parrotMaxHealth = getDouble("mobs.parrot.attributes.max_health", parrotMaxHealth); -+ } -+ + } + + public boolean phantomRidable = false; +@@ -450,6 +797,10 @@ public class PurpurWorldConfig { + public float phantomFlameDamage = 1.0F; + public int phantomFlameFireTime = 8; + public boolean phantomAllowGriefing = false; + public String phantomMaxHealth = "20.0"; + public String phantomAttackDamage = "6 + size"; + public Map phantomMaxHealthCache = new HashMap<>(); + public Map phantomAttackDamageCache = new HashMap<>(); -+ private void phantomSettings() { + private void phantomSettings() { + phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); + phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); +@@ -458,189 +809,361 @@ public class PurpurWorldConfig { + phantomFlameDamage = (float) getDouble("mobs.phantom.flames.damage", phantomFlameDamage); + phantomFlameFireTime = getInt("mobs.phantom.flames.fire-time", phantomFlameFireTime); + phantomAllowGriefing = getBoolean("mobs.phantom.allow-griefing", phantomAllowGriefing); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.phantom.attributes.max-health", Double.parseDouble(phantomMaxHealth)); + set("mobs.phantom.attributes.max-health", null); @@ -1988,145 +2206,223 @@ index 2b7f1dedb3289efc7e42a138f4483f4969902801..3a44c1fff53590ae5c65404564a3a2ee + phantomAttackDamage = getString("mobs.phantom.attributes.attack_damage", phantomAttackDamage); + phantomMaxHealthCache.clear(); + phantomAttackDamageCache.clear(); -+ } -+ + } + + public boolean pigRidable = false; + public boolean pigRidableInWater = false; + public boolean pigControllable = true; + public double pigMaxHealth = 10.0D; -+ private void pigSettings() { + private void pigSettings() { + pigRidable = getBoolean("mobs.pig.ridable", pigRidable); + pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); + pigControllable = getBoolean("mobs.pig.controllable", pigControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.pig.attributes.max-health", pigMaxHealth); + set("mobs.pig.attributes.max-health", null); + set("mobs.pig.attributes.max_health", oldValue); + } + pigMaxHealth = getDouble("mobs.pig.attributes.max_health", pigMaxHealth); -+ } -+ + } + + public boolean piglinRidable = false; + public boolean piglinRidableInWater = true; + public boolean piglinControllable = true; + public double piglinMaxHealth = 16.0D; -+ private void piglinSettings() { + private void piglinSettings() { + piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); + piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); + piglinControllable = getBoolean("mobs.piglin.controllable", piglinControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.piglin.attributes.max-health", piglinMaxHealth); + set("mobs.piglin.attributes.max-health", null); + set("mobs.piglin.attributes.max_health", oldValue); + } + piglinMaxHealth = getDouble("mobs.piglin.attributes.max_health", piglinMaxHealth); -+ } -+ + } + + public boolean piglinBruteRidable = false; + public boolean piglinBruteRidableInWater = true; + public boolean piglinBruteControllable = true; + public double piglinBruteMaxHealth = 50.0D; -+ private void piglinBruteSettings() { + private void piglinBruteSettings() { + piglinBruteRidable = getBoolean("mobs.piglin_brute.ridable", piglinBruteRidable); + piglinBruteRidableInWater = getBoolean("mobs.piglin_brute.ridable-in-water", piglinBruteRidableInWater); + piglinBruteControllable = getBoolean("mobs.piglin_brute.controllable", piglinBruteControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.piglin_brute.attributes.max-health", piglinBruteMaxHealth); + set("mobs.piglin_brute.attributes.max-health", null); + set("mobs.piglin_brute.attributes.max_health", oldValue); + } + piglinBruteMaxHealth = getDouble("mobs.piglin_brute.attributes.max_health", piglinBruteMaxHealth); -+ } -+ + } + + public boolean pillagerRidable = false; + public boolean pillagerRidableInWater = true; + public boolean pillagerControllable = true; + public double pillagerMaxHealth = 24.0D; -+ private void pillagerSettings() { + private void pillagerSettings() { + pillagerRidable = getBoolean("mobs.pillager.ridable", pillagerRidable); + pillagerRidableInWater = getBoolean("mobs.pillager.ridable-in-water", pillagerRidableInWater); + pillagerControllable = getBoolean("mobs.pillager.controllable", pillagerControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.pillager.attributes.max-health", pillagerMaxHealth); + set("mobs.pillager.attributes.max-health", null); + set("mobs.pillager.attributes.max_health", oldValue); + } + pillagerMaxHealth = getDouble("mobs.pillager.attributes.max_health", pillagerMaxHealth); -+ } -+ + } + + public boolean polarBearRidable = false; + public boolean polarBearRidableInWater = true; + public boolean polarBearControllable = true; + public double polarBearMaxHealth = 30.0D; -+ private void polarBearSettings() { + private void polarBearSettings() { + polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); + polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); + polarBearControllable = getBoolean("mobs.polar_bear.controllable", polarBearControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.polar_bear.attributes.max-health", polarBearMaxHealth); + set("mobs.polar_bear.attributes.max-health", null); + set("mobs.polar_bear.attributes.max_health", oldValue); + } + polarBearMaxHealth = getDouble("mobs.polar_bear.attributes.max_health", polarBearMaxHealth); -+ } -+ + } + + public boolean pufferfishRidable = false; + public boolean pufferfishControllable = true; + public double pufferfishMaxHealth = 3.0D; -+ private void pufferfishSettings() { + private void pufferfishSettings() { + pufferfishRidable = getBoolean("mobs.pufferfish.ridable", pufferfishRidable); + pufferfishControllable = getBoolean("mobs.pufferfish.controllable", pufferfishControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.pufferfish.attributes.max-health", pufferfishMaxHealth); + set("mobs.pufferfish.attributes.max-health", null); + set("mobs.pufferfish.attributes.max_health", oldValue); + } + pufferfishMaxHealth = getDouble("mobs.pufferfish.attributes.max_health", pufferfishMaxHealth); -+ } -+ + } + + public boolean rabbitRidable = false; + public boolean rabbitRidableInWater = true; + public boolean rabbitControllable = true; + public double rabbitMaxHealth = 3.0D; -+ private void rabbitSettings() { + private void rabbitSettings() { + rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); + rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); + rabbitControllable = getBoolean("mobs.rabbit.controllable", rabbitControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.rabbit.attributes.max-health", rabbitMaxHealth); + set("mobs.rabbit.attributes.max-health", null); + set("mobs.rabbit.attributes.max_health", oldValue); + } + rabbitMaxHealth = getDouble("mobs.rabbit.attributes.max_health", rabbitMaxHealth); -+ } -+ + } + + public boolean ravagerRidable = false; + public boolean ravagerRidableInWater = false; + public boolean ravagerControllable = true; + public double ravagerMaxHealth = 100.0D; -+ private void ravagerSettings() { + private void ravagerSettings() { + ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); + ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); + ravagerControllable = getBoolean("mobs.ravager.controllable", ravagerControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.ravager.attributes.max-health", ravagerMaxHealth); + set("mobs.ravager.attributes.max-health", null); + set("mobs.ravager.attributes.max_health", oldValue); + } + ravagerMaxHealth = getDouble("mobs.ravager.attributes.max_health", ravagerMaxHealth); -+ } -+ + } + + public boolean salmonRidable = false; + public boolean salmonControllable = true; + public double salmonMaxHealth = 3.0D; -+ private void salmonSettings() { + private void salmonSettings() { + salmonRidable = getBoolean("mobs.salmon.ridable", salmonRidable); + salmonControllable = getBoolean("mobs.salmon.controllable", salmonControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.salmon.attributes.max-health", salmonMaxHealth); + set("mobs.salmon.attributes.max-health", null); + set("mobs.salmon.attributes.max_health", oldValue); + } + salmonMaxHealth = getDouble("mobs.salmon.attributes.max_health", salmonMaxHealth); -+ } -+ + } + + public boolean sheepRidable = false; + public boolean sheepRidableInWater = true; + public boolean sheepControllable = true; + public double sheepMaxHealth = 8.0D; -+ private void sheepSettings() { + private void sheepSettings() { + sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); + sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); + sheepControllable = getBoolean("mobs.sheep.controllable", sheepControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.sheep.attributes.max-health", sheepMaxHealth); + set("mobs.sheep.attributes.max-health", null); + set("mobs.sheep.attributes.max_health", oldValue); + } + sheepMaxHealth = getDouble("mobs.sheep.attributes.max_health", sheepMaxHealth); -+ } -+ + } + + public boolean shulkerRidable = false; + public boolean shulkerRidableInWater = true; + public boolean shulkerControllable = true; + public double shulkerMaxHealth = 30.0D; -+ private void shulkerSettings() { + private void shulkerSettings() { + shulkerRidable = getBoolean("mobs.shulker.ridable", shulkerRidable); + shulkerRidableInWater = getBoolean("mobs.shulker.ridable-in-water", shulkerRidableInWater); + shulkerControllable = getBoolean("mobs.shulker.controllable", shulkerControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.shulker.attributes.max-health", shulkerMaxHealth); + set("mobs.shulker.attributes.max-health", null); + set("mobs.shulker.attributes.max_health", oldValue); + } + shulkerMaxHealth = getDouble("mobs.shulker.attributes.max_health", shulkerMaxHealth); -+ } -+ + } + + public boolean silverfishRidable = false; + public boolean silverfishRidableInWater = true; + public boolean silverfishControllable = true; + public double silverfishMaxHealth = 8.0D; -+ private void silverfishSettings() { + private void silverfishSettings() { + silverfishRidable = getBoolean("mobs.silverfish.ridable", silverfishRidable); + silverfishRidableInWater = getBoolean("mobs.silverfish.ridable-in-water", silverfishRidableInWater); + silverfishControllable = getBoolean("mobs.silverfish.controllable", silverfishControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.silverfish.attributes.max-health", silverfishMaxHealth); + set("mobs.silverfish.attributes.max-health", null); + set("mobs.silverfish.attributes.max_health", oldValue); + } + silverfishMaxHealth = getDouble("mobs.silverfish.attributes.max_health", silverfishMaxHealth); -+ } -+ + } + + public boolean skeletonRidable = false; + public boolean skeletonRidableInWater = true; + public boolean skeletonControllable = true; + public double skeletonMaxHealth = 20.0D; -+ private void skeletonSettings() { + private void skeletonSettings() { + skeletonRidable = getBoolean("mobs.skeleton.ridable", skeletonRidable); + skeletonRidableInWater = getBoolean("mobs.skeleton.ridable-in-water", skeletonRidableInWater); + skeletonControllable = getBoolean("mobs.skeleton.controllable", skeletonControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.skeleton.attributes.max-health", skeletonMaxHealth); + set("mobs.skeleton.attributes.max-health", null); + set("mobs.skeleton.attributes.max_health", oldValue); + } + skeletonMaxHealth = getDouble("mobs.skeleton.attributes.max_health", skeletonMaxHealth); -+ } -+ + } + + public boolean skeletonHorseRidableInWater = true; + public boolean skeletonHorseCanSwim = false; + public double skeletonHorseMaxHealthMin = 15.0D; + public double skeletonHorseMaxHealthMax = 15.0D; + public double skeletonHorseJumpStrengthMin = 0.4D; + public double skeletonHorseJumpStrengthMax = 1.0D; + public double skeletonHorseMovementSpeedMin = 0.2D; + public double skeletonHorseMovementSpeedMax = 0.2D; -+ private void skeletonHorseSettings() { + private void skeletonHorseSettings() { + skeletonHorseRidableInWater = getBoolean("mobs.skeleton_horse.ridable-in-water", skeletonHorseRidableInWater); + skeletonHorseCanSwim = getBoolean("mobs.skeleton_horse.can-swim", skeletonHorseCanSwim); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.skeleton_horse.attributes.max-health", skeletonHorseMaxHealthMin); + set("mobs.skeleton_horse.attributes.max-health", null); @@ -2139,13 +2435,19 @@ index 2b7f1dedb3289efc7e42a138f4483f4969902801..3a44c1fff53590ae5c65404564a3a2ee + skeletonHorseJumpStrengthMax = getDouble("mobs.skeleton_horse.attributes.jump_strength.max", skeletonHorseJumpStrengthMax); + skeletonHorseMovementSpeedMin = getDouble("mobs.skeleton_horse.attributes.movement_speed.min", skeletonHorseMovementSpeedMin); + skeletonHorseMovementSpeedMax = getDouble("mobs.skeleton_horse.attributes.movement_speed.max", skeletonHorseMovementSpeedMax); -+ } -+ + } + + public boolean slimeRidable = false; + public boolean slimeRidableInWater = true; + public boolean slimeControllable = true; + public String slimeMaxHealth = "size * size"; + public String slimeAttackDamage = "size"; + public Map slimeMaxHealthCache = new HashMap<>(); + public Map slimeAttackDamageCache = new HashMap<>(); -+ private void slimeSettings() { + private void slimeSettings() { + slimeRidable = getBoolean("mobs.slime.ridable", slimeRidable); + slimeRidableInWater = getBoolean("mobs.slime.ridable-in-water", slimeRidableInWater); + slimeControllable = getBoolean("mobs.slime.controllable", slimeControllable); + if (PurpurConfig.version < 10) { + String oldValue = getString("mobs.slime.attributes.max-health", slimeMaxHealth); + set("mobs.slime.attributes.max-health", null); @@ -2155,72 +2457,114 @@ index 2b7f1dedb3289efc7e42a138f4483f4969902801..3a44c1fff53590ae5c65404564a3a2ee + slimeAttackDamage = getString("mobs.slime.attributes.attack_damage", slimeAttackDamage); + slimeMaxHealthCache.clear(); + slimeAttackDamageCache.clear(); -+ } -+ -+ public boolean snowGolemLeaveTrailWhenRidden = false; + } + + public boolean snowGolemRidable = false; + public boolean snowGolemRidableInWater = true; + public boolean snowGolemControllable = true; + public boolean snowGolemLeaveTrailWhenRidden = false; + public double snowGolemMaxHealth = 4.0D; -+ private void snowGolemSettings() { -+ snowGolemLeaveTrailWhenRidden = getBoolean("mobs.snow_golem.leave-trail-when-ridden", snowGolemLeaveTrailWhenRidden); + private void snowGolemSettings() { + snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); + snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); + snowGolemControllable = getBoolean("mobs.snow_golem.controllable", snowGolemControllable); + snowGolemLeaveTrailWhenRidden = getBoolean("mobs.snow_golem.leave-trail-when-ridden", snowGolemLeaveTrailWhenRidden); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.snow_golem.attributes.max-health", snowGolemMaxHealth); + set("mobs.snow_golem.attributes.max-health", null); + set("mobs.snow_golem.attributes.max_health", oldValue); + } + snowGolemMaxHealth = getDouble("mobs.snow_golem.attributes.max_health", snowGolemMaxHealth); -+ } -+ + } + + public boolean snifferRidable = false; + public boolean snifferRidableInWater = true; + public boolean snifferControllable = true; + public double snifferMaxHealth = 14.0D; -+ private void snifferSettings() { + private void snifferSettings() { + snifferRidable = getBoolean("mobs.sniffer.ridable", snifferRidable); + snifferRidableInWater = getBoolean("mobs.sniffer.ridable-in-water", snifferRidableInWater); + snifferControllable = getBoolean("mobs.sniffer.controllable", snifferControllable); + snifferMaxHealth = getDouble("mobs.sniffer.attributes.max_health", snifferMaxHealth); -+ } -+ + } + + public boolean squidRidable = false; + public boolean squidControllable = true; + public double squidMaxHealth = 10.0D; -+ private void squidSettings() { + private void squidSettings() { + squidRidable = getBoolean("mobs.squid.ridable", squidRidable); + squidControllable = getBoolean("mobs.squid.controllable", squidControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.squid.attributes.max-health", squidMaxHealth); + set("mobs.squid.attributes.max-health", null); + set("mobs.squid.attributes.max_health", oldValue); + } + squidMaxHealth = getDouble("mobs.squid.attributes.max_health", squidMaxHealth); -+ } -+ + } + + public boolean spiderRidable = false; + public boolean spiderRidableInWater = false; + public boolean spiderControllable = true; + public double spiderMaxHealth = 16.0D; -+ private void spiderSettings() { + private void spiderSettings() { + spiderRidable = getBoolean("mobs.spider.ridable", spiderRidable); + spiderRidableInWater = getBoolean("mobs.spider.ridable-in-water", spiderRidableInWater); + spiderControllable = getBoolean("mobs.spider.controllable", spiderControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.spider.attributes.max-health", spiderMaxHealth); + set("mobs.spider.attributes.max-health", null); + set("mobs.spider.attributes.max_health", oldValue); + } + spiderMaxHealth = getDouble("mobs.spider.attributes.max_health", spiderMaxHealth); -+ } -+ + } + + public boolean strayRidable = false; + public boolean strayRidableInWater = true; + public boolean strayControllable = true; + public double strayMaxHealth = 20.0D; -+ private void straySettings() { + private void straySettings() { + strayRidable = getBoolean("mobs.stray.ridable", strayRidable); + strayRidableInWater = getBoolean("mobs.stray.ridable-in-water", strayRidableInWater); + strayControllable = getBoolean("mobs.stray.controllable", strayControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.stray.attributes.max-health", strayMaxHealth); + set("mobs.stray.attributes.max-health", null); + set("mobs.stray.attributes.max_health", oldValue); + } + strayMaxHealth = getDouble("mobs.stray.attributes.max_health", strayMaxHealth); -+ } -+ + } + + public boolean striderRidable = false; + public boolean striderRidableInWater = false; + public boolean striderControllable = true; + public double striderMaxHealth = 20.0D; -+ private void striderSettings() { + private void striderSettings() { + striderRidable = getBoolean("mobs.strider.ridable", striderRidable); + striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); + striderControllable = getBoolean("mobs.strider.controllable", striderControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.strider.attributes.max-health", striderMaxHealth); + set("mobs.strider.attributes.max-health", null); + set("mobs.strider.attributes.max_health", oldValue); + } + striderMaxHealth = getDouble("mobs.strider.attributes.max_health", striderMaxHealth); -+ } -+ + } + + public boolean tadpoleRidable = false; +@@ -655,64 +1178,125 @@ public class PurpurWorldConfig { + public boolean traderLlamaRidable = false; + public boolean traderLlamaRidableInWater = false; + public boolean traderLlamaControllable = true; + public double traderLlamaMaxHealthMin = 15.0D; + public double traderLlamaMaxHealthMax = 30.0D; + public double traderLlamaJumpStrengthMin = 0.5D; + public double traderLlamaJumpStrengthMax = 0.5D; + public double traderLlamaMovementSpeedMin = 0.175D; + public double traderLlamaMovementSpeedMax = 0.175D; -+ private void traderLlamaSettings() { + private void traderLlamaSettings() { + traderLlamaRidable = getBoolean("mobs.trader_llama.ridable", traderLlamaRidable); + traderLlamaRidableInWater = getBoolean("mobs.trader_llama.ridable-in-water", traderLlamaRidableInWater); + traderLlamaControllable = getBoolean("mobs.trader_llama.controllable", traderLlamaControllable); + if (PurpurConfig.version < 10) { + double oldMin = getDouble("mobs.trader_llama.attributes.max-health.min", traderLlamaMaxHealthMin); + double oldMax = getDouble("mobs.trader_llama.attributes.max-health.max", traderLlamaMaxHealthMax); @@ -2234,82 +2578,132 @@ index 2b7f1dedb3289efc7e42a138f4483f4969902801..3a44c1fff53590ae5c65404564a3a2ee + traderLlamaJumpStrengthMax = getDouble("mobs.trader_llama.attributes.jump_strength.max", traderLlamaJumpStrengthMax); + traderLlamaMovementSpeedMin = getDouble("mobs.trader_llama.attributes.movement_speed.min", traderLlamaMovementSpeedMin); + traderLlamaMovementSpeedMax = getDouble("mobs.trader_llama.attributes.movement_speed.max", traderLlamaMovementSpeedMax); -+ } -+ + } + + public boolean tropicalFishRidable = false; + public boolean tropicalFishControllable = true; + public double tropicalFishMaxHealth = 3.0D; -+ private void tropicalFishSettings() { + private void tropicalFishSettings() { + tropicalFishRidable = getBoolean("mobs.tropical_fish.ridable", tropicalFishRidable); + tropicalFishControllable = getBoolean("mobs.tropical_fish.controllable", tropicalFishControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.tropical_fish.attributes.max-health", tropicalFishMaxHealth); + set("mobs.tropical_fish.attributes.max-health", null); + set("mobs.tropical_fish.attributes.max_health", oldValue); + } + tropicalFishMaxHealth = getDouble("mobs.tropical_fish.attributes.max_health", tropicalFishMaxHealth); -+ } -+ + } + + public boolean turtleRidable = false; + public boolean turtleRidableInWater = true; + public boolean turtleControllable = true; + public double turtleMaxHealth = 30.0D; -+ private void turtleSettings() { + private void turtleSettings() { + turtleRidable = getBoolean("mobs.turtle.ridable", turtleRidable); + turtleRidableInWater = getBoolean("mobs.turtle.ridable-in-water", turtleRidableInWater); + turtleControllable = getBoolean("mobs.turtle.controllable", turtleControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.turtle.attributes.max-health", turtleMaxHealth); + set("mobs.turtle.attributes.max-health", null); + set("mobs.turtle.attributes.max_health", oldValue); + } + turtleMaxHealth = getDouble("mobs.turtle.attributes.max_health", turtleMaxHealth); -+ } -+ -+ public double vexMaxY = 320D; + } + + public boolean vexRidable = false; + public boolean vexRidableInWater = true; + public boolean vexControllable = true; + public double vexMaxY = 320D; + public double vexMaxHealth = 14.0D; -+ private void vexSettings() { -+ vexMaxY = getDouble("mobs.vex.ridable-max-y", vexMaxY); + private void vexSettings() { + vexRidable = getBoolean("mobs.vex.ridable", vexRidable); + vexRidableInWater = getBoolean("mobs.vex.ridable-in-water", vexRidableInWater); + vexControllable = getBoolean("mobs.vex.controllable", vexControllable); + vexMaxY = getDouble("mobs.vex.ridable-max-y", vexMaxY); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.vex.attributes.max-health", vexMaxHealth); + set("mobs.vex.attributes.max-health", null); + set("mobs.vex.attributes.max_health", oldValue); + } + vexMaxHealth = getDouble("mobs.vex.attributes.max_health", vexMaxHealth); -+ } -+ + } + + public boolean villagerRidable = false; + public boolean villagerRidableInWater = true; + public boolean villagerControllable = true; + public double villagerMaxHealth = 20.0D; -+ private void villagerSettings() { + private void villagerSettings() { + villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); + villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); + villagerControllable = getBoolean("mobs.villager.controllable", villagerControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.villager.attributes.max-health", villagerMaxHealth); + set("mobs.villager.attributes.max-health", null); + set("mobs.villager.attributes.max_health", oldValue); + } + villagerMaxHealth = getDouble("mobs.villager.attributes.max_health", villagerMaxHealth); -+ } -+ + } + + public boolean vindicatorRidable = false; + public boolean vindicatorRidableInWater = true; + public boolean vindicatorControllable = true; + public double vindicatorMaxHealth = 24.0D; -+ private void vindicatorSettings() { + private void vindicatorSettings() { + vindicatorRidable = getBoolean("mobs.vindicator.ridable", vindicatorRidable); + vindicatorRidableInWater = getBoolean("mobs.vindicator.ridable-in-water", vindicatorRidableInWater); + vindicatorControllable = getBoolean("mobs.vindicator.controllable", vindicatorControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.vindicator.attributes.max-health", vindicatorMaxHealth); + set("mobs.vindicator.attributes.max-health", null); + set("mobs.vindicator.attributes.max_health", oldValue); + } + vindicatorMaxHealth = getDouble("mobs.vindicator.attributes.max_health", vindicatorMaxHealth); -+ } -+ + } + + public boolean wanderingTraderRidable = false; + public boolean wanderingTraderRidableInWater = true; + public boolean wanderingTraderControllable = true; + public double wanderingTraderMaxHealth = 20.0D; -+ private void wanderingTraderSettings() { + private void wanderingTraderSettings() { + wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); + wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); + wanderingTraderControllable = getBoolean("mobs.wandering_trader.controllable", wanderingTraderControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.wandering_trader.attributes.max-health", wanderingTraderMaxHealth); + set("mobs.wandering_trader.attributes.max-health", null); + set("mobs.wandering_trader.attributes.max_health", oldValue); + } + wanderingTraderMaxHealth = getDouble("mobs.wandering_trader.attributes.max_health", wanderingTraderMaxHealth); -+ } -+ + } + + public boolean wardenRidable = false; +@@ -727,64 +1311,134 @@ public class PurpurWorldConfig { + public boolean witchRidable = false; + public boolean witchRidableInWater = true; + public boolean witchControllable = true; + public double witchMaxHealth = 26.0D; -+ private void witchSettings() { + private void witchSettings() { + witchRidable = getBoolean("mobs.witch.ridable", witchRidable); + witchRidableInWater = getBoolean("mobs.witch.ridable-in-water", witchRidableInWater); + witchControllable = getBoolean("mobs.witch.controllable", witchControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.witch.attributes.max-health", witchMaxHealth); + set("mobs.witch.attributes.max-health", null); + set("mobs.witch.attributes.max_health", oldValue); + } + witchMaxHealth = getDouble("mobs.witch.attributes.max_health", witchMaxHealth); -+ } -+ + } + + public boolean witherRidable = false; + public boolean witherRidableInWater = true; + public boolean witherControllable = true; + public double witherMaxY = 320D; + public double witherMaxHealth = 300.0D; -+ private void witherSettings() { + private void witherSettings() { + witherRidable = getBoolean("mobs.wither.ridable", witherRidable); + witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); + witherControllable = getBoolean("mobs.wither.controllable", witherControllable); + witherMaxY = getDouble("mobs.wither.ridable-max-y", witherMaxY); + if (PurpurConfig.version < 8) { + double oldValue = getDouble("mobs.wither.max-health", witherMaxHealth); + set("mobs.wither.max_health", null); @@ -2320,41 +2714,65 @@ index 2b7f1dedb3289efc7e42a138f4483f4969902801..3a44c1fff53590ae5c65404564a3a2ee + set("mobs.wither.attributes.max_health", oldValue); + } + witherMaxHealth = getDouble("mobs.wither.attributes.max_health", witherMaxHealth); -+ } -+ + } + + public boolean witherSkeletonRidable = false; + public boolean witherSkeletonRidableInWater = true; + public boolean witherSkeletonControllable = true; + public double witherSkeletonMaxHealth = 20.0D; -+ private void witherSkeletonSettings() { + private void witherSkeletonSettings() { + witherSkeletonRidable = getBoolean("mobs.wither_skeleton.ridable", witherSkeletonRidable); + witherSkeletonRidableInWater = getBoolean("mobs.wither_skeleton.ridable-in-water", witherSkeletonRidableInWater); + witherSkeletonControllable = getBoolean("mobs.wither_skeleton.controllable", witherSkeletonControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.wither_skeleton.attributes.max-health", witherSkeletonMaxHealth); + set("mobs.wither_skeleton.attributes.max-health", null); + set("mobs.wither_skeleton.attributes.max_health", oldValue); + } + witherSkeletonMaxHealth = getDouble("mobs.wither_skeleton.attributes.max_health", witherSkeletonMaxHealth); -+ } -+ + } + + public boolean wolfRidable = false; + public boolean wolfRidableInWater = true; + public boolean wolfControllable = true; + public double wolfMaxHealth = 8.0D; -+ private void wolfSettings() { + private void wolfSettings() { + wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); + wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater); + wolfControllable = getBoolean("mobs.wolf.controllable", wolfControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.wolf.attributes.max-health", wolfMaxHealth); + set("mobs.wolf.attributes.max-health", null); + set("mobs.wolf.attributes.max_health", oldValue); + } + wolfMaxHealth = getDouble("mobs.wolf.attributes.max_health", wolfMaxHealth); -+ } -+ + } + + public boolean zoglinRidable = false; + public boolean zoglinRidableInWater = true; + public boolean zoglinControllable = true; + public double zoglinMaxHealth = 40.0D; -+ private void zoglinSettings() { + private void zoglinSettings() { + zoglinRidable = getBoolean("mobs.zoglin.ridable", zoglinRidable); + zoglinRidableInWater = getBoolean("mobs.zoglin.ridable-in-water", zoglinRidableInWater); + zoglinControllable = getBoolean("mobs.zoglin.controllable", zoglinControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.zoglin.attributes.max-health", zoglinMaxHealth); + set("mobs.zoglin.attributes.max-health", null); + set("mobs.zoglin.attributes.max_health", oldValue); + } + zoglinMaxHealth = getDouble("mobs.zoglin.attributes.max_health", zoglinMaxHealth); -+ } -+ + } + + public boolean zombieRidable = false; + public boolean zombieRidableInWater = true; + public boolean zombieControllable = true; + public double zombieMaxHealth = 20.0D; + public double zombieSpawnReinforcements = 0.1D; -+ private void zombieSettings() { + private void zombieSettings() { + zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); + zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); + zombieControllable = getBoolean("mobs.zombie.controllable", zombieControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.zombie.attributes.max-health", zombieMaxHealth); + set("mobs.zombie.attributes.max-health", null); @@ -2362,44 +2780,48 @@ index 2b7f1dedb3289efc7e42a138f4483f4969902801..3a44c1fff53590ae5c65404564a3a2ee + } + zombieMaxHealth = getDouble("mobs.zombie.attributes.max_health", zombieMaxHealth); + zombieSpawnReinforcements = getDouble("mobs.zombie.attributes.spawn_reinforcements", zombieSpawnReinforcements); -+ } -+ + } + + public boolean zombieHorseRidableInWater = false; + public boolean zombieHorseCanSwim = false; ++ public double zombieVillagerMaxHealth = 20.0D; ++ public double zombieVillagerSpawnReinforcements = 0.1D; + public double zombieHorseMaxHealthMin = 15.0D; + public double zombieHorseMaxHealthMax = 15.0D; + public double zombieHorseJumpStrengthMin = 0.4D; + public double zombieHorseJumpStrengthMax = 1.0D; + public double zombieHorseMovementSpeedMin = 0.2D; + public double zombieHorseMovementSpeedMax = 0.2D; -+ private void zombieHorseSettings() { + private void zombieHorseSettings() { + zombieHorseRidableInWater = getBoolean("mobs.zombie_horse.ridable-in-water", zombieHorseRidableInWater); + zombieHorseCanSwim = getBoolean("mobs.zombie_horse.can-swim", zombieHorseCanSwim); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.zombie_horse.attributes.max-health", zombieHorseMaxHealthMin); + set("mobs.zombie_horse.attributes.max-health", null); + set("mobs.zombie_horse.attributes.max_health.min", oldValue); + set("mobs.zombie_horse.attributes.max_health.max", oldValue); + } ++ zombieVillagerMaxHealth = getDouble("mobs.zombie_villager.attributes.max_health", zombieVillagerMaxHealth); ++ zombieVillagerSpawnReinforcements = getDouble("mobs.zombie_villager.attributes.spawn_reinforcements", zombieVillagerSpawnReinforcements); + zombieHorseMaxHealthMin = getDouble("mobs.zombie_horse.attributes.max_health.min", zombieHorseMaxHealthMin); + zombieHorseMaxHealthMax = getDouble("mobs.zombie_horse.attributes.max_health.max", zombieHorseMaxHealthMax); + zombieHorseJumpStrengthMin = getDouble("mobs.zombie_horse.attributes.jump_strength.min", zombieHorseJumpStrengthMin); + zombieHorseJumpStrengthMax = getDouble("mobs.zombie_horse.attributes.jump_strength.max", zombieHorseJumpStrengthMax); + zombieHorseMovementSpeedMin = getDouble("mobs.zombie_horse.attributes.movement_speed.min", zombieHorseMovementSpeedMin); + zombieHorseMovementSpeedMax = getDouble("mobs.zombie_horse.attributes.movement_speed.max", zombieHorseMovementSpeedMax); -+ } -+ -+ public double zombieVillagerMaxHealth = 20.0D; -+ public double zombieVillagerSpawnReinforcements = 0.1D; -+ private void zombieVillagerSettings() { -+ if (PurpurConfig.version < 10) { -+ double oldValue = getDouble("mobs.zombie_villager.attributes.max-health", zombieVillagerMaxHealth); -+ set("mobs.zombie_villager.attributes.max-health", null); -+ set("mobs.zombie_villager.attributes.max_health", oldValue); -+ } -+ zombieVillagerMaxHealth = getDouble("mobs.zombie_villager.attributes.max_health", zombieVillagerMaxHealth); -+ zombieVillagerSpawnReinforcements = getDouble("mobs.zombie_villager.attributes.spawn_reinforcements", zombieVillagerSpawnReinforcements); -+ } -+ + } + + public boolean zombieVillagerRidable = false; +@@ -799,9 +1453,18 @@ public class PurpurWorldConfig { + public boolean zombifiedPiglinRidable = false; + public boolean zombifiedPiglinRidableInWater = true; + public boolean zombifiedPiglinControllable = true; + public double zombifiedPiglinMaxHealth = 20.0D; + public double zombifiedPiglinSpawnReinforcements = 0.0D; -+ private void zombifiedPiglinSettings() { + private void zombifiedPiglinSettings() { + zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); + zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); + zombifiedPiglinControllable = getBoolean("mobs.zombified_piglin.controllable", zombifiedPiglinControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.zombified_piglin.attributes.max-health", zombifiedPiglinMaxHealth); + set("mobs.zombified_piglin.attributes.max-health", null); @@ -2407,5 +2829,5 @@ index 2b7f1dedb3289efc7e42a138f4483f4969902801..3a44c1fff53590ae5c65404564a3a2ee + } + zombifiedPiglinMaxHealth = getDouble("mobs.zombified_piglin.attributes.max_health", zombifiedPiglinMaxHealth); + zombifiedPiglinSpawnReinforcements = getDouble("mobs.zombified_piglin.attributes.spawn_reinforcements", zombifiedPiglinSpawnReinforcements); -+ } + } } diff --git a/patches/server/0007-Barrels-and-enderchests-6-rows.patch b/patches/server/0008-Barrels-and-enderchests-6-rows.patch similarity index 96% rename from patches/server/0007-Barrels-and-enderchests-6-rows.patch rename to patches/server/0008-Barrels-and-enderchests-6-rows.patch index 8c9fe1dfe..4631fd92a 100644 --- a/patches/server/0007-Barrels-and-enderchests-6-rows.patch +++ b/patches/server/0008-Barrels-and-enderchests-6-rows.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Barrels and enderchests 6 rows diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index b2f26b4b09d9bf2de273e1258f98c175c6d5900a..394427f591eb6e1f98bac92d6bfebea641da8154 100644 +index e5527b4e0cc70be4f65be952293e02ac73e113a5..e73f0615ab8320da2a993d7dae0601d8e1536c58 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -1161,6 +1161,27 @@ public abstract class PlayerList { @@ -37,7 +37,7 @@ index b2f26b4b09d9bf2de273e1258f98c175c6d5900a..394427f591eb6e1f98bac92d6bfebea6 public boolean isWhiteListed(GameProfile profile) { diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index 58152160d609d0e9d105153aeb166a56a7955603..6b068863368e3f0c1102f35b87ffce3f77370fcb 100644 +index cf008b8c7a2eb0c642fd9c2da376df86dcd588e2..96726f06b83193fd7c5156efe6411b10eb1db435 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java @@ -187,6 +187,7 @@ public abstract class Player extends LivingEntity { @@ -236,14 +236,13 @@ index 092f6843e3b43d4c615d2eee344f5966e96ae850..cb0c851ab5fcf676da2397040835a94d } diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index 9fe1cdafdafc3f718ef4eb4fd4150971e2832738..5b10feadf1ec5e7bbba4244b6347fdedd0f4b1d4 100644 +index 0cab29584c4d5205950571660b6c271d34e403eb..687710a138edd8492e58aa026872851d00466508 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -172,4 +172,39 @@ public class PurpurConfig { - } +@@ -173,6 +173,41 @@ public class PurpurConfig { return builder.build(); } -+ + + public static int barrelRows = 3; + public static boolean enderChestSixRows = false; + public static boolean enderChestPermissionRows = false; @@ -278,4 +277,7 @@ index 9fe1cdafdafc3f718ef4eb4fd4150971e2832738..5b10feadf1ec5e7bbba4244b6347fded + org.bukkit.event.inventory.InventoryType.ENDER_CHEST.setDefaultSize(enderChestSixRows ? 54 : 27); + enderChestPermissionRows = getBoolean("settings.blocks.ender_chest.use-permissions-for-rows", enderChestPermissionRows); + } - } ++ + public static String cannotRideMob = "You cannot mount that mob"; + private static void messages() { + cannotRideMob = getString("settings.messages.cannot-ride-mob", cannotRideMob); diff --git a/patches/server/0008-Llama-API.patch b/patches/server/0009-Llama-API.patch similarity index 92% rename from patches/server/0008-Llama-API.patch rename to patches/server/0009-Llama-API.patch index 02f6bedca..0e64ee615 100644 --- a/patches/server/0008-Llama-API.patch +++ b/patches/server/0009-Llama-API.patch @@ -25,7 +25,7 @@ index 21725aee29e9120d1c7e1e19f91c21a73a28844f..849f0c7c6d13df00d90211a48d8b56ab double d = this.llama.distanceToSqr(this.llama.getCaravanHead()); if (d > 676.0D) { diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index 08fbfa5df3196ad3d9fe086dcd8210ec8747f053..fbcd47e656a8d33da08d1d852a959bc7cf3a2394 100644 +index 9ba0218910d7e5db9e735c50f2e60b5a1073816b..071089e3ec438c323ea715e74911df4a465a7017 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java @@ -73,6 +73,7 @@ public class Llama extends AbstractChestedHorse implements VariantHolder type, Level world) { super(type, world); -@@ -125,7 +126,7 @@ public class Llama extends AbstractChestedHorse implements VariantHolder 0L && this.server.getPlayerIdleTimeout() > 0 && Util.getMillis() - this.player.getLastActionTime() > (long) this.server.getPlayerIdleTimeout() * 1000L * 60L && !this.player.wonGame) { // Paper - Prevent AFK kick while watching end credits. + // Purpur start + this.player.setAfk(true); -+ if (!this.player.level.purpurConfig.idleTimeoutKick || (!Boolean.parseBoolean(System.getenv("PURPUR_FORCE_IDLE_KICK")) && kickPermissionCache.getUnchecked(this.player.getBukkitEntity()))) { ++ if (!this.player.level().purpurConfig.idleTimeoutKick || (!Boolean.parseBoolean(System.getenv("PURPUR_FORCE_IDLE_KICK")) && kickPermissionCache.getUnchecked(this.player.getBukkitEntity()))) { + return; + } + // Purpur end @@ -144,7 +144,7 @@ index a419308c2d71bf0e228aa7c591deb76c77eda894..1645c63f36c6d4bcd6e6ac474af85048 if (from.getX() != Double.MAX_VALUE) { Location oldTo = to.clone(); diff --git a/src/main/java/net/minecraft/server/players/SleepStatus.java b/src/main/java/net/minecraft/server/players/SleepStatus.java -index 823efad652d8ff9e96b99375b102fef6f017716e..60f89d7c77a5e792e21e93e35ed1670bd565799a 100644 +index 823efad652d8ff9e96b99375b102fef6f017716e..caa8a69bde0c212c36dd990a67836ac2f95548c0 100644 --- a/src/main/java/net/minecraft/server/players/SleepStatus.java +++ b/src/main/java/net/minecraft/server/players/SleepStatus.java @@ -19,7 +19,7 @@ public class SleepStatus { @@ -152,7 +152,7 @@ index 823efad652d8ff9e96b99375b102fef6f017716e..60f89d7c77a5e792e21e93e35ed1670b public boolean areEnoughDeepSleeping(int percentage, List players) { // CraftBukkit start - int j = (int) players.stream().filter((eh) -> { return eh.isSleepingLongEnough() || eh.fauxSleeping; }).count(); -+ int j = (int) players.stream().filter((eh) -> { return eh.isSleepingLongEnough() || eh.fauxSleeping || (eh.level.purpurConfig.idleTimeoutCountAsSleeping && eh.isAfk()); }).count(); // Purpur ++ int j = (int) players.stream().filter((eh) -> { return eh.isSleepingLongEnough() || eh.fauxSleeping || (eh.level().purpurConfig.idleTimeoutCountAsSleeping && eh.isAfk()); }).count(); // Purpur boolean anyDeepSleep = players.stream().anyMatch(Player::isSleepingLongEnough); return anyDeepSleep && j >= this.sleepersNeeded(percentage); @@ -161,7 +161,7 @@ index 823efad652d8ff9e96b99375b102fef6f017716e..60f89d7c77a5e792e21e93e35ed1670b if (!entityplayer.isSpectator()) { ++this.activePlayers; - if (entityplayer.isSleeping() || entityplayer.fauxSleeping) { // CraftBukkit -+ if ((entityplayer.isSleeping() || entityplayer.fauxSleeping) || (entityplayer.level.purpurConfig.idleTimeoutCountAsSleeping && entityplayer.isAfk())) { // CraftBukkit // Purpur ++ if ((entityplayer.isSleeping() || entityplayer.fauxSleeping) || (entityplayer.level().purpurConfig.idleTimeoutCountAsSleeping && entityplayer.isAfk())) { // CraftBukkit // Purpur ++this.sleepingPlayers; } // CraftBukkit start @@ -178,7 +178,7 @@ index 3ff999734d14e2b6e7828e117f5ee32a60c26bc1..cfa9607241c3e69777ffc317206996c2 private EntitySelector() {} // Paper start diff --git a/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java b/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java -index 58422f00c7d64dbd1cf6d7211c9838875cbe7778..12efea4fd2a78f32a165941aff52edd024a5592b 100644 +index 58422f00c7d64dbd1cf6d7211c9838875cbe7778..db988d263b470e597d6df362da43d76005444572 100644 --- a/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java +++ b/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java @@ -64,6 +64,10 @@ public class TargetingConditions { @@ -186,7 +186,7 @@ index 58422f00c7d64dbd1cf6d7211c9838875cbe7778..12efea4fd2a78f32a165941aff52edd0 } else if (this.selector != null && !this.selector.test(targetEntity)) { return false; + // Purpur start -+ } else if (!targetEntity.level.purpurConfig.idleTimeoutTargetPlayer && targetEntity instanceof net.minecraft.server.level.ServerPlayer player && player.isAfk()) { ++ } else if (!targetEntity.level().purpurConfig.idleTimeoutTargetPlayer && targetEntity instanceof net.minecraft.server.level.ServerPlayer player && player.isAfk()) { + return false; + // Purpur end } else { @@ -290,7 +290,7 @@ index 687710a138edd8492e58aa026872851d00466508..d11442476371fefe6549654c97825a01 public static boolean enderChestSixRows = false; public static boolean enderChestPermissionRows = false; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f004e4290c0711d2e04c05677981f31b463af9fe..aa2371a611ca83247d422cc79ea37a8d798fdd0f 100644 +index b51c96e3f09d303f28675fc440ad402fca3db654..7052ca0128562fb59c3acc2ef354092e349cbffb 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -92,6 +92,24 @@ public class PurpurWorldConfig { @@ -315,18 +315,18 @@ index f004e4290c0711d2e04c05677981f31b463af9fe..aa2371a611ca83247d422cc79ea37a8d + idleTimeoutTargetPlayer = getBoolean("gameplay-mechanics.player.idle-timeout.mobs-target", idleTimeoutTargetPlayer); + } + - public double axolotlMaxHealth = 14.0D; - private void axolotlSettings() { - axolotlMaxHealth = getDouble("mobs.axolotl.attributes.max_health", axolotlMaxHealth); + public boolean babiesAreRidable = true; + public boolean untamedTamablesAreRidable = true; + public boolean useNightVisionWhenRiding = false; diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java -index d4da9ec6e00bb92b70598ee9a0d0ca5816562378..ea978171f89ac467b235f66fd539b957ba73e371 100644 +index d4da9ec6e00bb92b70598ee9a0d0ca5816562378..cd2ec0b11f74e2b17f74ebb83f4e8b183f5b890e 100644 --- a/src/main/java/org/spigotmc/ActivationRange.java +++ b/src/main/java/org/spigotmc/ActivationRange.java @@ -199,6 +199,7 @@ public class ActivationRange continue; } -+ if (!player.level.purpurConfig.idleTimeoutTickNearbyEntities && player.isAfk()) continue; // Purpur ++ if (!player.level().purpurConfig.idleTimeoutTickNearbyEntities && player.isAfk()) continue; // Purpur // Paper start int worldHeight = world.getHeight(); ActivationRange.maxBB = player.getBoundingBox().inflate( maxRange, worldHeight, maxRange ); diff --git a/patches/server/0013-LivingEntity-safeFallDistance.patch b/patches/server/0013-LivingEntity-safeFallDistance.patch index 69d596cea..59bdc53a0 100644 --- a/patches/server/0013-LivingEntity-safeFallDistance.patch +++ b/patches/server/0013-LivingEntity-safeFallDistance.patch @@ -57,7 +57,7 @@ index 05405f22fa9001560eb3a6701f3bb0179a584fae..8bf1105601f000142246554d177965d1 protected int getInventorySize() { diff --git a/src/main/java/net/minecraft/world/entity/monster/Giant.java b/src/main/java/net/minecraft/world/entity/monster/Giant.java -index e7e85c830d2a4804c625884010c5fec33008b014..8919464efeea5c1f6d10c88d77c4cf52af2b4a91 100644 +index 3f7d21a5be726d301e1bcaa11f1788b51c23a7cd..db95323da1aef267aa4fbe56aaff63cb8684e15b 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Giant.java +++ b/src/main/java/net/minecraft/world/entity/monster/Giant.java @@ -12,6 +12,7 @@ import net.minecraft.world.level.LevelReader; @@ -67,7 +67,7 @@ index e7e85c830d2a4804c625884010c5fec33008b014..8919464efeea5c1f6d10c88d77c4cf52 + this.safeFallDistance = 10.0F; // Purpur } - @Override + // Purpur start diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java index 050d297ef20d8b8f2601c70256aefadeb95b8a51..a939bcdbcdef50379b473822655e1f6a8db44892 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java diff --git a/patches/server/0016-Player-invulnerabilities.patch b/patches/server/0016-Player-invulnerabilities.patch index b40bce8af..aeebcaccf 100644 --- a/patches/server/0016-Player-invulnerabilities.patch +++ b/patches/server/0016-Player-invulnerabilities.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Player invulnerabilities diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 3b6af7b76db3d550eb7f199f9e8afd1c0af97e2e..206e8d9f7f04b4097402fa66390e7051af7df61e 100644 +index 68c163b6817ba4dd6ecd6b1fc82e37e5549d9569..dcc4a25a8c7a7809222cf585901f057c64946a68 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -278,6 +278,7 @@ public class ServerPlayer extends Player { @@ -82,7 +82,7 @@ index 3b6af7b76db3d550eb7f199f9e8afd1c0af97e2e..206e8d9f7f04b4097402fa66390e7051 public Scoreboard getScoreboard() { return this.getBukkitEntity().getScoreboard().getHandle(); diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 1645c63f36c6d4bcd6e6ac474af8504848b1c077..585a712467ee29c32ef8e59cc800f2a5bfae1db6 100644 +index 06046289cdad2413b065ea2515c852adeeeb2edb..863ac0559e8ec3ebad355a4863277ff6ee2228f0 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -2088,12 +2088,21 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -90,7 +90,7 @@ index 1645c63f36c6d4bcd6e6ac474af8504848b1c077..585a712467ee29c32ef8e59cc800f2a5 public void handleResourcePackResponse(ServerboundResourcePackPacket packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); + // Purpur start -+ if (player.level.purpurConfig.playerInvulnerableWhileAcceptingResourcePack && !this.player.acceptingResourcePack) { ++ if (player.level().purpurConfig.playerInvulnerableWhileAcceptingResourcePack && !this.player.acceptingResourcePack) { + ServerGamePacketListenerImpl.LOGGER.info("Disconnecting {} due to resource pack packet exploitation attempt", this.player.getName()); + this.disconnect(Component.translatable("multiplayer.texturePrompt.failure.line1"), org.bukkit.event.player.PlayerKickEvent.Cause.RESOURCE_PACK_REJECTION); // "Server resource pack couldn't be applied" + return; @@ -102,20 +102,20 @@ index 1645c63f36c6d4bcd6e6ac474af8504848b1c077..585a712467ee29c32ef8e59cc800f2a5 } // Paper start PlayerResourcePackStatusEvent.Status packStatus = PlayerResourcePackStatusEvent.Status.values()[packet.action.ordinal()]; -+ if (player.level.purpurConfig.playerInvulnerableWhileAcceptingResourcePack) player.setFrozen(packStatus == PlayerResourcePackStatusEvent.Status.ACCEPTED); // Purpur ++ if (player.level().purpurConfig.playerInvulnerableWhileAcceptingResourcePack) player.setFrozen(packStatus == PlayerResourcePackStatusEvent.Status.ACCEPTED); // Purpur + this.player.acceptingResourcePack = packStatus == PlayerResourcePackStatusEvent.Status.ACCEPTED; // Purpur player.getBukkitEntity().setResourcePackStatus(packStatus); this.cserver.getPluginManager().callEvent(new PlayerResourcePackStatusEvent(this.getCraftPlayer(), packStatus)); // CraftBukkit // Paper end diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index e73f0615ab8320da2a993d7dae0601d8e1536c58..b17b953d089e84026707f4ddc28b9b9718099d2a 100644 +index e73f0615ab8320da2a993d7dae0601d8e1536c58..4729f40c5420f80d4c6ba25a7745c4c51a327fbd 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -976,6 +976,8 @@ public abstract class PlayerList { } // Paper end -+ entityplayer1.spawnInvulnerableTime = entityplayer1.level.purpurConfig.playerSpawnInvulnerableTicks; // Purpur ++ entityplayer1.spawnInvulnerableTime = entityplayer1.level().purpurConfig.playerSpawnInvulnerableTicks; // Purpur + // CraftBukkit end return entityplayer1; @@ -146,7 +146,7 @@ index fea8f974c5e35b0f5c515a4c7f033482e54979c6..cf82afb7949a0031c1b656149e583c40 // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index aa2371a611ca83247d422cc79ea37a8d798fdd0f..b2b286de570ba7c80c40ff5d9ac4b2602054b523 100644 +index 7052ca0128562fb59c3acc2ef354092e349cbffb..724ceea7198e540c391e0c5ad02817033bec694c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -97,6 +97,8 @@ public class PurpurWorldConfig { @@ -166,4 +166,4 @@ index aa2371a611ca83247d422cc79ea37a8d798fdd0f..b2b286de570ba7c80c40ff5d9ac4b260 + playerInvulnerableWhileAcceptingResourcePack = getBoolean("gameplay-mechanics.player.invulnerable-while-accepting-resource-pack", playerInvulnerableWhileAcceptingResourcePack); } - public double axolotlMaxHealth = 14.0D; + public boolean babiesAreRidable = true; diff --git a/patches/server/0019-Silk-touch-spawners.patch b/patches/server/0019-Silk-touch-spawners.patch index 0c8788444..de7c0f75b 100644 --- a/patches/server/0019-Silk-touch-spawners.patch +++ b/patches/server/0019-Silk-touch-spawners.patch @@ -18,7 +18,7 @@ index 5f20e075c532f0f1d413242949d1738c0c152bf7..e6f8cb165f7e3da5f0edfc952d140595 public static final Item CRAFTING_TABLE = registerBlock(Blocks.CRAFTING_TABLE); public static final Item FARMLAND = registerBlock(Blocks.FARMLAND); diff --git a/src/main/java/net/minecraft/world/level/block/SpawnerBlock.java b/src/main/java/net/minecraft/world/level/block/SpawnerBlock.java -index 936d844a5a246138c9f9ae4ae6e318242b8f1420..d58dc4aa02fe371deaf879df8692dbe93c648f9b 100644 +index 936d844a5a246138c9f9ae4ae6e318242b8f1420..3bacb283befd396b757aef54008d89ca029ae52c 100644 --- a/src/main/java/net/minecraft/world/level/block/SpawnerBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SpawnerBlock.java @@ -40,6 +40,58 @@ public class SpawnerBlock extends BaseEntityBlock { @@ -28,7 +28,7 @@ index 936d844a5a246138c9f9ae4ae6e318242b8f1420..d58dc4aa02fe371deaf879df8692dbe9 + // Purpur start + @Override + public void playerDestroy(Level level, net.minecraft.world.entity.player.Player player, BlockPos pos, BlockState state, BlockEntity blockEntity, ItemStack stack) { -+ if (level.purpurConfig.silkTouchEnabled && player.getBukkitEntity().hasPermission("purpur.drop.spawners") && isSilkTouch(level, stack)) { ++ if (level().purpurConfig.silkTouchEnabled && player.getBukkitEntity().hasPermission("purpur.drop.spawners") && isSilkTouch(level, stack)) { + Optional> type = net.minecraft.world.entity.EntityType.by(((SpawnerBlockEntity) blockEntity).getSpawner().nextSpawnData.getEntityToSpawn()); + + net.minecraft.world.entity.EntityType entityType = type.orElse(null); @@ -36,7 +36,7 @@ index 936d844a5a246138c9f9ae4ae6e318242b8f1420..d58dc4aa02fe371deaf879df8692dbe9 + CompoundTag display = new CompoundTag(); + CompoundTag tag = new CompoundTag(); + -+ String name = level.purpurConfig.silkTouchSpawnerName; ++ String name = level().purpurConfig.silkTouchSpawnerName; + if (name != null && !name.isEmpty() && !name.equals("Monster Spawner")) { + net.kyori.adventure.text.Component displayName = net.kyori.adventure.text.minimessage.MiniMessage.miniMessage().deserialize(name, net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.component("mob", mobName)); + if (name.startsWith("")) { @@ -46,7 +46,7 @@ index 936d844a5a246138c9f9ae4ae6e318242b8f1420..d58dc4aa02fe371deaf879df8692dbe9 + tag.put("display", display); + } + -+ List lore = level.purpurConfig.silkTouchSpawnerLore; ++ List lore = level().purpurConfig.silkTouchSpawnerLore; + if (lore != null && !lore.isEmpty()) { + net.minecraft.nbt.ListTag list = new net.minecraft.nbt.ListTag(); + for (String line : lore) { @@ -73,7 +73,7 @@ index 936d844a5a246138c9f9ae4ae6e318242b8f1420..d58dc4aa02fe371deaf879df8692dbe9 + } + + private boolean isSilkTouch(Level level, ItemStack stack) { -+ return stack != null && level.purpurConfig.silkTouchTools.contains(stack.getItem()) && net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.SILK_TOUCH, stack) >= level.purpurConfig.minimumSilkTouchSpawnerRequire; ++ return stack != null && level().purpurConfig.silkTouchTools.contains(stack.getItem()) && net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.SILK_TOUCH, stack) >= level().purpurConfig.minimumSilkTouchSpawnerRequire; + } + // Purpur end + @@ -89,7 +89,7 @@ index 936d844a5a246138c9f9ae4ae6e318242b8f1420..d58dc4aa02fe371deaf879df8692dbe9 int i = 15 + worldserver.random.nextInt(15) + worldserver.random.nextInt(15); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b2b286de570ba7c80c40ff5d9ac4b2602054b523..10dd93d628605dc876f61fd798fb2ddaef94ba33 100644 +index 724ceea7198e540c391e0c5ad02817033bec694c..67468fde7d4a670bb5b85ef07648cb7ffec6fc74 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -114,6 +114,38 @@ public class PurpurWorldConfig { @@ -128,12 +128,12 @@ index b2b286de570ba7c80c40ff5d9ac4b2602054b523..10dd93d628605dc876f61fd798fb2dda + }); + } + - public double axolotlMaxHealth = 14.0D; - private void axolotlSettings() { - axolotlMaxHealth = getDouble("mobs.axolotl.attributes.max_health", axolotlMaxHealth); + public boolean babiesAreRidable = true; + public boolean untamedTamablesAreRidable = true; + public boolean useNightVisionWhenRiding = false; diff --git a/src/main/java/org/purpurmc/purpur/item/SpawnerItem.java b/src/main/java/org/purpurmc/purpur/item/SpawnerItem.java new file mode 100644 -index 0000000000000000000000000000000000000000..c038fb2bbb0f0e78380bc24bbd6348b869669a90 +index 0000000000000000000000000000000000000000..bc59969740ea3518874e1be9f566804c1b518dcd --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/item/SpawnerItem.java @@ -0,0 +1,36 @@ @@ -160,7 +160,7 @@ index 0000000000000000000000000000000000000000..c038fb2bbb0f0e78380bc24bbd6348b8 + @Override + protected boolean updateCustomBlockEntityTag(BlockPos pos, Level level, Player player, ItemStack stack, BlockState state) { + boolean handled = super.updateCustomBlockEntityTag(pos, level, player, stack, state); -+ if (level.purpurConfig.silkTouchEnabled && player.getBukkitEntity().hasPermission("purpur.place.spawners")) { ++ if (level().purpurConfig.silkTouchEnabled && player.getBukkitEntity().hasPermission("purpur.place.spawners")) { + BlockEntity spawner = level.getBlockEntity(pos); + if (spawner instanceof SpawnerBlockEntity && stack.hasTag()) { + CompoundTag tag = stack.getTag(); diff --git a/patches/server/0020-Add-turtle-egg-block-options.patch b/patches/server/0020-Add-turtle-egg-block-options.patch index 7c66fa484..09c23814a 100644 --- a/patches/server/0020-Add-turtle-egg-block-options.patch +++ b/patches/server/0020-Add-turtle-egg-block-options.patch @@ -36,7 +36,7 @@ index 6c1a0e6f961e46a1a89850746a71e97b32514adf..1942649e868fc985a488034c411a6721 } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 10dd93d628605dc876f61fd798fb2ddaef94ba33..40354fc7dd9d0dc35c7e45b95b114713862e41fe 100644 +index 67468fde7d4a670bb5b85ef07648cb7ffec6fc74..cd259a48b86fa257fc0ec748e667ba17e26e98a5 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -146,6 +146,15 @@ public class PurpurWorldConfig { @@ -52,6 +52,6 @@ index 10dd93d628605dc876f61fd798fb2ddaef94ba33..40354fc7dd9d0dc35c7e45b95b114713 + turtleEggsBreakFromMinecarts = getBoolean("blocks.turtle_egg.break-from-minecarts", turtleEggsBreakFromMinecarts); + } + - public double axolotlMaxHealth = 14.0D; - private void axolotlSettings() { - axolotlMaxHealth = getDouble("mobs.axolotl.attributes.max_health", axolotlMaxHealth); + public boolean babiesAreRidable = true; + public boolean untamedTamablesAreRidable = true; + public boolean useNightVisionWhenRiding = false; diff --git a/patches/server/0023-Giants-AI-settings.patch b/patches/server/0023-Giants-AI-settings.patch index 715f8f6a3..ccaeb8e43 100644 --- a/patches/server/0023-Giants-AI-settings.patch +++ b/patches/server/0023-Giants-AI-settings.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Giants AI settings diff --git a/src/main/java/net/minecraft/world/entity/monster/Giant.java b/src/main/java/net/minecraft/world/entity/monster/Giant.java -index 8919464efeea5c1f6d10c88d77c4cf52af2b4a91..a73514ab24686f991c1a5bded0684393fffb2efd 100644 +index db95323da1aef267aa4fbe56aaff63cb8684e15b..29491be5f607477acd336fcff8cc472ad740ed50 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Giant.java +++ b/src/main/java/net/minecraft/world/entity/monster/Giant.java @@ -1,13 +1,36 @@ @@ -46,8 +46,8 @@ index 8919464efeea5c1f6d10c88d77c4cf52af2b4a91..a73514ab24686f991c1a5bded0684393 public class Giant extends Monster { public Giant(EntityType type, Level world) { @@ -45,6 +68,53 @@ public class Giant extends Monster { + this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(this.level().purpurConfig.giantAttackDamage); } - // Purpur end + @Override + protected void registerGoals() { @@ -108,10 +108,10 @@ index 8919464efeea5c1f6d10c88d77c4cf52af2b4a91..a73514ab24686f991c1a5bded0684393 } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 40354fc7dd9d0dc35c7e45b95b114713862e41fe..4e3fc06a58722800b6257df15f2a577227660d66 100644 +index cd259a48b86fa257fc0ec748e667ba17e26e98a5..940ff156a42369656b919bef3dbadfc98d7dce01 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -400,6 +400,10 @@ public class PurpurWorldConfig { +@@ -558,6 +558,10 @@ public class PurpurWorldConfig { public double giantMovementSpeed = 0.5D; public double giantAttackDamage = 50.0D; public double giantMaxHealth = 100.0D; @@ -120,9 +120,9 @@ index 40354fc7dd9d0dc35c7e45b95b114713862e41fe..4e3fc06a58722800b6257df15f2a5772 + public boolean giantHaveAI = false; + public boolean giantHaveHostileAI = false; private void giantSettings() { - giantMovementSpeed = getDouble("mobs.giant.movement-speed", giantMovementSpeed); - giantAttackDamage = getDouble("mobs.giant.attack-damage", giantAttackDamage); -@@ -413,6 +417,10 @@ public class PurpurWorldConfig { + giantRidable = getBoolean("mobs.giant.ridable", giantRidable); + giantRidableInWater = getBoolean("mobs.giant.ridable-in-water", giantRidableInWater); +@@ -574,6 +578,10 @@ public class PurpurWorldConfig { set("mobs.giant.attributes.max_health", oldValue); } giantMaxHealth = getDouble("mobs.giant.attributes.max_health", giantMaxHealth); @@ -132,4 +132,4 @@ index 40354fc7dd9d0dc35c7e45b95b114713862e41fe..4e3fc06a58722800b6257df15f2a5772 + giantHaveHostileAI = getBoolean("mobs.giant.have-hostile-ai", giantHaveHostileAI); } - public double glowSquidMaxHealth = 10.0D; + public boolean glowSquidRidable = false; diff --git a/patches/server/0024-Zombie-horse-naturally-spawn.patch b/patches/server/0024-Zombie-horse-naturally-spawn.patch index 00db8c4c1..806bdec60 100644 --- a/patches/server/0024-Zombie-horse-naturally-spawn.patch +++ b/patches/server/0024-Zombie-horse-naturally-spawn.patch @@ -30,22 +30,22 @@ index 9168a02ede5b2fc924dbcf0063109f8e72d94d61..e2b1433034b1ab9bad821983515a37fd entityhorseskeleton.setPos((double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ()); this.addFreshEntity(entityhorseskeleton, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.LIGHTNING); // CraftBukkit diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 4e3fc06a58722800b6257df15f2a577227660d66..d902600e12ecd976ffd5eb4ec572dcf54fd50b54 100644 +index 940ff156a42369656b919bef3dbadfc98d7dce01..524a6e6f90a3beea113d8cf6ff567793be9d15aa 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1021,6 +1021,7 @@ public class PurpurWorldConfig { +@@ -1493,6 +1493,7 @@ public class PurpurWorldConfig { public double zombieHorseJumpStrengthMax = 1.0D; public double zombieHorseMovementSpeedMin = 0.2D; public double zombieHorseMovementSpeedMax = 0.2D; + public double zombieHorseSpawnChance = 0.0D; private void zombieHorseSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.zombie_horse.attributes.max-health", zombieHorseMaxHealthMin); -@@ -1034,6 +1035,7 @@ public class PurpurWorldConfig { + zombieHorseRidableInWater = getBoolean("mobs.zombie_horse.ridable-in-water", zombieHorseRidableInWater); + zombieHorseCanSwim = getBoolean("mobs.zombie_horse.can-swim", zombieHorseCanSwim); +@@ -1510,6 +1511,7 @@ public class PurpurWorldConfig { zombieHorseJumpStrengthMax = getDouble("mobs.zombie_horse.attributes.jump_strength.max", zombieHorseJumpStrengthMax); zombieHorseMovementSpeedMin = getDouble("mobs.zombie_horse.attributes.movement_speed.min", zombieHorseMovementSpeedMin); zombieHorseMovementSpeedMax = getDouble("mobs.zombie_horse.attributes.movement_speed.max", zombieHorseMovementSpeedMax); + zombieHorseSpawnChance = getDouble("mobs.zombie_horse.spawn-chance", zombieHorseSpawnChance); } - public double zombieVillagerMaxHealth = 20.0D; + public boolean zombieVillagerRidable = false; diff --git a/patches/server/0025-Charged-creeper-naturally-spawn.patch b/patches/server/0025-Charged-creeper-naturally-spawn.patch index 444b8d867..76fc53eb6 100644 --- a/patches/server/0025-Charged-creeper-naturally-spawn.patch +++ b/patches/server/0025-Charged-creeper-naturally-spawn.patch @@ -5,11 +5,11 @@ Subject: [PATCH] Charged creeper naturally spawn diff --git a/src/main/java/net/minecraft/world/entity/monster/Creeper.java b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -index e208a743d161f53944cb5756041522658c3c9ce6..19c8fb5ab8c7818679919de07664df7dc8d54e91 100644 +index 539f44793f11db1971e72e2bbeae8d2d9d9b6798..4f374a2b1aab20fe2523df716a9d622c28749b7a 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java @@ -255,6 +255,14 @@ public class Creeper extends Monster implements PowerableMob { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.creeperMaxHealth); + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.creeperMaxHealth); } + public net.minecraft.world.entity.SpawnGroupData finalizeSpawn(net.minecraft.world.level.ServerLevelAccessor world, net.minecraft.world.DifficultyInstance difficulty, net.minecraft.world.entity.MobSpawnType spawnReason, @Nullable net.minecraft.world.entity.SpawnGroupData entityData, @Nullable CompoundTag entityNbt) { @@ -24,22 +24,22 @@ index e208a743d161f53944cb5756041522658c3c9ce6..19c8fb5ab8c7818679919de07664df7d protected SoundEvent getHurtSound(DamageSource source) { return SoundEvents.CREEPER_HURT; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d902600e12ecd976ffd5eb4ec572dcf54fd50b54..c06893ab41e84e898528b4d3efe043ccb42cf6c3 100644 +index 524a6e6f90a3beea113d8cf6ff567793be9d15aa..c42ae175742c4072d43dd04bd25a1338004e198a 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -270,6 +270,7 @@ public class PurpurWorldConfig { - } - +@@ -334,6 +334,7 @@ public class PurpurWorldConfig { + public boolean creeperRidableInWater = true; + public boolean creeperControllable = true; public double creeperMaxHealth = 20.0D; + public double creeperChargedChance = 0.0D; private void creeperSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.creeper.attributes.max-health", creeperMaxHealth); -@@ -277,6 +278,7 @@ public class PurpurWorldConfig { + creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); + creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); +@@ -344,6 +345,7 @@ public class PurpurWorldConfig { set("mobs.creeper.attributes.max_health", oldValue); } creeperMaxHealth = getDouble("mobs.creeper.attributes.max_health", creeperMaxHealth); + creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); } - public double dolphinMaxHealth = 10.0D; + public boolean dolphinRidable = false; diff --git a/patches/server/0026-Rabbit-naturally-spawn-toast-and-killer.patch b/patches/server/0026-Rabbit-naturally-spawn-toast-and-killer.patch index 7b4d9b03f..9cbe2aef4 100644 --- a/patches/server/0026-Rabbit-naturally-spawn-toast-and-killer.patch +++ b/patches/server/0026-Rabbit-naturally-spawn-toast-and-killer.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Rabbit naturally spawn toast and killer diff --git a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -index c43bb09caa560e9ea4596b5bb167e1273e599ed7..f7a1b15bd29e9c0848141da469acbfb67e8d8e4d 100644 +index db37932e56d88717a61eb8608b44c6911513aa35..48864c6f720be9132840e05ff4e7eb394ce3ad1d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java @@ -472,10 +472,23 @@ public class Rabbit extends Animal implements VariantHolder { @@ -25,7 +25,7 @@ index c43bb09caa560e9ea4596b5bb167e1273e599ed7..f7a1b15bd29e9c0848141da469acbfb6 private static Rabbit.Variant getRandomRabbitVariant(LevelAccessor world, BlockPos pos) { + // Purpur start + Level level = world.getMinecraftWorld(); -+ if (level.purpurConfig.rabbitNaturalKiller > 0D && world.getRandom().nextDouble() <= level.purpurConfig.rabbitNaturalKiller) { ++ if (level().purpurConfig.rabbitNaturalKiller > 0D && world.getRandom().nextDouble() <= level().purpurConfig.rabbitNaturalKiller) { + return Rabbit.Variant.EVIL; + } + // Purpur end @@ -33,19 +33,19 @@ index c43bb09caa560e9ea4596b5bb167e1273e599ed7..f7a1b15bd29e9c0848141da469acbfb6 int i = world.getRandom().nextInt(100); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index c06893ab41e84e898528b4d3efe043ccb42cf6c3..9acbc0d0b54229d8d97ce3b0a4e8e93534f89b35 100644 +index c42ae175742c4072d43dd04bd25a1338004e198a..62937cdd2e6cc83a28bf96550b9ea4558f522c67 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -704,6 +704,8 @@ public class PurpurWorldConfig { - } - +@@ -995,6 +995,8 @@ public class PurpurWorldConfig { + public boolean rabbitRidableInWater = true; + public boolean rabbitControllable = true; public double rabbitMaxHealth = 3.0D; + public double rabbitNaturalToast = 0.0D; + public double rabbitNaturalKiller = 0.0D; private void rabbitSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.rabbit.attributes.max-health", rabbitMaxHealth); -@@ -711,6 +713,8 @@ public class PurpurWorldConfig { + rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); + rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); +@@ -1005,6 +1007,8 @@ public class PurpurWorldConfig { set("mobs.rabbit.attributes.max_health", oldValue); } rabbitMaxHealth = getDouble("mobs.rabbit.attributes.max_health", rabbitMaxHealth); @@ -53,4 +53,4 @@ index c06893ab41e84e898528b4d3efe043ccb42cf6c3..9acbc0d0b54229d8d97ce3b0a4e8e935 + rabbitNaturalKiller = getDouble("mobs.rabbit.spawn-killer-rabbit-chance", rabbitNaturalKiller); } - public double ravagerMaxHealth = 100.0D; + public boolean ravagerRidable = false; diff --git a/patches/server/0028-Tulips-change-fox-type.patch b/patches/server/0028-Tulips-change-fox-type.patch index 931bce18d..c85b0f50b 100644 --- a/patches/server/0028-Tulips-change-fox-type.patch +++ b/patches/server/0028-Tulips-change-fox-type.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Tulips change fox type diff --git a/src/main/java/net/minecraft/world/entity/animal/Fox.java b/src/main/java/net/minecraft/world/entity/animal/Fox.java -index b143032e87ecd74203e6486eea1248a3f6ce13f1..71fba6fd95f362916e93e89b626dad7c7a72da0b 100644 +index 451abd7a6d7fb0926dcebdc4504b1c9c298766e3..7e191d8bb56d0b6591b3a60dfe07004d025eedfa 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java @@ -35,6 +35,7 @@ import net.minecraft.util.RandomSource; @@ -51,7 +51,7 @@ index b143032e87ecd74203e6486eea1248a3f6ce13f1..71fba6fd95f362916e93e89b626dad7c + // Purpur start + @Override + public InteractionResult mobInteract(Player player, InteractionHand hand) { -+ if (level.purpurConfig.foxTypeChangesWithTulips) { ++ if (level().purpurConfig.foxTypeChangesWithTulips) { + ItemStack itemstack = player.getItemInHand(hand); + if (getVariant() == Type.RED && itemstack.getItem() == Items.WHITE_TULIP) { + setVariant(Type.SNOW); @@ -75,22 +75,22 @@ index b143032e87ecd74203e6486eea1248a3f6ce13f1..71fba6fd95f362916e93e89b626dad7c // Paper start - Cancellable death event protected org.bukkit.event.entity.EntityDeathEvent dropAllDeathLoot(DamageSource source) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 9acbc0d0b54229d8d97ce3b0a4e8e93534f89b35..b60c5e84d13d7cd51d1203a35a9382c1ff6dec55 100644 +index 62937cdd2e6cc83a28bf96550b9ea4558f522c67..15e98301b1b77c0e0df42aa923d3d55913bd4767 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -380,6 +380,7 @@ public class PurpurWorldConfig { - } - +@@ -513,6 +513,7 @@ public class PurpurWorldConfig { + public boolean foxRidableInWater = true; + public boolean foxControllable = true; public double foxMaxHealth = 10.0D; + public boolean foxTypeChangesWithTulips = false; private void foxSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.fox.attributes.max-health", foxMaxHealth); -@@ -387,6 +388,7 @@ public class PurpurWorldConfig { + foxRidable = getBoolean("mobs.fox.ridable", foxRidable); + foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); +@@ -523,6 +524,7 @@ public class PurpurWorldConfig { set("mobs.fox.attributes.max_health", oldValue); } foxMaxHealth = getDouble("mobs.fox.attributes.max_health", foxMaxHealth); + foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); } - public double ghastMaxHealth = 10.0D; + public boolean frogRidable = false; diff --git a/patches/server/0029-Breedable-Polar-Bears.patch b/patches/server/0029-Breedable-Polar-Bears.patch index f015e689c..2e8e20180 100644 --- a/patches/server/0029-Breedable-Polar-Bears.patch +++ b/patches/server/0029-Breedable-Polar-Bears.patch @@ -5,33 +5,12 @@ Subject: [PATCH] Breedable Polar Bears diff --git a/src/main/java/net/minecraft/world/entity/animal/PolarBear.java b/src/main/java/net/minecraft/world/entity/animal/PolarBear.java -index 3f185b02dc23942d2216cf9a8bdc493ffa2e75d9..05739e69f1a11138d7c13bb9d8ca7695753ae40c 100644 +index 48ec595e76c09cf719477a543364f1206664afa5..b2cf680e377f849a7cc17136ebca3cf33e34048c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/PolarBear.java +++ b/src/main/java/net/minecraft/world/entity/animal/PolarBear.java -@@ -74,17 +74,17 @@ public class PolarBear extends Animal implements NeutralMob { - // Purpur start - @Override - public boolean isRidable() { -- return level.purpurConfig.polarBearRidable; -+ return level().purpurConfig.polarBearRidable; - } - - @Override - public boolean dismountsUnderwater() { -- return level.purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level.purpurConfig.polarBearRidableInWater; -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.polarBearRidableInWater; - } - - @Override - public boolean isControllable() { -- return level.purpurConfig.polarBearControllable; -+ return level().purpurConfig.polarBearControllable; - } - - @Override @@ -99,6 +99,27 @@ public class PolarBear extends Animal implements NeutralMob { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.polarBearMaxHealth); } - // Purpur end + public boolean canMate(Animal other) { + if (other == this) { @@ -62,7 +41,7 @@ index 3f185b02dc23942d2216cf9a8bdc493ffa2e75d9..05739e69f1a11138d7c13bb9d8ca7695 @Override public boolean isFood(ItemStack stack) { - return false; -+ return level.purpurConfig.polarBearBreedableItem != null && stack.getItem() == level.purpurConfig.polarBearBreedableItem; // Purpur ++ return level().purpurConfig.polarBearBreedableItem != null && stack.getItem() == level().purpurConfig.polarBearBreedableItem; // Purpur } @Override @@ -73,26 +52,26 @@ index 3f185b02dc23942d2216cf9a8bdc493ffa2e75d9..05739e69f1a11138d7c13bb9d8ca7695 + // Purpur start + if (level().purpurConfig.polarBearBreedableItem != null) { + this.goalSelector.addGoal(2, new net.minecraft.world.entity.ai.goal.BreedGoal(this, 1.0D)); -+ this.goalSelector.addGoal(3, new net.minecraft.world.entity.ai.goal.TemptGoal(this, 1.0D, net.minecraft.world.item.crafting.Ingredient.of(level.purpurConfig.polarBearBreedableItem), false)); ++ this.goalSelector.addGoal(3, new net.minecraft.world.entity.ai.goal.TemptGoal(this, 1.0D, net.minecraft.world.item.crafting.Ingredient.of(level().purpurConfig.polarBearBreedableItem), false)); + } + // Purpur end this.goalSelector.addGoal(4, new FollowParentGoal(this, 1.25D)); this.goalSelector.addGoal(5, new RandomStrollGoal(this, 1.0D)); this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b60c5e84d13d7cd51d1203a35a9382c1ff6dec55..c9327c407d1fce1a80307eb3ad2c4c5c123fba8e 100644 +index 15e98301b1b77c0e0df42aa923d3d55913bd4767..a7873252ba4ff059beeaa69017e51772468b58a2 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -686,6 +686,8 @@ public class PurpurWorldConfig { - } - +@@ -967,6 +967,8 @@ public class PurpurWorldConfig { + public boolean polarBearRidableInWater = true; + public boolean polarBearControllable = true; public double polarBearMaxHealth = 30.0D; + public String polarBearBreedableItemString = ""; + public Item polarBearBreedableItem = null; private void polarBearSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.polar_bear.attributes.max-health", polarBearMaxHealth); -@@ -693,6 +695,9 @@ public class PurpurWorldConfig { + polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); + polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); +@@ -977,6 +979,9 @@ public class PurpurWorldConfig { set("mobs.polar_bear.attributes.max_health", oldValue); } polarBearMaxHealth = getDouble("mobs.polar_bear.attributes.max_health", polarBearMaxHealth); @@ -101,4 +80,4 @@ index b60c5e84d13d7cd51d1203a35a9382c1ff6dec55..c9327c407d1fce1a80307eb3ad2c4c5c + if (item != Items.AIR) polarBearBreedableItem = item; } - public double pufferfishMaxHealth = 3.0D; + public boolean pufferfishRidable = false; diff --git a/patches/server/0030-Chickens-can-retaliate.patch b/patches/server/0030-Chickens-can-retaliate.patch index 747051fa8..0db53ab96 100644 --- a/patches/server/0030-Chickens-can-retaliate.patch +++ b/patches/server/0030-Chickens-can-retaliate.patch @@ -5,20 +5,19 @@ Subject: [PATCH] Chickens can retaliate diff --git a/src/main/java/net/minecraft/world/entity/animal/Chicken.java b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -index cbaf7993adb03cdb61c8e0cb29a7362b63ae3914..bf281b45979e16551fe4777ff69fb9ef67d1f839 100644 +index ea404a84a43a02a5614d5142bb78a586edfc69f6..0f49705e3c7adf033cee9d0746319885c830224f 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Chicken.java +++ b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -@@ -57,6 +57,9 @@ public class Chicken extends Animal { +@@ -74,19 +74,30 @@ public class Chicken extends Animal { @Override public void initAttributes() { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.chickenMaxHealth); -+ if (level.purpurConfig.chickenRetaliate) { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.chickenMaxHealth); ++ if (level().purpurConfig.chickenRetaliate) { + this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(2.0D); + } } - // Purpur start -@@ -80,13 +83,21 @@ public class Chicken extends Animal { + @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur @@ -31,7 +30,7 @@ index cbaf7993adb03cdb61c8e0cb29a7362b63ae3914..bf281b45979e16551fe4777ff69fb9ef this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F)); this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); + // Purpur start -+ if (level.purpurConfig.chickenRetaliate) { ++ if (level().purpurConfig.chickenRetaliate) { + this.goalSelector.addGoal(1, new net.minecraft.world.entity.ai.goal.MeleeAttackGoal(this, 1.0D, false)); + this.targetSelector.addGoal(1, new net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal(this)); + } else { @@ -51,22 +50,22 @@ index cbaf7993adb03cdb61c8e0cb29a7362b63ae3914..bf281b45979e16551fe4777ff69fb9ef @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index c9327c407d1fce1a80307eb3ad2c4c5c123fba8e..b8e799b15ab1e4559f3e1aece3d4efa5f1d717a1 100644 +index a7873252ba4ff059beeaa69017e51772468b58a2..7dd253bdce33673b4f748c47c137f14af5054cca 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -240,6 +240,7 @@ public class PurpurWorldConfig { - } - +@@ -288,6 +288,7 @@ public class PurpurWorldConfig { + public boolean chickenRidableInWater = false; + public boolean chickenControllable = true; public double chickenMaxHealth = 4.0D; + public boolean chickenRetaliate = false; private void chickenSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.chicken.attributes.max-health", chickenMaxHealth); -@@ -247,6 +248,7 @@ public class PurpurWorldConfig { + chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); + chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); +@@ -298,6 +299,7 @@ public class PurpurWorldConfig { set("mobs.chicken.attributes.max_health", oldValue); } chickenMaxHealth = getDouble("mobs.chicken.attributes.max_health", chickenMaxHealth); + chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate); } - public double codMaxHealth = 3.0D; + public boolean codRidable = false; diff --git a/patches/server/0031-Add-option-to-set-armorstand-step-height.patch b/patches/server/0031-Add-option-to-set-armorstand-step-height.patch index 2f89e3926..2e752c709 100644 --- a/patches/server/0031-Add-option-to-set-armorstand-step-height.patch +++ b/patches/server/0031-Add-option-to-set-armorstand-step-height.patch @@ -18,19 +18,19 @@ index 9b692140796eb5296a0478fd18d9b33278be6f5d..43d5b06a87909b544d151b238f7479c9 protected final RandomSource random; public int tickCount; diff --git a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java -index 8a8b9e8983be1acad66ad875c901be5bbdeabb1f..316716b8827b974fa62f7f27d57c3b776b42fbd8 100644 +index 8a8b9e8983be1acad66ad875c901be5bbdeabb1f..09912c11bad7dc639b8afe8b0041a5fbc3189d7f 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java +++ b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java @@ -679,6 +679,7 @@ public class ArmorStand extends LivingEntity { @Override public void tick() { -+ maxUpStep = level.purpurConfig.armorstandStepHeight; ++ maxUpStep = level().purpurConfig.armorstandStepHeight; // Paper start if (!this.canTick) { if (this.noTickPoseDirty) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b8e799b15ab1e4559f3e1aece3d4efa5f1d717a1..213b1be1cb2f22236bdb01575e2ee41eed562012 100644 +index 7dd253bdce33673b4f748c47c137f14af5054cca..b957311ec505d5472492ecf49d33e86a2d62bcad 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -92,6 +92,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0032-Cat-spawning-options.patch b/patches/server/0032-Cat-spawning-options.patch index 95caace7d..819938094 100644 --- a/patches/server/0032-Cat-spawning-options.patch +++ b/patches/server/0032-Cat-spawning-options.patch @@ -51,20 +51,20 @@ index 5f407535298a31a34cfe114dd863fd6a9b977707..29c7e33fe961020e5a0007287fe9b663 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 213b1be1cb2f22236bdb01575e2ee41eed562012..aad4d95b24473a3bdcaa8120c39985b62adb7aa4 100644 +index b957311ec505d5472492ecf49d33e86a2d62bcad..df28065f664791a4cf5bbae5cd3cabe691d07a39 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -225,6 +225,9 @@ public class PurpurWorldConfig { - } - +@@ -261,6 +261,9 @@ public class PurpurWorldConfig { + public boolean catRidableInWater = true; + public boolean catControllable = true; public double catMaxHealth = 10.0D; + public int catSpawnDelay = 1200; + public int catSpawnSwampHutScanRange = 16; + public int catSpawnVillageScanRange = 48; private void catSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.cat.attributes.max-health", catMaxHealth); -@@ -232,6 +235,9 @@ public class PurpurWorldConfig { + catRidable = getBoolean("mobs.cat.ridable", catRidable); + catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); +@@ -271,6 +274,9 @@ public class PurpurWorldConfig { set("mobs.cat.attributes.max_health", oldValue); } catMaxHealth = getDouble("mobs.cat.attributes.max_health", catMaxHealth); @@ -73,4 +73,4 @@ index 213b1be1cb2f22236bdb01575e2ee41eed562012..aad4d95b24473a3bdcaa8120c39985b6 + catSpawnVillageScanRange = getInt("mobs.cat.scan-range-for-other-cats.village", catSpawnVillageScanRange); } - public double caveSpiderMaxHealth = 12.0D; + public boolean caveSpiderRidable = false; diff --git a/patches/server/0033-Cows-eat-mushrooms.patch b/patches/server/0033-Cows-eat-mushrooms.patch index b708f0908..b8fadbaef 100644 --- a/patches/server/0033-Cows-eat-mushrooms.patch +++ b/patches/server/0033-Cows-eat-mushrooms.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Cows eat mushrooms diff --git a/src/main/java/net/minecraft/world/entity/animal/Cow.java b/src/main/java/net/minecraft/world/entity/animal/Cow.java -index 9a973e2dc94aa1c8928eea87a6a12789381d15d8..07d60d3f49a4ed67cc4739baddbb41818b557eb1 100644 +index d26a44d634fe02e595654e573d02243b5eb66086..e5e84c85d2b1c84c7612392bb060f713bd03ddcf 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java @@ -2,6 +2,7 @@ package net.minecraft.world.entity.animal; @@ -28,7 +28,7 @@ index 9a973e2dc94aa1c8928eea87a6a12789381d15d8..07d60d3f49a4ed67cc4739baddbb4181 this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur this.goalSelector.addGoal(1, new PanicGoal(this, 2.0D)); this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); -+ if (level.purpurConfig.cowFeedMushrooms > 0) this.goalSelector.addGoal(3, new TemptGoal(this, 1.25D, Ingredient.of(Items.WHEAT, Blocks.RED_MUSHROOM.asItem(), Blocks.BROWN_MUSHROOM.asItem()), false)); else // Purpur ++ if (level().purpurConfig.cowFeedMushrooms > 0) this.goalSelector.addGoal(3, new TemptGoal(this, 1.25D, Ingredient.of(Items.WHEAT, Blocks.RED_MUSHROOM.asItem(), Blocks.BROWN_MUSHROOM.asItem()), false)); else // Purpur this.goalSelector.addGoal(3, new TemptGoal(this, 1.25D, Ingredient.of(Items.WHEAT), false)); this.goalSelector.addGoal(4, new FollowParentGoal(this, 1.25D)); this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0D)); @@ -37,7 +37,7 @@ index 9a973e2dc94aa1c8928eea87a6a12789381d15d8..07d60d3f49a4ed67cc4739baddbb4181 player.setItemInHand(hand, itemstack1); return InteractionResult.sidedSuccess(this.level().isClientSide); + // Purpur start - feed mushroom to change to mooshroom -+ } else if (level.purpurConfig.cowFeedMushrooms > 0 && this.getType() != EntityType.MOOSHROOM && isMushroom(itemstack)) { ++ } else if (level().purpurConfig.cowFeedMushrooms > 0 && this.getType() != EntityType.MOOSHROOM && isMushroom(itemstack)) { + return this.feedMushroom(player, itemstack); + // Purpur end } else { @@ -67,7 +67,7 @@ index 9a973e2dc94aa1c8928eea87a6a12789381d15d8..07d60d3f49a4ed67cc4739baddbb4181 + private InteractionResult feedMushroom(Player player, ItemStack stack) { + level.broadcastEntityEvent(this, (byte) 18); // hearts + playSound(SoundEvents.COW_MILK, 1.0F, 1.0F); -+ if (incrementFeedCount(stack) < level.purpurConfig.cowFeedMushrooms) { ++ if (incrementFeedCount(stack) < level().purpurConfig.cowFeedMushrooms) { + if (!player.getAbilities().instabuild) { + stack.shrink(1); + } @@ -114,22 +114,22 @@ index 9a973e2dc94aa1c8928eea87a6a12789381d15d8..07d60d3f49a4ed67cc4739baddbb4181 + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index aad4d95b24473a3bdcaa8120c39985b62adb7aa4..b3f8077b7a27a0298d88a651cb93b4028f2621ee 100644 +index df28065f664791a4cf5bbae5cd3cabe691d07a39..ed32ff8a2ab16226a8679daff5835cc819b3b709 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -273,6 +273,7 @@ public class PurpurWorldConfig { - } - +@@ -331,6 +331,7 @@ public class PurpurWorldConfig { + public boolean cowRidableInWater = true; + public boolean cowControllable = true; public double cowMaxHealth = 10.0D; + public int cowFeedMushrooms = 0; private void cowSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.cow.attributes.max-health", cowMaxHealth); -@@ -280,6 +281,7 @@ public class PurpurWorldConfig { + cowRidable = getBoolean("mobs.cow.ridable", cowRidable); + cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); +@@ -341,6 +342,7 @@ public class PurpurWorldConfig { set("mobs.cow.attributes.max_health", oldValue); } cowMaxHealth = getDouble("mobs.cow.attributes.max_health", cowMaxHealth); + cowFeedMushrooms = getInt("mobs.cow.feed-mushrooms-for-mooshroom", cowFeedMushrooms); } - public double creeperMaxHealth = 20.0D; + public boolean creeperRidable = false; diff --git a/patches/server/0035-Pigs-give-saddle-back.patch b/patches/server/0035-Pigs-give-saddle-back.patch index 0c8e49945..d7f714579 100644 --- a/patches/server/0035-Pigs-give-saddle-back.patch +++ b/patches/server/0035-Pigs-give-saddle-back.patch @@ -5,14 +5,14 @@ Subject: [PATCH] Pigs give saddle back diff --git a/src/main/java/net/minecraft/world/entity/animal/Pig.java b/src/main/java/net/minecraft/world/entity/animal/Pig.java -index 26fe9e59e2321932c5ef70631510967162c0d896..2bd72ba2112c7212f331e6ca2655f557eee241d9 100644 +index a22e5b6c13b48b46d16a859531d4231376bc1bfc..ff98a81f7104bbaf67ed85b8ad0946edf2a8c368 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Pig.java +++ b/src/main/java/net/minecraft/world/entity/animal/Pig.java @@ -174,6 +174,17 @@ public class Pig extends Animal implements ItemSteerable, Saddleable { public InteractionResult mobInteract(Player player, InteractionHand hand) { boolean flag = this.isFood(player.getItemInHand(hand)); -+ if (level.purpurConfig.pigGiveSaddleBack && player.isSecondaryUseActive() && !flag && isSaddled() && !isVehicle()) { ++ if (level().purpurConfig.pigGiveSaddleBack && player.isSecondaryUseActive() && !flag && isSaddled() && !isVehicle()) { + this.steering.setSaddle(false); + if (!player.getAbilities().instabuild) { + ItemStack saddle = new ItemStack(Items.SADDLE); @@ -27,22 +27,22 @@ index 26fe9e59e2321932c5ef70631510967162c0d896..2bd72ba2112c7212f331e6ca2655f557 if (!this.level().isClientSide) { player.startRiding(this); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b3f8077b7a27a0298d88a651cb93b4028f2621ee..6cea8e16efb059ce2bc477a141d8807c2ea202ba 100644 +index ed32ff8a2ab16226a8679daff5835cc819b3b709..8b4bedef0c02f72b07400564976ac55380291efc 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -661,6 +661,7 @@ public class PurpurWorldConfig { - } - +@@ -918,6 +918,7 @@ public class PurpurWorldConfig { + public boolean pigRidableInWater = false; + public boolean pigControllable = true; public double pigMaxHealth = 10.0D; + public boolean pigGiveSaddleBack = false; private void pigSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.pig.attributes.max-health", pigMaxHealth); -@@ -668,6 +669,7 @@ public class PurpurWorldConfig { + pigRidable = getBoolean("mobs.pig.ridable", pigRidable); + pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); +@@ -928,6 +929,7 @@ public class PurpurWorldConfig { set("mobs.pig.attributes.max_health", oldValue); } pigMaxHealth = getDouble("mobs.pig.attributes.max_health", pigMaxHealth); + pigGiveSaddleBack = getBoolean("mobs.pig.give-saddle-back", pigGiveSaddleBack); } - public double piglinMaxHealth = 16.0D; + public boolean piglinRidable = false; diff --git a/patches/server/0036-Snowman-drop-and-put-back-pumpkin.patch b/patches/server/0036-Snowman-drop-and-put-back-pumpkin.patch index 367be94e5..2e11a43cd 100644 --- a/patches/server/0036-Snowman-drop-and-put-back-pumpkin.patch +++ b/patches/server/0036-Snowman-drop-and-put-back-pumpkin.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Snowman drop and put back pumpkin diff --git a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -index f95a472f3696061d5c1b0ac3bf281ae099871084..d4d843ee7fe52a97dc1dd063c7437f6a6b05b9de 100644 +index a8b411cc3dd1f61b4f949862a077e87e26e424de..2a5ffaf5614e19305f4e08e15752364919e68a49 100644 --- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java @@ -191,6 +191,14 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM @@ -32,19 +32,19 @@ index f95a472f3696061d5c1b0ac3bf281ae099871084..d4d843ee7fe52a97dc1dd063c7437f6a this.forceDrops = false; // CraftBukkit } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 6cea8e16efb059ce2bc477a141d8807c2ea202ba..7aae3881ff9896ea5f300e0428fad0f0b4735a12 100644 +index 8b4bedef0c02f72b07400564976ac55380291efc..3c8cbb7c114f9c14837da9977632fb6442075e35 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -840,6 +840,8 @@ public class PurpurWorldConfig { - +@@ -1181,6 +1181,8 @@ public class PurpurWorldConfig { + public boolean snowGolemControllable = true; public boolean snowGolemLeaveTrailWhenRidden = false; public double snowGolemMaxHealth = 4.0D; + public boolean snowGolemDropsPumpkin = true; + public boolean snowGolemPutPumpkinBack = false; private void snowGolemSettings() { - snowGolemLeaveTrailWhenRidden = getBoolean("mobs.snow_golem.leave-trail-when-ridden", snowGolemLeaveTrailWhenRidden); - if (PurpurConfig.version < 10) { -@@ -848,6 +850,8 @@ public class PurpurWorldConfig { + snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); + snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); +@@ -1192,6 +1194,8 @@ public class PurpurWorldConfig { set("mobs.snow_golem.attributes.max_health", oldValue); } snowGolemMaxHealth = getDouble("mobs.snow_golem.attributes.max_health", snowGolemMaxHealth); @@ -52,4 +52,4 @@ index 6cea8e16efb059ce2bc477a141d8807c2ea202ba..7aae3881ff9896ea5f300e0428fad0f0 + snowGolemPutPumpkinBack = getBoolean("mobs.snow_golem.pumpkin-can-be-added-back", snowGolemPutPumpkinBack); } - public double snifferMaxHealth = 14.0D; + public boolean snifferRidable = false; diff --git a/patches/server/0037-Ender-dragon-always-drop-full-exp.patch b/patches/server/0037-Ender-dragon-always-drop-full-exp.patch index 4098f6ad3..d7108e22a 100644 --- a/patches/server/0037-Ender-dragon-always-drop-full-exp.patch +++ b/patches/server/0037-Ender-dragon-always-drop-full-exp.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Ender dragon always drop full exp diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -index 39cf0189b9e82e700049e144db9150b9783cfba6..587a6cd7bd4cb724a778f98677eb09b0eb494349 100644 +index f160933af318becaf99befc0ecc0204bc48ed4a9..81cf89bc57af0f43d05ba93256255155bf0c4d53 100644 --- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java @@ -747,7 +747,7 @@ public class EnderDragon extends Mob implements Enemy { @@ -13,27 +13,27 @@ index 39cf0189b9e82e700049e144db9150b9783cfba6..587a6cd7bd4cb724a778f98677eb09b0 short short0 = 500; - if (this.dragonFight != null && !this.dragonFight.hasPreviouslyKilledDragon()) { -+ if (this.dragonFight != null && (level.purpurConfig.enderDragonAlwaysDropsFullExp || !this.dragonFight.hasPreviouslyKilledDragon())) { ++ if (this.dragonFight != null && (level().purpurConfig.enderDragonAlwaysDropsFullExp || !this.dragonFight.hasPreviouslyKilledDragon())) { short0 = 12000; } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 7aae3881ff9896ea5f300e0428fad0f0b4735a12..b11ff20bc282fbc114a699bff47ba2ff7eb757c7 100644 +index 3c8cbb7c114f9c14837da9977632fb6442075e35..fdcee2e4d549ad2e5af4ba9b28c944a7cf82ad52 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -351,6 +351,7 @@ public class PurpurWorldConfig { - } - +@@ -459,6 +459,7 @@ public class PurpurWorldConfig { + public boolean enderDragonControllable = true; + public double enderDragonMaxY = 320D; public double enderDragonMaxHealth = 200.0D; + public boolean enderDragonAlwaysDropsFullExp = false; private void enderDragonSettings() { - if (PurpurConfig.version < 8) { - double oldValue = getDouble("mobs.ender_dragon.max-health", enderDragonMaxHealth); -@@ -362,6 +363,7 @@ public class PurpurWorldConfig { + enderDragonRidable = getBoolean("mobs.ender_dragon.ridable", enderDragonRidable); + enderDragonRidableInWater = getBoolean("mobs.ender_dragon.ridable-in-water", enderDragonRidableInWater); +@@ -474,6 +475,7 @@ public class PurpurWorldConfig { set("mobs.ender_dragon.attributes.max_health", oldValue); } enderDragonMaxHealth = getDouble("mobs.ender_dragon.attributes.max_health", enderDragonMaxHealth); + enderDragonAlwaysDropsFullExp = getBoolean("mobs.ender_dragon.always-drop-full-exp", enderDragonAlwaysDropsFullExp); } - public double endermanMaxHealth = 40.0D; + public boolean endermanRidable = false; diff --git a/patches/server/0039-Minecart-settings-and-WASD-controls.patch b/patches/server/0039-Minecart-settings-and-WASD-controls.patch index 331c96f47..d520630a3 100644 --- a/patches/server/0039-Minecart-settings-and-WASD-controls.patch +++ b/patches/server/0039-Minecart-settings-and-WASD-controls.patch @@ -5,14 +5,14 @@ Subject: [PATCH] Minecart settings and WASD controls diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 206e8d9f7f04b4097402fa66390e7051af7df61e..b0eab4e73c85e4c18301978daac91a4b862617b0 100644 +index dcc4a25a8c7a7809222cf585901f057c64946a68..d97eec4118983794b49018882f4cf1f2629bf0a7 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -1112,6 +1112,7 @@ public class ServerPlayer extends Player { if (this.isInvulnerableTo(source)) { return false; } else { -+ if (source.is(DamageTypeTags.IS_FALL) && getRootVehicle() instanceof net.minecraft.world.entity.vehicle.AbstractMinecart && level.purpurConfig.minecartControllable && !level.purpurConfig.minecartControllableFallDamage) return false; // Purpur ++ if (source.is(DamageTypeTags.IS_FALL) && getRootVehicle() instanceof net.minecraft.world.entity.vehicle.AbstractMinecart && level().purpurConfig.minecartControllable && !level().purpurConfig.minecartControllableFallDamage) return false; // Purpur boolean flag = this.server.isDedicatedServer() && this.isPvpAllowed() && source.is(DamageTypeTags.IS_FALL); if (!flag && isSpawnInvulnerable() && !source.is(DamageTypeTags.BYPASSES_INVULNERABILITY)) { // Purpur @@ -148,7 +148,7 @@ index de4c1e4701236e7d5ec77339c51ad6a9d8288bb6..5ac102afde62c08f36886b466010ccfe protected ResourceLocation drops; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e7a8f166c202b76f89b6f9bbf0ce3de19c9c171e..dc0041c9edd87032937b3f0e4850e3c9a09362a4 100644 +index e4f5b63162423a4d8fe0704746bd18f6a6134b2c..60f5f27583e57105bbc95ce72138d2b530669c56 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -97,6 +97,68 @@ public class PurpurWorldConfig { diff --git a/patches/server/0040-Disable-loot-drops-on-death-by-cramming.patch b/patches/server/0040-Disable-loot-drops-on-death-by-cramming.patch index 6393f2fcb..03d71c0b3 100644 --- a/patches/server/0040-Disable-loot-drops-on-death-by-cramming.patch +++ b/patches/server/0040-Disable-loot-drops-on-death-by-cramming.patch @@ -5,14 +5,14 @@ Subject: [PATCH] Disable loot drops on death by cramming diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index bf3a3bd00260ba04c592c4313cde33e5d393d392..a97f8fe12e2d4390fa3811335ffa3e3c9ef4aec6 100644 +index bf3a3bd00260ba04c592c4313cde33e5d393d392..7d9ecae23415e8f06831bc5bf4fae9137d43eb12 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -1800,6 +1800,7 @@ public abstract class LivingEntity extends Entity implements Attackable { this.dropEquipment(); // CraftBukkit - from below if (this.shouldDropLoot() && this.level().getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { -+ if (!(source.is(net.minecraft.world.damagesource.DamageTypes.CRAMMING) && level.purpurConfig.disableDropsOnCrammingDeath)) { // Purpur ++ if (!(source.is(net.minecraft.world.damagesource.DamageTypes.CRAMMING) && level().purpurConfig.disableDropsOnCrammingDeath)) { // Purpur this.dropFromLootTable(source, flag); // Paper start final boolean prev = this.clearEquipmentSlots; @@ -25,7 +25,7 @@ index bf3a3bd00260ba04c592c4313cde33e5d393d392..a97f8fe12e2d4390fa3811335ffa3e3c // CraftBukkit start - Call death event // Paper start - call advancement triggers with correct entity equipment org.bukkit.event.entity.EntityDeathEvent deathEvent = CraftEventFactory.callEntityDeathEvent(this, this.drops, () -> { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index dc0041c9edd87032937b3f0e4850e3c9a09362a4..c173ec973eecc8c79a75da3de349404ee455fb0f 100644 +index 60f5f27583e57105bbc95ce72138d2b530669c56..15231c9ef7787830b6639e8c4ce34d230ac6a304 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -97,6 +97,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0046-Add-option-to-allow-loyalty-on-tridents-to-work-in-t.patch b/patches/server/0046-Add-option-to-allow-loyalty-on-tridents-to-work-in-t.patch index a53a70fb6..873888d59 100644 --- a/patches/server/0046-Add-option-to-allow-loyalty-on-tridents-to-work-in-t.patch +++ b/patches/server/0046-Add-option-to-allow-loyalty-on-tridents-to-work-in-t.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add option to allow loyalty on tridents to work in the void 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 454dd67920826b8b62c2654abfd43fc08c2648e4..94d84f1d4232d1f4e866a7b9910243018c0fe7f0 100644 +index 454dd67920826b8b62c2654abfd43fc08c2648e4..0ea182962d6647629fc98c9e7406f7b7ce012c5e 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/ThrownTrident.java +++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownTrident.java @@ -60,7 +60,7 @@ public class ThrownTrident extends AbstractArrow { @@ -13,12 +13,12 @@ index 454dd67920826b8b62c2654abfd43fc08c2648e4..94d84f1d4232d1f4e866a7b991024301 byte b0 = (Byte) this.entityData.get(ThrownTrident.ID_LOYALTY); - if (b0 > 0 && (this.dealtDamage || this.isNoPhysics()) && entity != null) { -+ if (b0 > 0 && (this.dealtDamage || this.isNoPhysics() || (level.purpurConfig.tridentLoyaltyVoidReturnHeight < 0.0D && getY() < level.purpurConfig.tridentLoyaltyVoidReturnHeight)) && entity != null) { // Purpur ++ if (b0 > 0 && (this.dealtDamage || this.isNoPhysics() || (level().purpurConfig.tridentLoyaltyVoidReturnHeight < 0.0D && getY() < level().purpurConfig.tridentLoyaltyVoidReturnHeight)) && entity != null) { // Purpur if (!this.isAcceptibleReturnOwner()) { if (!this.level().isClientSide && this.pickup == AbstractArrow.Pickup.ALLOWED) { this.spawnAtLocation(this.getPickupItem(), 0.1F); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index fbc7685ad34c67180a54e967a48355db349d46e8..40c1c5f0d15391e67ad0aa9bb6529d3659f43f18 100644 +index d6e79bc725ef6a13120a7196dd5dd6557efc7341..5d378a315e98cf7f0b8576684517fad0cebd35f3 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -99,9 +99,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0047-Add-enderman-and-creeper-griefing-controls.patch b/patches/server/0047-Add-enderman-and-creeper-griefing-controls.patch index 6fb03e566..549b8c94c 100644 --- a/patches/server/0047-Add-enderman-and-creeper-griefing-controls.patch +++ b/patches/server/0047-Add-enderman-and-creeper-griefing-controls.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add enderman and creeper griefing controls diff --git a/src/main/java/net/minecraft/world/entity/monster/Creeper.java b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -index 19c8fb5ab8c7818679919de07664df7dc8d54e91..69b91852f2d4ffce14e6bd6f94902da61990717a 100644 +index 4f374a2b1aab20fe2523df716a9d622c28749b7a..04143ca4d451132e6dcd764508e55c567994497d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java @@ -361,7 +361,7 @@ public class Creeper extends Monster implements PowerableMob { @@ -18,7 +18,7 @@ index 19c8fb5ab8c7818679919de07664df7dc8d54e91..69b91852f2d4ffce14e6bd6f94902da6 this.spawnLingeringCloud(); } else { 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 50925ae443a52833d34304dec30be899dbdaee14..945abc20319819cca2631876cb0abca07f7a730a 100644 +index a97d4e3c4dd03fa8cc299e825479463bb3e148c2..54b59b7faf69d54c05bdfee9b1bd2f137a5dd958 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java @@ -530,6 +530,7 @@ public class EnderMan extends Monster implements NeutralMob { @@ -38,38 +38,38 @@ index 50925ae443a52833d34304dec30be899dbdaee14..945abc20319819cca2631876cb0abca0 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 40c1c5f0d15391e67ad0aa9bb6529d3659f43f18..a041fe8d6b728fc5d2811bb4ebd7454bb9dc73c6 100644 +index 5d378a315e98cf7f0b8576684517fad0cebd35f3..ee5931cdc3352d8ea8664edb26de348f98c69fed 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -362,6 +362,7 @@ public class PurpurWorldConfig { - +@@ -426,6 +426,7 @@ public class PurpurWorldConfig { + public boolean creeperControllable = true; public double creeperMaxHealth = 20.0D; public double creeperChargedChance = 0.0D; + public boolean creeperAllowGriefing = true; private void creeperSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.creeper.attributes.max-health", creeperMaxHealth); -@@ -370,6 +371,7 @@ public class PurpurWorldConfig { + creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); + creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); +@@ -437,6 +438,7 @@ public class PurpurWorldConfig { } creeperMaxHealth = getDouble("mobs.creeper.attributes.max_health", creeperMaxHealth); creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); + creeperAllowGriefing = getBoolean("mobs.creeper.allow-griefing", creeperAllowGriefing); } - public double dolphinMaxHealth = 10.0D; -@@ -443,6 +445,7 @@ public class PurpurWorldConfig { - } - + public boolean dolphinRidable = false; +@@ -558,6 +560,7 @@ public class PurpurWorldConfig { + public boolean endermanRidableInWater = true; + public boolean endermanControllable = true; public double endermanMaxHealth = 40.0D; + public boolean endermanAllowGriefing = true; private void endermanSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.enderman.attributes.max-health", endermanMaxHealth); -@@ -450,6 +453,7 @@ public class PurpurWorldConfig { + endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); + endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); +@@ -568,6 +571,7 @@ public class PurpurWorldConfig { set("mobs.enderman.attributes.max_health", oldValue); } endermanMaxHealth = getDouble("mobs.enderman.attributes.max_health", endermanMaxHealth); + endermanAllowGriefing = getBoolean("mobs.enderman.allow-griefing", endermanAllowGriefing); } - public double endermiteMaxHealth = 8.0D; + public boolean endermiteRidable = false; diff --git a/patches/server/0048-Villagers-follow-emerald-blocks.patch b/patches/server/0048-Villagers-follow-emerald-blocks.patch index 8767950e6..0d8b5dd7e 100644 --- a/patches/server/0048-Villagers-follow-emerald-blocks.patch +++ b/patches/server/0048-Villagers-follow-emerald-blocks.patch @@ -30,62 +30,62 @@ index 564908ce0a560c2190fb624e77d227d3b7031024..f2a4e214744227f1df32e3782e71f8a9 // CraftBukkit start private CraftMerchant craftMerchant; diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index dc8225eb864b0fead5990762669dc219e6e8c526..ba326c8e633a2b583f40e1e1d891c26542d84324 100644 +index 6cbc3816d3f303d0646cd14a3648ebd2e88354aa..c613afe70566545136a48d6b820fb8d085934565 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java @@ -152,6 +152,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler this.getNavigation().setCanFloat(true); this.setCanPickUpLoot(true); this.setVillagerData(this.getVillagerData().setType(type).setProfession(VillagerProfession.NONE)); -+ if (level.purpurConfig.villagerFollowEmeraldBlock) this.goalSelector.addGoal(3, new net.minecraft.world.entity.ai.goal.TemptGoal(this, 1.0D, TEMPT_ITEMS, false)); ++ if (level().purpurConfig.villagerFollowEmeraldBlock) this.goalSelector.addGoal(3, new net.minecraft.world.entity.ai.goal.TemptGoal(this, 1.0D, TEMPT_ITEMS, false)); } - @Override + // Purpur start diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index bb8d422f8c2ac80457970f300390b797e8807dd8..fd77ea367ff9a8ec6d6c45be9bdd1fb0f4154c9e 100644 +index 62deb4a443bf65655d2a4310c0dd9f40a02cb401..1c7359431533716b2681176b3b59b5028aa043c2 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java @@ -108,6 +108,7 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill this.goalSelector.addGoal(1, new PanicGoal(this, 0.5D)); this.goalSelector.addGoal(1, new LookAtTradingPlayerGoal(this)); this.goalSelector.addGoal(2, new WanderingTrader.WanderToPositionGoal(this, 2.0D, 0.35D)); -+ if (level.purpurConfig.wanderingTraderFollowEmeraldBlock) this.goalSelector.addGoal(3, new net.minecraft.world.entity.ai.goal.TemptGoal(this, 1.0D, TEMPT_ITEMS, false)); // Purpur ++ if (level().purpurConfig.wanderingTraderFollowEmeraldBlock) this.goalSelector.addGoal(3, new net.minecraft.world.entity.ai.goal.TemptGoal(this, 1.0D, TEMPT_ITEMS, false)); // Purpur this.goalSelector.addGoal(4, new MoveTowardsRestrictionGoal(this, 0.35D)); this.goalSelector.addGoal(8, new WaterAvoidingRandomStrollGoal(this, 0.35D)); this.goalSelector.addGoal(9, new InteractGoal(this, Player.class, 3.0F, 1.0F)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a041fe8d6b728fc5d2811bb4ebd7454bb9dc73c6..d4d5a82c3dd448bb32c2b60f07e5ec289eff89dd 100644 +index ee5931cdc3352d8ea8664edb26de348f98c69fed..7baa48a5537cf7e5f47b106b39da039767547148 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1036,6 +1036,7 @@ public class PurpurWorldConfig { - } - +@@ -1442,6 +1442,7 @@ public class PurpurWorldConfig { + public boolean villagerRidableInWater = true; + public boolean villagerControllable = true; public double villagerMaxHealth = 20.0D; + public boolean villagerFollowEmeraldBlock = false; private void villagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.villager.attributes.max-health", villagerMaxHealth); -@@ -1043,6 +1044,7 @@ public class PurpurWorldConfig { + villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); + villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); +@@ -1452,6 +1453,7 @@ public class PurpurWorldConfig { set("mobs.villager.attributes.max_health", oldValue); } villagerMaxHealth = getDouble("mobs.villager.attributes.max_health", villagerMaxHealth); + villagerFollowEmeraldBlock = getBoolean("mobs.villager.follow-emerald-blocks", villagerFollowEmeraldBlock); } - public double vindicatorMaxHealth = 24.0D; -@@ -1056,6 +1058,7 @@ public class PurpurWorldConfig { - } - + public boolean vindicatorRidable = false; +@@ -1474,6 +1476,7 @@ public class PurpurWorldConfig { + public boolean wanderingTraderRidableInWater = true; + public boolean wanderingTraderControllable = true; public double wanderingTraderMaxHealth = 20.0D; + public boolean wanderingTraderFollowEmeraldBlock = false; private void wanderingTraderSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.wandering_trader.attributes.max-health", wanderingTraderMaxHealth); -@@ -1063,6 +1066,7 @@ public class PurpurWorldConfig { + wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); + wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); +@@ -1484,6 +1487,7 @@ public class PurpurWorldConfig { set("mobs.wandering_trader.attributes.max_health", oldValue); } wanderingTraderMaxHealth = getDouble("mobs.wandering_trader.attributes.max_health", wanderingTraderMaxHealth); + wanderingTraderFollowEmeraldBlock = getBoolean("mobs.wandering_trader.follow-emerald-blocks", wanderingTraderFollowEmeraldBlock); } - public double witchMaxHealth = 26.0D; + public boolean wardenRidable = false; diff --git a/patches/server/0049-Allow-leashing-villagers.patch b/patches/server/0049-Allow-leashing-villagers.patch index 7a833302d..a4b71170d 100644 --- a/patches/server/0049-Allow-leashing-villagers.patch +++ b/patches/server/0049-Allow-leashing-villagers.patch @@ -5,82 +5,82 @@ Subject: [PATCH] Allow leashing villagers diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index d8fc6216067cd03e10ec0bb5c13abc85215ac822..c68952d8f565ca14855fb43d9f8ea40bab27764f 100644 +index 89ea4208bc30bcf3ed59b3a28384c0796b9204c4..0c1aa12dafb34ed76dd899893748556f9fe23487 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java @@ -1302,6 +1302,7 @@ public abstract class Mob extends LivingEntity implements Targeting { if (!this.isAlive()) { return InteractionResult.PASS; } else if (this.getLeashHolder() == player) { -+ if (hand == InteractionHand.OFF_HAND && (level.purpurConfig.villagerCanBeLeashed || level.purpurConfig.wanderingTraderCanBeLeashed) && this instanceof net.minecraft.world.entity.npc.AbstractVillager) return InteractionResult.CONSUME; // Purpur ++ if (hand == InteractionHand.OFF_HAND && (level().purpurConfig.villagerCanBeLeashed || level().purpurConfig.wanderingTraderCanBeLeashed) && this instanceof net.minecraft.world.entity.npc.AbstractVillager) return InteractionResult.CONSUME; // Purpur // CraftBukkit start - fire PlayerUnleashEntityEvent // Paper start - drop leash variable org.bukkit.event.player.PlayerUnleashEntityEvent event = CraftEventFactory.callPlayerUnleashEntityEvent(this, player, hand, !player.getAbilities().instabuild); diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index ba326c8e633a2b583f40e1e1d891c26542d84324..e258d5b83e5cb517b9fe2e2818391f0666cacd84 100644 +index c613afe70566545136a48d6b820fb8d085934565..813b9708d218589afaaa2d0578affcc78f0c075f 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java @@ -182,6 +182,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.villagerMaxHealth); } - // Purpur end + @Override + public boolean canBeLeashed(Player player) { -+ return level.purpurConfig.villagerCanBeLeashed && !this.isLeashed(); ++ return level().purpurConfig.villagerCanBeLeashed && !this.isLeashed(); + } + @Override public Brain getBrain() { return (Brain) super.getBrain(); // CraftBukkit - decompile error diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index fd77ea367ff9a8ec6d6c45be9bdd1fb0f4154c9e..4dc8ac6a3e26a619ff4f2d7b907f192766c8281a 100644 +index 1c7359431533716b2681176b3b59b5028aa043c2..41ddf073ecb8ea97cca8021390500d65866488a5 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java @@ -88,6 +88,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill + this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.wanderingTraderMaxHealth); } - // Purpur end + @Override + public boolean canBeLeashed(Player player) { -+ return level.purpurConfig.wanderingTraderCanBeLeashed && !this.isLeashed(); ++ return level().purpurConfig.wanderingTraderCanBeLeashed && !this.isLeashed(); + } + @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d4d5a82c3dd448bb32c2b60f07e5ec289eff89dd..c3f1c669c9fa4e8c2077e948b6de65ab9c4c6fe3 100644 +index 7baa48a5537cf7e5f47b106b39da039767547148..97710a3988ead1049b35de2a9be89cec738ed149 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1037,6 +1037,7 @@ public class PurpurWorldConfig { - +@@ -1443,6 +1443,7 @@ public class PurpurWorldConfig { + public boolean villagerControllable = true; public double villagerMaxHealth = 20.0D; public boolean villagerFollowEmeraldBlock = false; + public boolean villagerCanBeLeashed = false; private void villagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.villager.attributes.max-health", villagerMaxHealth); -@@ -1045,6 +1046,7 @@ public class PurpurWorldConfig { + villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); + villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); +@@ -1454,6 +1455,7 @@ public class PurpurWorldConfig { } villagerMaxHealth = getDouble("mobs.villager.attributes.max_health", villagerMaxHealth); villagerFollowEmeraldBlock = getBoolean("mobs.villager.follow-emerald-blocks", villagerFollowEmeraldBlock); + villagerCanBeLeashed = getBoolean("mobs.villager.can-be-leashed", villagerCanBeLeashed); } - public double vindicatorMaxHealth = 24.0D; -@@ -1059,6 +1061,7 @@ public class PurpurWorldConfig { - + public boolean vindicatorRidable = false; +@@ -1477,6 +1479,7 @@ public class PurpurWorldConfig { + public boolean wanderingTraderControllable = true; public double wanderingTraderMaxHealth = 20.0D; public boolean wanderingTraderFollowEmeraldBlock = false; + public boolean wanderingTraderCanBeLeashed = false; private void wanderingTraderSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.wandering_trader.attributes.max-health", wanderingTraderMaxHealth); -@@ -1067,6 +1070,7 @@ public class PurpurWorldConfig { + wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); + wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); +@@ -1488,6 +1491,7 @@ public class PurpurWorldConfig { } wanderingTraderMaxHealth = getDouble("mobs.wandering_trader.attributes.max_health", wanderingTraderMaxHealth); wanderingTraderFollowEmeraldBlock = getBoolean("mobs.wandering_trader.follow-emerald-blocks", wanderingTraderFollowEmeraldBlock); + wanderingTraderCanBeLeashed = getBoolean("mobs.wandering_trader.can-be-leashed", wanderingTraderCanBeLeashed); } - public double witchMaxHealth = 26.0D; + public boolean wardenRidable = false; diff --git a/patches/server/0050-Implement-infinite-liquids.patch b/patches/server/0050-Implement-infinite-liquids.patch index f787866ed..2a906d49a 100644 --- a/patches/server/0050-Implement-infinite-liquids.patch +++ b/patches/server/0050-Implement-infinite-liquids.patch @@ -31,7 +31,7 @@ index 5502ad143fd2575f1346334b5b4fe7846628f54e..37f6de6166fbede2d216e462cf7b1672 if (state.getBlock() instanceof LiquidBlockContainer) { ((LiquidBlockContainer) state.getBlock()).placeLiquid(world, pos, state, fluidState); diff --git a/src/main/java/net/minecraft/world/level/material/LavaFluid.java b/src/main/java/net/minecraft/world/level/material/LavaFluid.java -index 72f8b72c6436ca3b8eaeb39c7d3efe2c1462ae1d..3706ebc551413401b0e6a9a0b1c2e3257d1337c1 100644 +index 72f8b72c6436ca3b8eaeb39c7d3efe2c1462ae1d..c0c072898226710f7e2e12b37838f7cfdfb0dde0 100644 --- a/src/main/java/net/minecraft/world/level/material/LavaFluid.java +++ b/src/main/java/net/minecraft/world/level/material/LavaFluid.java @@ -198,6 +198,13 @@ public abstract class LavaFluid extends FlowingFluid { @@ -41,7 +41,7 @@ index 72f8b72c6436ca3b8eaeb39c7d3efe2c1462ae1d..3706ebc551413401b0e6a9a0b1c2e325 + // Purpur start + @Override + protected int getRequiredSources(Level level) { -+ return level.purpurConfig.lavaInfiniteRequiredSources; ++ return level().purpurConfig.lavaInfiniteRequiredSources; + } + // Purpur end + @@ -49,7 +49,7 @@ index 72f8b72c6436ca3b8eaeb39c7d3efe2c1462ae1d..3706ebc551413401b0e6a9a0b1c2e325 protected boolean canConvertToSource(Level world) { return world.getGameRules().getBoolean(GameRules.RULE_LAVA_SOURCE_CONVERSION); diff --git a/src/main/java/net/minecraft/world/level/material/WaterFluid.java b/src/main/java/net/minecraft/world/level/material/WaterFluid.java -index 82e85fbbd45244d02df90fa00c9046e7f51275a2..ec6c63075306f9e5389e83641d2c8a82369ddc6b 100644 +index 82e85fbbd45244d02df90fa00c9046e7f51275a2..472dbf007468c39cfaa74e837e2df1cef9a8d1bf 100644 --- a/src/main/java/net/minecraft/world/level/material/WaterFluid.java +++ b/src/main/java/net/minecraft/world/level/material/WaterFluid.java @@ -64,6 +64,13 @@ public abstract class WaterFluid extends FlowingFluid { @@ -59,7 +59,7 @@ index 82e85fbbd45244d02df90fa00c9046e7f51275a2..ec6c63075306f9e5389e83641d2c8a82 + // Purpur start + @Override + protected int getRequiredSources(Level level) { -+ return level.purpurConfig.waterInfiniteRequiredSources; ++ return level().purpurConfig.waterInfiniteRequiredSources; + } + // Purpur end + @@ -67,7 +67,7 @@ index 82e85fbbd45244d02df90fa00c9046e7f51275a2..ec6c63075306f9e5389e83641d2c8a82 @Override protected void beforeDestroyingBlock(LevelAccessor world, BlockPos pos, BlockState state, BlockPos source) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index c3f1c669c9fa4e8c2077e948b6de65ab9c4c6fe3..a759adea89cc44add6fe22c626e9978bda8f3bbe 100644 +index 97710a3988ead1049b35de2a9be89cec738ed149..b99bd530802a3212cc42438b607d1aa46587acef 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -227,6 +227,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0052-Add-player-death-exp-control-options.patch b/patches/server/0052-Add-player-death-exp-control-options.patch index 19b4155e5..27f436ea1 100644 --- a/patches/server/0052-Add-player-death-exp-control-options.patch +++ b/patches/server/0052-Add-player-death-exp-control-options.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add player death exp control options diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index 7b39cb5346925c14f3f144d622ca7e5855420aa6..f67bd221a239d98151e055f444795dea28a07269 100644 +index 7b39cb5346925c14f3f144d622ca7e5855420aa6..fa2a0cc24bbe31abd49ce0f3f41bab2aa5d9c81f 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java @@ -1998,9 +1998,19 @@ public abstract class Player extends LivingEntity { @@ -21,18 +21,18 @@ index 7b39cb5346925c14f3f144d622ca7e5855420aa6..f67bd221a239d98151e055f444795dea + toDrop = Math.round(((Number) scriptEngine.eval("let expLevel = " + experienceLevel + "; " + + "let expTotal = " + totalExperience + "; " + + "let exp = " + experienceProgress + "; " + -+ level.purpurConfig.playerDeathExpDropEquation)).floatValue()); ++ level().purpurConfig.playerDeathExpDropEquation)).floatValue()); + } catch (javax.script.ScriptException e) { + e.printStackTrace(); + toDrop = experienceLevel * 7; + } -+ return Math.min(toDrop, level.purpurConfig.playerDeathExpDropMax); ++ return Math.min(toDrop, level().purpurConfig.playerDeathExpDropMax); + // Purpur end } else { return 0; } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e92879a7e0458eeee9b8006bdc64228808cc9e08..b0e70dd59fd488f4c094326aae2647e08a2ee758 100644 +index 17ba29e1538d3007e7befbe3b44d4ef291c1af05..4c73bd5aae5587e1d196a7b63fe84319cad0853d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -175,6 +175,8 @@ public class PurpurWorldConfig { diff --git a/patches/server/0053-Configurable-void-damage-height-and-damage.patch b/patches/server/0053-Configurable-void-damage-height-and-damage.patch index 6bfd653ec..d5f010b63 100644 --- a/patches/server/0053-Configurable-void-damage-height-and-damage.patch +++ b/patches/server/0053-Configurable-void-damage-height-and-damage.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configurable void damage height and damage diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 43d5b06a87909b544d151b238f7479c95c1ac1b2..f5ae3d265fa190af4d8205ffa45ce053fe0c7ddc 100644 +index 43d5b06a87909b544d151b238f7479c95c1ac1b2..ba7901f72f97275ffac8d30e7b6c39f1f31dad37 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -834,7 +834,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -13,12 +13,12 @@ index 43d5b06a87909b544d151b238f7479c95c1ac1b2..f5ae3d265fa190af4d8205ffa45ce053 public void checkBelowWorld() { // Paper start - Configurable nether ceiling damage - if (this.getY() < (double) (this.level.getMinBuildHeight() - 64) || (this.level.getWorld().getEnvironment() == org.bukkit.World.Environment.NETHER -+ if (this.getY() < (double) (this.level.getMinBuildHeight() + level.purpurConfig.voidDamageHeight) || (this.level.getWorld().getEnvironment() == org.bukkit.World.Environment.NETHER // Purpur ++ if (this.getY() < (double) (this.level.getMinBuildHeight() + level().purpurConfig.voidDamageHeight) || (this.level.getWorld().getEnvironment() == org.bukkit.World.Environment.NETHER // Purpur && this.level.paperConfig().environment.netherCeilingVoidDamageHeight.test(v -> this.getY() >= v) && (!(this instanceof Player player) || !player.getAbilities().invulnerable))) { // Paper end diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index a97f8fe12e2d4390fa3811335ffa3e3c9ef4aec6..2ac30426faa256dbfac48c0accab53a9c72809b9 100644 +index 7d9ecae23415e8f06831bc5bf4fae9137d43eb12..6e0250d4ae4afb73d8f6f613ec014d38552ffa6d 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -2481,7 +2481,7 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -31,7 +31,7 @@ index a97f8fe12e2d4390fa3811335ffa3e3c9ef4aec6..2ac30426faa256dbfac48c0accab53a9 protected void updateSwingTime() { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b0e70dd59fd488f4c094326aae2647e08a2ee758..5b41745fdc55441d1b8ac89571d690ef506462bd 100644 +index 4c73bd5aae5587e1d196a7b63fe84319cad0853d..645a8a35a9e165f656c9a2581a2325cf2598f1b4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -100,10 +100,14 @@ public class PurpurWorldConfig { diff --git a/patches/server/0056-Add-option-for-boats-to-eject-players-on-land.patch b/patches/server/0056-Add-option-for-boats-to-eject-players-on-land.patch index d2a69926c..091036001 100644 --- a/patches/server/0056-Add-option-for-boats-to-eject-players-on-land.patch +++ b/patches/server/0056-Add-option-for-boats-to-eject-players-on-land.patch @@ -5,19 +5,19 @@ Subject: [PATCH] Add option for boats to eject players on land diff --git a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java -index 35aeba4e8430e6419caa9db4a0b931a994228618..5e33f19193ff49d0d2119d811d8f81d0664e5cee 100644 +index 35aeba4e8430e6419caa9db4a0b931a994228618..cb8443c9bc902741dfe6746baca9129214ab503b 100644 --- a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java +++ b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java @@ -541,6 +541,7 @@ public class Boat extends Entity implements VariantHolder { if (f > 0.0F) { this.landFriction = f; -+ if (level.purpurConfig.boatEjectPlayersOnLand) ejectPassengers(); // Purpur ++ if (level().purpurConfig.boatEjectPlayersOnLand) ejectPassengers(); // Purpur return Boat.Status.ON_LAND; } else { return Boat.Status.IN_AIR; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 4f46aa379b18f526c9826722b8d5fbf44cbf17d3..f1d2f1a63ea62b4475f8c4a7f55f4c491b567022 100644 +index 47d0a78f47e80db7aaeacbeac6df177bd3b1fb42..0427450b37f89d6eaf90a80be1d4c8db37475b3b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -97,12 +97,14 @@ public class PurpurWorldConfig { diff --git a/patches/server/0057-Mending-mends-most-damages-equipment-first.patch b/patches/server/0057-Mending-mends-most-damages-equipment-first.patch index f0a04eba7..a975db146 100644 --- a/patches/server/0057-Mending-mends-most-damages-equipment-first.patch +++ b/patches/server/0057-Mending-mends-most-damages-equipment-first.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Mending mends most damages equipment first diff --git a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java -index 673327af0f77aeac0d704b0fb6bebebc76a3c966..9b122ea4a76a136719aac9910e229306128d382e 100644 +index 673327af0f77aeac0d704b0fb6bebebc76a3c966..45af026f572a67061ce63229913366f719cf0a5f 100644 --- a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java +++ b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java @@ -329,7 +329,7 @@ public class ExperienceOrb extends Entity { @@ -13,7 +13,7 @@ index 673327af0f77aeac0d704b0fb6bebebc76a3c966..9b122ea4a76a136719aac9910e229306 private int repairPlayerItems(Player player, int amount) { - Entry entry = EnchantmentHelper.getRandomItemWith(Enchantments.MENDING, player, ItemStack::isDamaged); -+ Entry entry = level.purpurConfig.useBetterMending ? EnchantmentHelper.getMostDamagedEquipment(Enchantments.MENDING, player) : EnchantmentHelper.getRandomItemWith(Enchantments.MENDING, player, ItemStack::isDamaged); // Purpur ++ Entry entry = level().purpurConfig.useBetterMending ? EnchantmentHelper.getMostDamagedEquipment(Enchantments.MENDING, player) : EnchantmentHelper.getRandomItemWith(Enchantments.MENDING, player, ItemStack::isDamaged); // Purpur if (entry != null) { ItemStack itemstack = (ItemStack) entry.getValue(); @@ -73,7 +73,7 @@ index ecf640b00007a386290f8dfe9935a8aa610079fd..2048899f8e4c8211e8dde0d11148d647 public static Map.Entry getRandomItemWith(Enchantment enchantment, LivingEntity entity) { return getRandomItemWith(enchantment, entity, (stack) -> { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f1d2f1a63ea62b4475f8c4a7f55f4c491b567022..0552b09400749fd9a711d081e8940f8bba0bcc8d 100644 +index 0427450b37f89d6eaf90a80be1d4c8db37475b3b..3682ec40e65d1d8db52db5db53238a86b01ecaf3 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -97,6 +97,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0059-Implement-elytra-settings.patch b/patches/server/0059-Implement-elytra-settings.patch index 7d3dae6ad..a27c2d224 100644 --- a/patches/server/0059-Implement-elytra-settings.patch +++ b/patches/server/0059-Implement-elytra-settings.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Implement elytra settings diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 2ac30426faa256dbfac48c0accab53a9c72809b9..7126ce61f58079d924bb86ff9257d75612bcc704 100644 +index 6e0250d4ae4afb73d8f6f613ec014d38552ffa6d..851bffca44dce8680a34bd5e862c1c0794806021 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -3504,7 +3504,16 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -14,10 +14,10 @@ index 2ac30426faa256dbfac48c0accab53a9c72809b9..7126ce61f58079d924bb86ff9257d756 if (j % 2 == 0) { - itemstack.hurtAndBreak(1, this, (entityliving) -> { + // Purpur start -+ int damage = level.purpurConfig.elytraDamagePerSecond; -+ if (level.purpurConfig.elytraDamageMultiplyBySpeed > 0) { ++ int damage = level().purpurConfig.elytraDamagePerSecond; ++ if (level().purpurConfig.elytraDamageMultiplyBySpeed > 0) { + double speed = getDeltaMovement().lengthSqr(); -+ if (speed > level.purpurConfig.elytraDamageMultiplyBySpeed) { ++ if (speed > level().purpurConfig.elytraDamageMultiplyBySpeed) { + damage *= (int) speed; + } + } @@ -54,7 +54,7 @@ index 82b0bda3e35ec2157a477e1a17b2b46baadc97d9..0fc45b1048a1c4e0dc2bd1ae0437eecb itemStack.shrink(1); } else ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory(); diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index 62f70729e92c63b0fc060b0f1eadeb50c298d32f..b70e57a78bbe9084746ba9a4bc896ad2b1636e8f 100644 +index 62f70729e92c63b0fc060b0f1eadeb50c298d32f..961aca57888de6fe7ea249c2a7596c9863c1effe 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java @@ -603,7 +603,7 @@ public final class ItemStack { @@ -62,7 +62,7 @@ index 62f70729e92c63b0fc060b0f1eadeb50c298d32f..b70e57a78bbe9084746ba9a4bc896ad2 if (amount > 0) { - j = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.UNBREAKING, this); -+ j = (getItem() == Items.ELYTRA && player != null && player.level.purpurConfig.elytraIgnoreUnbreaking) ? 0 : EnchantmentHelper.getItemEnchantmentLevel(Enchantments.UNBREAKING, this); ++ j = (getItem() == Items.ELYTRA && player != null && player.level().purpurConfig.elytraIgnoreUnbreaking) ? 0 : EnchantmentHelper.getItemEnchantmentLevel(Enchantments.UNBREAKING, this); int k = 0; for (int l = 0; j > 0 && l < amount; ++l) { @@ -99,7 +99,7 @@ index 8078f127ff4b6e0aafb5804b9c02e237f79445b5..06c2f30b77a2c8aecc65e0c305f643d5 entityhuman.startAutoSpinAttack(20); if (entityhuman.onGround()) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 0552b09400749fd9a711d081e8940f8bba0bcc8d..d7cc6c9f15fdc29bbd1666d9a07904eea8a3d723 100644 +index 3682ec40e65d1d8db52db5db53238a86b01ecaf3..999f31194d694961582df1b998fbcefc5dc7d26f 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -114,6 +114,19 @@ public class PurpurWorldConfig { diff --git a/patches/server/0064-Configurable-jockey-options.patch b/patches/server/0064-Configurable-jockey-options.patch index db92f3643..2adb02ebb 100644 --- a/patches/server/0064-Configurable-jockey-options.patch +++ b/patches/server/0064-Configurable-jockey-options.patch @@ -5,12 +5,12 @@ Subject: [PATCH] Configurable jockey options diff --git a/src/main/java/net/minecraft/world/entity/monster/Drowned.java b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -index 8fcda30fd2ae9882d7101b24cff70e832db1eee0..a27a0de6858aa69caefc436aec3827b365d3d00c 100644 +index 3cde608a222ab2ef2b5fc7f543e97ba71e440ea9..6ec7d0f5e525f9e04b6fa0fb6d4da5fcc22fe653 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java +++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java @@ -95,6 +95,21 @@ public class Drowned extends Zombie implements RangedAttackMob { + this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level().purpurConfig.drownedSpawnReinforcements); } - // Purpur end + @Override + public boolean jockeyOnlyBaby() { @@ -31,49 +31,49 @@ index 8fcda30fd2ae9882d7101b24cff70e832db1eee0..a27a0de6858aa69caefc436aec3827b3 protected void addBehaviourGoals() { this.goalSelector.addGoal(1, new Drowned.DrownedGoToWaterGoal(this, 1.0D)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Husk.java b/src/main/java/net/minecraft/world/entity/monster/Husk.java -index 83fba266721f17efb92f62cc61dbecf4024fb5d6..5e7c4c7a5962e638a2026a57803263830f11d35b 100644 +index 5f801b2a7d8a69a38b8e10471a29f813c8d828ad..7e46ebc5c99f018cada50f491200e4fe7b7098d7 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Husk.java +++ b/src/main/java/net/minecraft/world/entity/monster/Husk.java @@ -49,6 +49,21 @@ public class Husk extends Zombie { + this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level().purpurConfig.huskSpawnReinforcements); } - // Purpur end + @Override + public boolean jockeyOnlyBaby() { -+ return level.purpurConfig.huskJockeyOnlyBaby; ++ return level().purpurConfig.huskJockeyOnlyBaby; + } + + @Override + public double jockeyChance() { -+ return level.purpurConfig.huskJockeyChance; ++ return level().purpurConfig.huskJockeyChance; + } + + @Override + public boolean jockeyTryExistingChickens() { -+ return level.purpurConfig.huskJockeyTryExistingChickens; ++ return level().purpurConfig.huskJockeyTryExistingChickens; + } + public static boolean checkHuskSpawnRules(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { return checkMonsterSpawnRules(type, world, spawnReason, pos, random) && (spawnReason == MobSpawnType.SPAWNER || world.canSeeSky(pos)); } diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index a825c0e976a6bbddc5688bfe0010f8d653f27e08..a0439eac45376c132f6a1d7142c200e9c925130c 100644 +index b3a31549179760388bc2958b4339848d1f0b293d..b2b04d7b7bbc400fb66cac385fa754d4fb47c7d9 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java @@ -128,6 +128,18 @@ public class Zombie extends Monster { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.zombieMaxHealth); + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zombieMaxHealth); } + public boolean jockeyOnlyBaby() { -+ return level.purpurConfig.zombieJockeyOnlyBaby; ++ return level().purpurConfig.zombieJockeyOnlyBaby; + } + + public double jockeyChance() { -+ return level.purpurConfig.zombieJockeyChance; ++ return level().purpurConfig.zombieJockeyChance; + } + + public boolean jockeyTryExistingChickens() { -+ return level.purpurConfig.zombieJockeyTryExistingChickens; ++ return level().purpurConfig.zombieJockeyTryExistingChickens; + } + @Override @@ -115,72 +115,72 @@ index a825c0e976a6bbddc5688bfe0010f8d653f27e08..a0439eac45376c132f6a1d7142c200e9 } } 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 0f42ae8062d2e3044accbc7fa296be9ae7ca7605..b0b39609a50ac0a7dade15651f5f33ff2b426e5a 100644 +index c89680f83275169728f923e70a17cb88d4480f01..6f3667751e430ff6020a9a26f82a25e4ec043ce6 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java @@ -106,6 +106,21 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { + this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level().purpurConfig.zombieVillagerSpawnReinforcements); } - // Purpur end + @Override + public boolean jockeyOnlyBaby() { -+ return level.purpurConfig.zombieVillagerJockeyOnlyBaby; ++ return level().purpurConfig.zombieVillagerJockeyOnlyBaby; + } + + @Override + public double jockeyChance() { -+ return level.purpurConfig.zombieVillagerJockeyChance; ++ return level().purpurConfig.zombieVillagerJockeyChance; + } + + @Override + public boolean jockeyTryExistingChickens() { -+ return level.purpurConfig.zombieVillagerJockeyTryExistingChickens; ++ return level().purpurConfig.zombieVillagerJockeyTryExistingChickens; + } + @Override protected void defineSynchedData() { super.defineSynchedData(); diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index 468923229dfda00eb704040461f8639bfa5082a7..0f53ab48bb28188400c7b420cd79ea202c8f5746 100644 +index 8f22bfcde4bb8ad73794f2b98b156113e5a2a6c9..3d61b27c23d90e87fdfc8c170eafc116716ac047 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java @@ -85,6 +85,21 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zombifiedPiglinMaxHealth); } - // Purpur end + @Override + public boolean jockeyOnlyBaby() { -+ return level.purpurConfig.zombifiedPiglinJockeyOnlyBaby; ++ return level().purpurConfig.zombifiedPiglinJockeyOnlyBaby; + } + + @Override + public double jockeyChance() { -+ return level.purpurConfig.zombifiedPiglinJockeyChance; ++ return level().purpurConfig.zombifiedPiglinJockeyChance; + } + + @Override + public boolean jockeyTryExistingChickens() { -+ return level.purpurConfig.zombifiedPiglinJockeyTryExistingChickens; ++ return level().purpurConfig.zombifiedPiglinJockeyTryExistingChickens; + } + @Override public void setPersistentAngerTarget(@Nullable UUID angryAt) { this.persistentAngerTarget = angryAt; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index ee354de33f436dde6a234c05787a9de28966d7cf..472514b9e6fcbb696ac89ac11b04a6ddc84cfb7c 100644 +index 028344830eeb29090ea684b9c20eaf0d9884c9ce..df8f8dcf6e47710b289df1996b571781009c9c00 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -490,6 +490,9 @@ public class PurpurWorldConfig { - +@@ -572,6 +572,9 @@ public class PurpurWorldConfig { + public boolean drownedControllable = true; public double drownedMaxHealth = 20.0D; public double drownedSpawnReinforcements = 0.1D; + public boolean drownedJockeyOnlyBaby = true; + public double drownedJockeyChance = 0.05D; + public boolean drownedJockeyTryExistingChickens = true; private void drownedSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.drowned.attributes.max-health", drownedMaxHealth); -@@ -498,6 +501,9 @@ public class PurpurWorldConfig { + drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); + drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); +@@ -583,6 +586,9 @@ public class PurpurWorldConfig { } drownedMaxHealth = getDouble("mobs.drowned.attributes.max_health", drownedMaxHealth); drownedSpawnReinforcements = getDouble("mobs.drowned.attributes.spawn_reinforcements", drownedSpawnReinforcements); @@ -189,18 +189,18 @@ index ee354de33f436dde6a234c05787a9de28966d7cf..472514b9e6fcbb696ac89ac11b04a6dd + drownedJockeyTryExistingChickens = getBoolean("mobs.drowned.jockey.try-existing-chickens", drownedJockeyTryExistingChickens); } - public double elderGuardianMaxHealth = 80.0D; -@@ -660,6 +666,9 @@ public class PurpurWorldConfig { - + public double camelMaxHealthMin = 32.0D; +@@ -846,6 +852,9 @@ public class PurpurWorldConfig { + public boolean huskControllable = true; public double huskMaxHealth = 20.0D; public double huskSpawnReinforcements = 0.1D; + public boolean huskJockeyOnlyBaby = true; + public double huskJockeyChance = 0.05D; + public boolean huskJockeyTryExistingChickens = true; private void huskSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.husk.attributes.max-health", huskMaxHealth); -@@ -668,6 +677,9 @@ public class PurpurWorldConfig { + huskRidable = getBoolean("mobs.husk.ridable", huskRidable); + huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); +@@ -857,6 +866,9 @@ public class PurpurWorldConfig { } huskMaxHealth = getDouble("mobs.husk.attributes.max_health", huskMaxHealth); huskSpawnReinforcements = getDouble("mobs.husk.attributes.spawn_reinforcements", huskSpawnReinforcements); @@ -209,18 +209,18 @@ index ee354de33f436dde6a234c05787a9de28966d7cf..472514b9e6fcbb696ac89ac11b04a6dd + huskJockeyTryExistingChickens = getBoolean("mobs.husk.jockey.try-existing-chickens", huskJockeyTryExistingChickens); } - public double illusionerMovementSpeed = 0.5D; -@@ -1211,6 +1223,9 @@ public class PurpurWorldConfig { - + public boolean illusionerRidable = false; +@@ -1676,6 +1688,9 @@ public class PurpurWorldConfig { + public boolean zombieControllable = true; public double zombieMaxHealth = 20.0D; public double zombieSpawnReinforcements = 0.1D; + public boolean zombieJockeyOnlyBaby = true; + public double zombieJockeyChance = 0.05D; + public boolean zombieJockeyTryExistingChickens = true; private void zombieSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.zombie.attributes.max-health", zombieMaxHealth); -@@ -1219,6 +1234,9 @@ public class PurpurWorldConfig { + zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); + zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); +@@ -1687,6 +1702,9 @@ public class PurpurWorldConfig { } zombieMaxHealth = getDouble("mobs.zombie.attributes.max_health", zombieMaxHealth); zombieSpawnReinforcements = getDouble("mobs.zombie.attributes.spawn_reinforcements", zombieSpawnReinforcements); @@ -229,35 +229,35 @@ index ee354de33f436dde6a234c05787a9de28966d7cf..472514b9e6fcbb696ac89ac11b04a6dd + zombieJockeyTryExistingChickens = getBoolean("mobs.zombie.jockey.try-existing-chickens", zombieJockeyTryExistingChickens); } - public double zombieHorseMaxHealthMin = 15.0D; -@@ -1246,6 +1264,9 @@ public class PurpurWorldConfig { - - public double zombieVillagerMaxHealth = 20.0D; - public double zombieVillagerSpawnReinforcements = 0.1D; + public boolean zombieHorseRidableInWater = false; +@@ -1723,10 +1741,16 @@ public class PurpurWorldConfig { + public boolean zombieVillagerRidable = false; + public boolean zombieVillagerRidableInWater = true; + public boolean zombieVillagerControllable = true; + public boolean zombieVillagerJockeyOnlyBaby = true; + public double zombieVillagerJockeyChance = 0.05D; + public boolean zombieVillagerJockeyTryExistingChickens = true; private void zombieVillagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.zombie_villager.attributes.max-health", zombieVillagerMaxHealth); -@@ -1254,10 +1275,16 @@ public class PurpurWorldConfig { - } - zombieVillagerMaxHealth = getDouble("mobs.zombie_villager.attributes.max_health", zombieVillagerMaxHealth); - zombieVillagerSpawnReinforcements = getDouble("mobs.zombie_villager.attributes.spawn_reinforcements", zombieVillagerSpawnReinforcements); + zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); + zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); + zombieVillagerControllable = getBoolean("mobs.zombie_villager.controllable", zombieVillagerControllable); + 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); } + public boolean zombifiedPiglinRidable = false; +@@ -1734,6 +1758,9 @@ public class PurpurWorldConfig { + public boolean zombifiedPiglinControllable = true; public double zombifiedPiglinMaxHealth = 20.0D; public double zombifiedPiglinSpawnReinforcements = 0.0D; + public boolean zombifiedPiglinJockeyOnlyBaby = true; + public double zombifiedPiglinJockeyChance = 0.05D; + public boolean zombifiedPiglinJockeyTryExistingChickens = true; private void zombifiedPiglinSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.zombified_piglin.attributes.max-health", zombifiedPiglinMaxHealth); -@@ -1266,6 +1293,9 @@ public class PurpurWorldConfig { + zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); + zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); +@@ -1745,5 +1772,8 @@ public class PurpurWorldConfig { } zombifiedPiglinMaxHealth = getDouble("mobs.zombified_piglin.attributes.max_health", zombifiedPiglinMaxHealth); zombifiedPiglinSpawnReinforcements = getDouble("mobs.zombified_piglin.attributes.spawn_reinforcements", zombifiedPiglinSpawnReinforcements); @@ -265,5 +265,4 @@ index ee354de33f436dde6a234c05787a9de28966d7cf..472514b9e6fcbb696ac89ac11b04a6dd + zombifiedPiglinJockeyChance = getDouble("mobs.zombified_piglin.jockey.chance", zombifiedPiglinJockeyChance); + zombifiedPiglinJockeyTryExistingChickens = getBoolean("mobs.zombified_piglin.jockey.try-existing-chickens", zombifiedPiglinJockeyTryExistingChickens); } - - public boolean babiesAreRidable = true; + } diff --git a/patches/server/0065-Add-phantom-spawning-options.patch b/patches/server/0065-Add-phantom-spawning-options.patch index 7e33b1f24..20e0da98b 100644 --- a/patches/server/0065-Add-phantom-spawning-options.patch +++ b/patches/server/0065-Add-phantom-spawning-options.patch @@ -40,10 +40,10 @@ index bc7648dbc132551dc6591ab49a1919a623c30f60..5b880677c895d0e747a1ed6a380ae356 for (int l = 0; l < k; ++l) { // Paper start diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 472514b9e6fcbb696ac89ac11b04a6ddc84cfb7c..fa7bafbba960f987f4dac7a12fd3014efa8eebdb 100644 +index df8f8dcf6e47710b289df1996b571781009c9c00..930f6267cd90ebaee1a5819bcb67f81528692377 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -820,6 +820,12 @@ public class PurpurWorldConfig { +@@ -1067,6 +1067,12 @@ public class PurpurWorldConfig { public String phantomAttackDamage = "6 + size"; public Map phantomMaxHealthCache = new HashMap<>(); public Map phantomAttackDamageCache = new HashMap<>(); @@ -54,9 +54,9 @@ index 472514b9e6fcbb696ac89ac11b04a6ddc84cfb7c..fa7bafbba960f987f4dac7a12fd3014e + public int phantomSpawnMinPerAttempt = 1; + public int phantomSpawnMaxPerAttempt = -1; private void phantomSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.phantom.attributes.max-health", Double.parseDouble(phantomMaxHealth)); -@@ -834,6 +840,12 @@ public class PurpurWorldConfig { + phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); + phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); +@@ -1088,6 +1094,12 @@ public class PurpurWorldConfig { phantomAttackDamage = getString("mobs.phantom.attributes.attack_damage", phantomAttackDamage); phantomMaxHealthCache.clear(); phantomAttackDamageCache.clear(); @@ -68,4 +68,4 @@ index 472514b9e6fcbb696ac89ac11b04a6ddc84cfb7c..fa7bafbba960f987f4dac7a12fd3014e + phantomSpawnMaxPerAttempt = getInt("mobs.phantom.spawn.per-attempt.max", phantomSpawnMaxPerAttempt); } - public double pigMaxHealth = 10.0D; + public boolean pigRidable = false; diff --git a/patches/server/0072-Squid-EAR-immunity.patch b/patches/server/0072-Squid-EAR-immunity.patch index 303184a54..a12ea6237 100644 --- a/patches/server/0072-Squid-EAR-immunity.patch +++ b/patches/server/0072-Squid-EAR-immunity.patch @@ -5,27 +5,27 @@ Subject: [PATCH] Squid EAR immunity diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e62c71804a0595574e49cd08ce11eee52eab7479..31ff1a1e9f57f6d5bef77dc1038b5bc51a53ac6f 100644 +index e31a46078056a559bfbdecd8d86b974bf372273e..8c2241cd2670ff4d945d3953dcc227cc63d5b7e0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1097,6 +1097,7 @@ public class PurpurWorldConfig { - } - +@@ -1449,6 +1449,7 @@ public class PurpurWorldConfig { + public boolean squidRidable = false; + public boolean squidControllable = true; public double squidMaxHealth = 10.0D; + public boolean squidImmuneToEAR = true; private void squidSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.squid.attributes.max-health", squidMaxHealth); -@@ -1104,6 +1105,7 @@ public class PurpurWorldConfig { + squidRidable = getBoolean("mobs.squid.ridable", squidRidable); + squidControllable = getBoolean("mobs.squid.controllable", squidControllable); +@@ -1458,6 +1459,7 @@ public class PurpurWorldConfig { set("mobs.squid.attributes.max_health", oldValue); } squidMaxHealth = getDouble("mobs.squid.attributes.max_health", squidMaxHealth); + squidImmuneToEAR = getBoolean("mobs.squid.immune-to-EAR", squidImmuneToEAR); } - public double spiderMaxHealth = 16.0D; + public boolean spiderRidable = false; diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java -index ea978171f89ac467b235f66fd539b957ba73e371..532a57c612891420a9d51b425504e46ca751b760 100644 +index cd2ec0b11f74e2b17f74ebb83f4e8b183f5b890e..17f99670d7e3dfb4a2863722eedc60dcfd73729d 100644 --- a/src/main/java/org/spigotmc/ActivationRange.java +++ b/src/main/java/org/spigotmc/ActivationRange.java @@ -15,6 +15,7 @@ import net.minecraft.world.entity.ambient.AmbientCreature; @@ -40,7 +40,7 @@ index ea978171f89ac467b235f66fd539b957ba73e371..532a57c612891420a9d51b425504e46c */ public static boolean checkIfActive(Entity entity) { -+ if (entity.level.purpurConfig.squidImmuneToEAR && entity instanceof Squid) return true; // Purpur ++ if (entity.level().purpurConfig.squidImmuneToEAR && entity instanceof Squid) return true; // Purpur // Never safe to skip fireworks or entities not yet added to chunk if ( entity instanceof FireworkRocketEntity ) { return true; diff --git a/patches/server/0073-Phantoms-burn-in-light.patch b/patches/server/0073-Phantoms-burn-in-light.patch index 60b110b6d..49177a8f6 100644 --- a/patches/server/0073-Phantoms-burn-in-light.patch +++ b/patches/server/0073-Phantoms-burn-in-light.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Phantoms burn in light diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -index 5a44bead0ad10deb4ec7d90c86305ae178632e6c..b230733d72843f3142c26cc7d0e9bf93054fc628 100644 +index cd6a25bb101555d6c763a7023d1b05691e671b5f..67aa490540d264775d8a8382cb5922f365ca6913 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java @@ -49,6 +49,7 @@ public class Phantom extends FlyingMob implements Enemy { @@ -22,8 +22,8 @@ index 5a44bead0ad10deb4ec7d90c86305ae178632e6c..b230733d72843f3142c26cc7d0e9bf93 public void aiStep() { - if (this.isAlive() && shouldBurnInDay && this.isSunBurnTick()) { // Paper - Configurable Burning + // Purpur start -+ boolean burnFromDaylight = this.shouldBurnInDay && this.level.purpurConfig.phantomBurnInDaylight; -+ boolean burnFromLightSource = this.level.purpurConfig.phantomBurnInLight > 0 && this.level.getMaxLocalRawBrightness(blockPosition()) >= this.level.purpurConfig.phantomBurnInLight; ++ boolean burnFromDaylight = this.shouldBurnInDay && this.level().purpurConfig.phantomBurnInDaylight; ++ boolean burnFromLightSource = this.level().purpurConfig.phantomBurnInLight > 0 && this.level.getMaxLocalRawBrightness(blockPosition()) >= this.level().purpurConfig.phantomBurnInLight; + if (this.isAlive() && (burnFromDaylight || burnFromLightSource)) { // Paper - Configurable Burning + if (getRider() == null || !this.isControllable()) + // Purpur end @@ -35,9 +35,9 @@ index 5a44bead0ad10deb4ec7d90c86305ae178632e6c..b230733d72843f3142c26cc7d0e9bf93 } else if (!entityliving.isAlive()) { return false; + // Purpur start -+ } else if (level.purpurConfig.phantomBurnInLight > 0 && level.getLightEmission(new BlockPos(Phantom.this)) >= level.purpurConfig.phantomBurnInLight) { ++ } else if (level().purpurConfig.phantomBurnInLight > 0 && level.getLightEmission(new BlockPos(Phantom.this)) >= level().purpurConfig.phantomBurnInLight) { + return false; -+ } else if (level.purpurConfig.phantomIgnorePlayersWithTorch && (TORCH.test(entityliving.getItemInHand(net.minecraft.world.InteractionHand.MAIN_HAND)) || TORCH.test(entityliving.getItemInHand(net.minecraft.world.InteractionHand.OFF_HAND)))) { ++ } else if (level().purpurConfig.phantomIgnorePlayersWithTorch && (TORCH.test(entityliving.getItemInHand(net.minecraft.world.InteractionHand.MAIN_HAND)) || TORCH.test(entityliving.getItemInHand(net.minecraft.world.InteractionHand.OFF_HAND)))) { + return false; + // Purpur end } else { @@ -47,15 +47,15 @@ index 5a44bead0ad10deb4ec7d90c86305ae178632e6c..b230733d72843f3142c26cc7d0e9bf93 this.nextScanTick = reducedTickDelay(60); List list = Phantom.this.level().getNearbyPlayers(this.attackTargeting, Phantom.this, Phantom.this.getBoundingBox().inflate(16.0D, 64.0D, 16.0D)); -+ if (level.purpurConfig.phantomIgnorePlayersWithTorch) list.removeIf(human -> TORCH.test(human.getItemInHand(net.minecraft.world.InteractionHand.MAIN_HAND)) || TORCH.test(human.getItemInHand(net.minecraft.world.InteractionHand.OFF_HAND)));// Purpur ++ if (level().purpurConfig.phantomIgnorePlayersWithTorch) list.removeIf(human -> TORCH.test(human.getItemInHand(net.minecraft.world.InteractionHand.MAIN_HAND)) || TORCH.test(human.getItemInHand(net.minecraft.world.InteractionHand.OFF_HAND)));// Purpur if (!list.isEmpty()) { list.sort(Comparator.comparing((Entity e) -> { return e.getY(); }).reversed()); // CraftBukkit - decompile error Iterator iterator = list.iterator(); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 31ff1a1e9f57f6d5bef77dc1038b5bc51a53ac6f..4f5f144127787b5deaca89f5fa97551c8caf4c28 100644 +index 8c2241cd2670ff4d945d3953dcc227cc63d5b7e0..93aaa9d4413e10af4cb1fca15bc9627a7ded3955 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -875,6 +875,9 @@ public class PurpurWorldConfig { +@@ -1122,6 +1122,9 @@ public class PurpurWorldConfig { public double phantomSpawnLocalDifficultyChance = 3.0D; public int phantomSpawnMinPerAttempt = 1; public int phantomSpawnMaxPerAttempt = -1; @@ -63,9 +63,9 @@ index 31ff1a1e9f57f6d5bef77dc1038b5bc51a53ac6f..4f5f144127787b5deaca89f5fa97551c + public boolean phantomIgnorePlayersWithTorch = false; + public boolean phantomBurnInDaylight = true; private void phantomSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.phantom.attributes.max-health", Double.parseDouble(phantomMaxHealth)); -@@ -895,6 +898,9 @@ public class PurpurWorldConfig { + phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); + phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); +@@ -1149,6 +1152,9 @@ public class PurpurWorldConfig { phantomSpawnLocalDifficultyChance = getDouble("mobs.phantom.spawn.local-difficulty-chance", phantomSpawnLocalDifficultyChance); phantomSpawnMinPerAttempt = getInt("mobs.phantom.spawn.per-attempt.min", phantomSpawnMinPerAttempt); phantomSpawnMaxPerAttempt = getInt("mobs.phantom.spawn.per-attempt.max", phantomSpawnMaxPerAttempt); @@ -74,4 +74,4 @@ index 31ff1a1e9f57f6d5bef77dc1038b5bc51a53ac6f..4f5f144127787b5deaca89f5fa97551c + phantomIgnorePlayersWithTorch = getBoolean("mobs.phantom.ignore-players-with-torch", phantomIgnorePlayersWithTorch); } - public double pigMaxHealth = 10.0D; + public boolean pigRidable = false; diff --git a/patches/server/0074-Configurable-villager-breeding.patch b/patches/server/0074-Configurable-villager-breeding.patch index 6a5ed0ea2..aab7abef5 100644 --- a/patches/server/0074-Configurable-villager-breeding.patch +++ b/patches/server/0074-Configurable-villager-breeding.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configurable villager breeding diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index e258d5b83e5cb517b9fe2e2818391f0666cacd84..26d7b7de2dc2b59224311bc9541a5f0f0f386277 100644 +index 813b9708d218589afaaa2d0578affcc78f0c075f..52a84f354cc51b3ca875756514588b2e6309fc25 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java @@ -779,7 +779,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @@ -13,27 +13,27 @@ index e258d5b83e5cb517b9fe2e2818391f0666cacd84..26d7b7de2dc2b59224311bc9541a5f0f @Override public boolean canBreed() { - return this.foodLevel + this.countFoodPointsInInventory() >= 12 && !this.isSleeping() && this.getAge() == 0; -+ return this.level.purpurConfig.villagerCanBreed && this.foodLevel + this.countFoodPointsInInventory() >= 12 && !this.isSleeping() && this.getAge() == 0; // Purpur ++ return this.level().purpurConfig.villagerCanBreed && this.foodLevel + this.countFoodPointsInInventory() >= 12 && !this.isSleeping() && this.getAge() == 0; // Purpur } private boolean hungry() { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 4f5f144127787b5deaca89f5fa97551c8caf4c28..da232210c18f9389dd51a30f4bf72b4e913513c2 100644 +index 93aaa9d4413e10af4cb1fca15bc9627a7ded3955..a5d7a2e70068b08b49e7ccddbe222ca808f693b7 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1201,6 +1201,7 @@ public class PurpurWorldConfig { +@@ -1607,6 +1607,7 @@ public class PurpurWorldConfig { public double villagerMaxHealth = 20.0D; public boolean villagerFollowEmeraldBlock = false; public boolean villagerCanBeLeashed = false; + public boolean villagerCanBreed = true; private void villagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.villager.attributes.max-health", villagerMaxHealth); -@@ -1210,6 +1211,7 @@ public class PurpurWorldConfig { + villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); + villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); +@@ -1619,6 +1620,7 @@ public class PurpurWorldConfig { villagerMaxHealth = getDouble("mobs.villager.attributes.max_health", villagerMaxHealth); villagerFollowEmeraldBlock = getBoolean("mobs.villager.follow-emerald-blocks", villagerFollowEmeraldBlock); villagerCanBeLeashed = getBoolean("mobs.villager.can-be-leashed", villagerCanBeLeashed); + villagerCanBreed = getBoolean("mobs.villager.can-breed", villagerCanBreed); } - public double vindicatorMaxHealth = 24.0D; + public boolean vindicatorRidable = false; diff --git a/patches/server/0076-Totems-work-in-inventory.patch b/patches/server/0076-Totems-work-in-inventory.patch index 5766cdb34..f1656a379 100644 --- a/patches/server/0076-Totems-work-in-inventory.patch +++ b/patches/server/0076-Totems-work-in-inventory.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Totems work in inventory diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 637d90f2f5e9f8807516a757ef82d5b2014c752b..1d0d22c9d3b8c907502b8fb044ebf8c5c49f6885 100644 +index 20b3b2deae7b72cc16f5e47ad73fab4d9779d047..27df4e881e850a73947651ce7ad98df5159f4c1c 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -1592,6 +1592,18 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -13,7 +13,7 @@ index 637d90f2f5e9f8807516a757ef82d5b2014c752b..1d0d22c9d3b8c907502b8fb044ebf8c5 } + // Purpur start -+ if (level.purpurConfig.totemOfUndyingWorksInInventory && this instanceof ServerPlayer player && (itemstack == null || itemstack.getItem() != Items.TOTEM_OF_UNDYING) && player.getBukkitEntity().hasPermission("purpur.inventory_totem")) { ++ if (level().purpurConfig.totemOfUndyingWorksInInventory && this instanceof ServerPlayer player && (itemstack == null || itemstack.getItem() != Items.TOTEM_OF_UNDYING) && player.getBukkitEntity().hasPermission("purpur.inventory_totem")) { + for (ItemStack item : player.getInventory().items) { + if (item.getItem() == Items.TOTEM_OF_UNDYING) { + itemstack1 = item; @@ -28,7 +28,7 @@ index 637d90f2f5e9f8807516a757ef82d5b2014c752b..1d0d22c9d3b8c907502b8fb044ebf8c5 EntityResurrectEvent event = new EntityResurrectEvent((org.bukkit.entity.LivingEntity) this.getBukkitEntity(), handSlot); event.setCancelled(itemstack == null); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index bb136d077690654a8fa62a2aad73134487d07bd9..37f72c2812c8041a36fd7ec117e9274a8f2817c0 100644 +index 1a880d0a1235fc223ca3a84e2695cd8c0dccfdee..e59f52a32f6300f5d2048a27bfa590f26432cdd0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -247,6 +247,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0077-Add-vindicator-johnny-spawn-chance.patch b/patches/server/0077-Add-vindicator-johnny-spawn-chance.patch index 09dce36c5..5899a9c50 100644 --- a/patches/server/0077-Add-vindicator-johnny-spawn-chance.patch +++ b/patches/server/0077-Add-vindicator-johnny-spawn-chance.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add vindicator johnny spawn chance diff --git a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java -index fdbcf72f35b6801fed4db127710a72579c823fe1..db832e9c8287d0f62db65ff3a2d2625541758762 100644 +index 40858ac2a9b58108472748d0ef2c2fd5ef5cfd98..2a5b6b94b15bf066b5722e7a4f782bc87f9debf4 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java @@ -154,6 +154,12 @@ public class Vindicator extends AbstractIllager { @@ -14,7 +14,7 @@ index fdbcf72f35b6801fed4db127710a72579c823fe1..db832e9c8287d0f62db65ff3a2d26255 this.populateDefaultEquipmentEnchantments(randomSource, difficulty); + // Purpur start + Level level = world.getMinecraftWorld(); -+ if (level.purpurConfig.vindicatorJohnnySpawnChance > 0D && random.nextDouble() <= level.purpurConfig.vindicatorJohnnySpawnChance) { ++ if (level().purpurConfig.vindicatorJohnnySpawnChance > 0D && random.nextDouble() <= level().purpurConfig.vindicatorJohnnySpawnChance) { + setCustomName(Component.translatable("Johnny")); + } + // Purpur end @@ -22,22 +22,22 @@ index fdbcf72f35b6801fed4db127710a72579c823fe1..db832e9c8287d0f62db65ff3a2d26255 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 37f72c2812c8041a36fd7ec117e9274a8f2817c0..2af26908978d364e24a6ebbd2ac3a7456f2d0cc3 100644 +index e59f52a32f6300f5d2048a27bfa590f26432cdd0..66162ef0ed12cd0bc4c705758dbbca19c3952d19 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1222,6 +1222,7 @@ public class PurpurWorldConfig { - } - +@@ -1634,6 +1634,7 @@ public class PurpurWorldConfig { + public boolean vindicatorRidableInWater = true; + public boolean vindicatorControllable = true; public double vindicatorMaxHealth = 24.0D; + public double vindicatorJohnnySpawnChance = 0D; private void vindicatorSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.vindicator.attributes.max-health", vindicatorMaxHealth); -@@ -1229,6 +1230,7 @@ public class PurpurWorldConfig { + vindicatorRidable = getBoolean("mobs.vindicator.ridable", vindicatorRidable); + vindicatorRidableInWater = getBoolean("mobs.vindicator.ridable-in-water", vindicatorRidableInWater); +@@ -1644,6 +1645,7 @@ public class PurpurWorldConfig { set("mobs.vindicator.attributes.max_health", oldValue); } vindicatorMaxHealth = getDouble("mobs.vindicator.attributes.max_health", vindicatorMaxHealth); + vindicatorJohnnySpawnChance = getDouble("mobs.vindicator.johnny.spawn-chance", vindicatorJohnnySpawnChance); } - public double wanderingTraderMaxHealth = 20.0D; + public boolean wanderingTraderRidable = false; diff --git a/patches/server/0079-Dispensers-place-anvils-option.patch b/patches/server/0079-Dispensers-place-anvils-option.patch index 597d345ec..631054912 100644 --- a/patches/server/0079-Dispensers-place-anvils-option.patch +++ b/patches/server/0079-Dispensers-place-anvils-option.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Dispensers place anvils option diff --git a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java -index b4f5dbe9022dd20437c15c4f6fbe2ac06dacbadb..b52a9f05ada86f2d3767dd0d5ba8705e22f105d6 100644 +index b4f5dbe9022dd20437c15c4f6fbe2ac06dacbadb..58ee591dc4c5ae6e02dcff3d49d6a82f68e1ceb7 100644 --- a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java +++ b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java @@ -52,6 +52,7 @@ import net.minecraft.world.item.SpawnEggItem; @@ -25,7 +25,7 @@ index b4f5dbe9022dd20437c15c4f6fbe2ac06dacbadb..b52a9f05ada86f2d3767dd0d5ba8705e + @Override + public ItemStack execute(BlockSource dispenser, ItemStack stack) { + Level level = dispenser.getLevel(); -+ if (!level.purpurConfig.dispenserPlaceAnvils) return super.execute(dispenser, stack); ++ if (!level().purpurConfig.dispenserPlaceAnvils) return super.execute(dispenser, stack); + Direction facing = dispenser.getBlockState().getValue(DispenserBlock.FACING); + BlockPos pos = dispenser.getPos().relative(facing); + BlockState state = level.getBlockState(pos); @@ -41,7 +41,7 @@ index b4f5dbe9022dd20437c15c4f6fbe2ac06dacbadb..b52a9f05ada86f2d3767dd0d5ba8705e static void setEntityPokingOutOfBlock(BlockSource pointer, Entity entity, Direction direction) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 2af26908978d364e24a6ebbd2ac3a7456f2d0cc3..e9275427cc3337091054842558ec22c9bc34b419 100644 +index 66162ef0ed12cd0bc4c705758dbbca19c3952d19..4c04982da44f13600a0410981754ab8fcdad6b7c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -321,8 +321,10 @@ public class PurpurWorldConfig { diff --git a/patches/server/0081-Add-option-to-disable-dolphin-treasure-searching.patch b/patches/server/0081-Add-option-to-disable-dolphin-treasure-searching.patch index e3b6b13be..36bb6fb74 100644 --- a/patches/server/0081-Add-option-to-disable-dolphin-treasure-searching.patch +++ b/patches/server/0081-Add-option-to-disable-dolphin-treasure-searching.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add option to disable dolphin treasure searching diff --git a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java -index d8395f47cdf5ceffc1c65442e9d632847d22cca6..584b812c86d4f7180d971b5ad263c549dec51e61 100644 +index b206686fe55f56b9c4d94a7b54927bf74842b46c..c9bc4eec14f40a31dbbe928f14277b12044c3089 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java +++ b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java @@ -481,6 +481,7 @@ public class Dolphin extends WaterAnimal { @@ -17,22 +17,22 @@ index d8395f47cdf5ceffc1c65442e9d632847d22cca6..584b812c86d4f7180d971b5ad263c549 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 2c7417affdf20fe15303d5f604530a8a3aba0060..ab550704781b799222aa0fe58dfe817ea31222e0 100644 +index 434860a0e72fc7bf808833193bf2ca476892c11b..45ee2548ebb5c41eccada81ffd859be2d97f4cd8 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -522,6 +522,7 @@ public class PurpurWorldConfig { - } - +@@ -594,6 +594,7 @@ public class PurpurWorldConfig { + public float dolphinSpitSpeed = 1.0F; + public float dolphinSpitDamage = 2.0F; public double dolphinMaxHealth = 10.0D; + public boolean dolphinDisableTreasureSearching = false; private void dolphinSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.dolphin.attributes.max-health", dolphinMaxHealth); -@@ -529,6 +530,7 @@ public class PurpurWorldConfig { + dolphinRidable = getBoolean("mobs.dolphin.ridable", dolphinRidable); + dolphinControllable = getBoolean("mobs.dolphin.controllable", dolphinControllable); +@@ -606,6 +607,7 @@ public class PurpurWorldConfig { set("mobs.dolphin.attributes.max_health", oldValue); } dolphinMaxHealth = getDouble("mobs.dolphin.attributes.max_health", dolphinMaxHealth); + dolphinDisableTreasureSearching = getBoolean("mobs.dolphin.disable-treasure-searching", dolphinDisableTreasureSearching); } - public double donkeyMaxHealthMin = 15.0D; + public boolean donkeyRidableInWater = false; diff --git a/patches/server/0083-Stop-squids-floating-on-top-of-water.patch b/patches/server/0083-Stop-squids-floating-on-top-of-water.patch index 61a2a6a82..e569d8dd6 100644 --- a/patches/server/0083-Stop-squids-floating-on-top-of-water.patch +++ b/patches/server/0083-Stop-squids-floating-on-top-of-water.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Stop squids floating on top of water diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index cfef8dec1a96c97bd087ed6dc55eadae4feae079..aba657afb169a5cd563030e08f4c11305bd5a482 100644 +index 0447ed23dd3e09fb887b7d7911846030a4e7fb45..0c18b2b3fcb64aa8c606e0823f365435929fe6f8 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -4292,6 +4292,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -22,17 +22,17 @@ index cfef8dec1a96c97bd087ed6dc55eadae4feae079..aba657afb169a5cd563030e08f4c1130 if (this.touchingUnloadedChunk()) { return false; diff --git a/src/main/java/net/minecraft/world/entity/animal/Squid.java b/src/main/java/net/minecraft/world/entity/animal/Squid.java -index 47842db438bac4c571a11306b0621f30832bbd68..12235bede3232fbe8ffc5ec07cf3e16d5a08517f 100644 +index 42ca9df0735b4f928fbbf1e695d1756f77be52fc..de0a015cc944c36358fc34a3142ecbf9d2a332b5 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Squid.java +++ b/src/main/java/net/minecraft/world/entity/animal/Squid.java @@ -77,6 +77,12 @@ public class Squid extends WaterAnimal { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.squidMaxHealth); } - // Purpur end + @Override + public net.minecraft.world.phys.AABB getAxisForFluidCheck() { + // Stops squids from floating just over the water -+ return super.getAxisForFluidCheck().offsetY(level.purpurConfig.squidOffsetWaterCheck); ++ return super.getAxisForFluidCheck().offsetY(level().purpurConfig.squidOffsetWaterCheck); + } + @Override @@ -54,22 +54,22 @@ index ffc76354ead6937daf366c3d87bcb51d3e4c47f5..5b98d42b5d6bc07265fbb017e51a6281 + // Purpur } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index ab550704781b799222aa0fe58dfe817ea31222e0..489e3f9d068d7987d2a676b3e567929775aeca17 100644 +index 45ee2548ebb5c41eccada81ffd859be2d97f4cd8..6a252d335c5040cad8180b992943dc7041840752 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1122,6 +1122,7 @@ public class PurpurWorldConfig { - +@@ -1474,6 +1474,7 @@ public class PurpurWorldConfig { + public boolean squidControllable = true; public double squidMaxHealth = 10.0D; public boolean squidImmuneToEAR = true; + public double squidOffsetWaterCheck = 0.0D; private void squidSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.squid.attributes.max-health", squidMaxHealth); -@@ -1130,6 +1131,7 @@ public class PurpurWorldConfig { + squidRidable = getBoolean("mobs.squid.ridable", squidRidable); + squidControllable = getBoolean("mobs.squid.controllable", squidControllable); +@@ -1484,6 +1485,7 @@ public class PurpurWorldConfig { } squidMaxHealth = getDouble("mobs.squid.attributes.max_health", squidMaxHealth); squidImmuneToEAR = getBoolean("mobs.squid.immune-to-EAR", squidImmuneToEAR); + squidOffsetWaterCheck = getDouble("mobs.squid.water-offset-check", squidOffsetWaterCheck); } - public double spiderMaxHealth = 16.0D; + public boolean spiderRidable = false; diff --git a/patches/server/0085-Entities-can-use-portals-configuration.patch b/patches/server/0085-Entities-can-use-portals-configuration.patch index 6e84885a7..2c6d239cd 100644 --- a/patches/server/0085-Entities-can-use-portals-configuration.patch +++ b/patches/server/0085-Entities-can-use-portals-configuration.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Entities can use portals configuration diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index aba657afb169a5cd563030e08f4c11305bd5a482..9f213ed6b14c24fd9cb5fefb689d72032a883d09 100644 +index 0c18b2b3fcb64aa8c606e0823f365435929fe6f8..68233db015138b0a615a65eac8c11afc42f7a1c6 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -2999,7 +2999,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -13,7 +13,7 @@ index aba657afb169a5cd563030e08f4c11305bd5a482..9f213ed6b14c24fd9cb5fefb689d7203 if (this.isOnPortalCooldown()) { this.setPortalCooldown(); - } else { -+ } else if (level.purpurConfig.entitiesCanUsePortals || this instanceof ServerPlayer) { // Purpur ++ } else if (level().purpurConfig.entitiesCanUsePortals || this instanceof ServerPlayer) { // Purpur if (!this.level().isClientSide && !pos.equals(this.portalEntrancePos)) { this.portalEntrancePos = pos.immutable(); } @@ -22,12 +22,12 @@ index aba657afb169a5cd563030e08f4c11305bd5a482..9f213ed6b14c24fd9cb5fefb689d7203 public boolean canChangeDimensions() { - return !this.isPassenger() && !this.isVehicle() && isAlive() && valid; // Paper -+ return !this.isPassenger() && !this.isVehicle() && isAlive() && valid && (level.purpurConfig.entitiesCanUsePortals || this instanceof ServerPlayer); // Paper // Purpur ++ return !this.isPassenger() && !this.isVehicle() && isAlive() && valid && (level().purpurConfig.entitiesCanUsePortals || this instanceof ServerPlayer); // Paper // Purpur } public float getBlockExplosionResistance(Explosion explosion, BlockGetter world, BlockPos pos, BlockState blockState, FluidState fluidState, float max) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 489e3f9d068d7987d2a676b3e567929775aeca17..7a4658b2eb4fb785809783dbf30c5abecd32c6d8 100644 +index 6a252d335c5040cad8180b992943dc7041840752..558562f574a31e748710e68a67baa1292d794b30 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -100,6 +100,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0087-Customizable-wither-health-and-healing.patch b/patches/server/0087-Customizable-wither-health-and-healing.patch index 44decf67a..14fe219a5 100644 --- a/patches/server/0087-Customizable-wither-health-and-healing.patch +++ b/patches/server/0087-Customizable-wither-health-and-healing.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Customizable wither health and healing Adds the ability to customize the health of the wither, as well as the amount that it heals, and how often. 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 0ecbee51a48171cad95cc80bd26644774064fead..52f6459b0bfff7991da6cb0deda1b15664c4d00b 100644 +index 45c050f2b9cebfa629c908cb3b91a909489b8ec1..b39a7dfb910e99f04275fa8e246581f5ccc27afa 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 @@ -529,8 +529,10 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob @@ -16,26 +16,26 @@ index 0ecbee51a48171cad95cc80bd26644774064fead..52f6459b0bfff7991da6cb0deda1b156 - if (this.tickCount % 20 == 0) { - this.heal(1.0F, EntityRegainHealthEvent.RegainReason.REGEN); // CraftBukkit + // Purpur start - customizable heal rate and amount -+ if (this.tickCount % level.purpurConfig.witherHealthRegenDelay == 0) { -+ this.heal(level.purpurConfig.witherHealthRegenAmount, EntityRegainHealthEvent.RegainReason.REGEN); // CraftBukkit ++ if (this.tickCount % level().purpurConfig.witherHealthRegenDelay == 0) { ++ this.heal(level().purpurConfig.witherHealthRegenAmount, EntityRegainHealthEvent.RegainReason.REGEN); // CraftBukkit + // Purpur end } this.bossEvent.setProgress(this.getHealth() / this.getMaxHealth()); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 7a4658b2eb4fb785809783dbf30c5abecd32c6d8..0c0c2745a18593ee7da491d0f1b5c0d11aa1a3c4 100644 +index 558562f574a31e748710e68a67baa1292d794b30..09b253836220f0e6de3b0c804ffb34bd6480c809 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1273,6 +1273,8 @@ public class PurpurWorldConfig { - } - +@@ -1713,6 +1713,8 @@ public class PurpurWorldConfig { + public boolean witherControllable = true; + public double witherMaxY = 320D; public double witherMaxHealth = 300.0D; + public float witherHealthRegenAmount = 1.0f; + public int witherHealthRegenDelay = 20; private void witherSettings() { - if (PurpurConfig.version < 8) { - double oldValue = getDouble("mobs.wither.max-health", witherMaxHealth); -@@ -1284,6 +1286,8 @@ public class PurpurWorldConfig { + witherRidable = getBoolean("mobs.wither.ridable", witherRidable); + witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); +@@ -1728,6 +1730,8 @@ public class PurpurWorldConfig { set("mobs.wither.attributes.max_health", oldValue); } witherMaxHealth = getDouble("mobs.wither.attributes.max_health", witherMaxHealth); @@ -43,4 +43,4 @@ index 7a4658b2eb4fb785809783dbf30c5abecd32c6d8..0c0c2745a18593ee7da491d0f1b5c0d1 + witherHealthRegenDelay = getInt("mobs.wither.health-regen-delay", witherHealthRegenDelay); } - public double witherSkeletonMaxHealth = 20.0D; + public boolean witherSkeletonRidable = false; diff --git a/patches/server/0089-Raid-cooldown-setting.patch b/patches/server/0089-Raid-cooldown-setting.patch index d222560ce..b48ee558f 100644 --- a/patches/server/0089-Raid-cooldown-setting.patch +++ b/patches/server/0089-Raid-cooldown-setting.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Raid cooldown setting diff --git a/src/main/java/net/minecraft/world/entity/raid/Raids.java b/src/main/java/net/minecraft/world/entity/raid/Raids.java -index 41457c9f27b18fa2734a6cca297ec5186470e82f..94356e0541f8f4da68211fa533347cc97d4f3518 100644 +index 41457c9f27b18fa2734a6cca297ec5186470e82f..aa095686746ecc252b66670ba541cd243b6f7061 100644 --- a/src/main/java/net/minecraft/world/entity/raid/Raids.java +++ b/src/main/java/net/minecraft/world/entity/raid/Raids.java @@ -28,6 +28,7 @@ import net.minecraft.world.phys.Vec3; @@ -21,7 +21,7 @@ index 41457c9f27b18fa2734a6cca297ec5186470e82f..94356e0541f8f4da68211fa533347cc9 public void tick() { ++this.tick; + // Purpur start -+ if (level.purpurConfig.raidCooldownSeconds != 0 && this.tick % 20 == 0) { ++ if (level().purpurConfig.raidCooldownSeconds != 0 && this.tick % 20 == 0) { + com.google.common.collect.ImmutableMap.copyOf(playerCooldowns).forEach((uuid, i) -> { + if (i < 1) { + playerCooldowns.remove(uuid); @@ -38,18 +38,18 @@ index 41457c9f27b18fa2734a6cca297ec5186470e82f..94356e0541f8f4da68211fa533347cc9 } if (flag) { -+ if (level.purpurConfig.raidCooldownSeconds != 0 && playerCooldowns.containsKey(player.getUUID())) return null; // Purpur ++ if (level().purpurConfig.raidCooldownSeconds != 0 && playerCooldowns.containsKey(player.getUUID())) return null; // Purpur // CraftBukkit start if (!org.bukkit.craftbukkit.event.CraftEventFactory.callRaidTriggerEvent(raid, player)) { player.removeEffect(MobEffects.BAD_OMEN); return null; } -+ if (level.purpurConfig.raidCooldownSeconds != 0) playerCooldowns.put(player.getUUID(), level.purpurConfig.raidCooldownSeconds); // Purpur ++ if (level().purpurConfig.raidCooldownSeconds != 0) playerCooldowns.put(player.getUUID(), level().purpurConfig.raidCooldownSeconds); // Purpur if (!this.raidMap.containsKey(raid.getId())) { this.raidMap.put(raid.getId(), raid); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 88f3a76e1b88d70c781eb04c4c3de627d151e3df..44af2919281fe6afc08401d68ba421e4ea963136 100644 +index 8eed1a2de61066137c8f7404e9156b0c204b4581..917ea564edcf27b727901028f5035a6caddfb08e 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -111,6 +111,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0091-Add-option-to-disable-zombie-aggressiveness-towards-.patch b/patches/server/0091-Add-option-to-disable-zombie-aggressiveness-towards-.patch index a0204d9d8..fadcbd84a 100644 --- a/patches/server/0091-Add-option-to-disable-zombie-aggressiveness-towards-.patch +++ b/patches/server/0091-Add-option-to-disable-zombie-aggressiveness-towards-.patch @@ -20,7 +20,7 @@ index a08c00b8c0488d18be5e182f7892e5ab71d12247..338f693d098b6ab507c30f6411c9a952 ignored.add("goal_selector_1"); ignored.add("goal_selector_2"); diff --git a/src/main/java/net/minecraft/world/entity/monster/Drowned.java b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -index a27a0de6858aa69caefc436aec3827b365d3d00c..59bfc5df56ef7bab39630f69bc69d122fcd1653e 100644 +index 6ec7d0f5e525f9e04b6fa0fb6d4da5fcc22fe653..64acb2e81ef65acb0d41db8b5f7c924c2e2a5e00 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java +++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java @@ -120,7 +120,19 @@ public class Drowned extends Zombie implements RangedAttackMob { @@ -45,7 +45,7 @@ index a27a0de6858aa69caefc436aec3827b365d3d00c..59bfc5df56ef7bab39630f69bc69d122 this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Axolotl.class, true, false)); this.targetSelector.addGoal(5, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, true, false, Turtle.BABY_ON_LAND_SELECTOR)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index a0439eac45376c132f6a1d7142c200e9c925130c..57a1ea56cfc6b0b8fe3a3379c9a602cf46fd8fbd 100644 +index b2b04d7b7bbc400fb66cac385fa754d4fb47c7d9..bd75aa78a7dd437d6fce79a6cb18298184affe75 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java @@ -156,7 +156,19 @@ public class Zombie extends Monster { @@ -70,22 +70,22 @@ index a0439eac45376c132f6a1d7142c200e9c925130c..57a1ea56cfc6b0b8fe3a3379c9a602cf this.targetSelector.addGoal(5, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, true, false, Turtle.BABY_ON_LAND_SELECTOR)); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f6ee6a36d85531b5c39bb49c6b5a97dd7eb06444..f211d89ab4035cb59c2b0aeb0781cfd7261b992b 100644 +index 19ee5b742ea9cab725fd28e86917389f368e3a22..12676dd8b1e9a7de8ed5815a06e3d107ce1244a5 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1381,6 +1381,7 @@ public class PurpurWorldConfig { +@@ -1846,6 +1846,7 @@ public class PurpurWorldConfig { public boolean zombieJockeyOnlyBaby = true; public double zombieJockeyChance = 0.05D; public boolean zombieJockeyTryExistingChickens = true; + public boolean zombieAggressiveTowardsVillagerWhenLagging = true; private void zombieSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.zombie.attributes.max-health", zombieMaxHealth); -@@ -1392,6 +1393,7 @@ public class PurpurWorldConfig { + zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); + zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); +@@ -1860,6 +1861,7 @@ public class PurpurWorldConfig { zombieJockeyOnlyBaby = getBoolean("mobs.zombie.jockey.only-babies", zombieJockeyOnlyBaby); zombieJockeyChance = getDouble("mobs.zombie.jockey.chance", zombieJockeyChance); zombieJockeyTryExistingChickens = getBoolean("mobs.zombie.jockey.try-existing-chickens", zombieJockeyTryExistingChickens); + zombieAggressiveTowardsVillagerWhenLagging = getBoolean("mobs.zombie.aggressive-towards-villager-when-lagging", zombieAggressiveTowardsVillagerWhenLagging); } - public double zombieHorseMaxHealthMin = 15.0D; + public boolean zombieHorseRidableInWater = false; diff --git a/patches/server/0093-Flying-squids-Oh-my.patch b/patches/server/0093-Flying-squids-Oh-my.patch index e52a47e6b..a03a8239c 100644 --- a/patches/server/0093-Flying-squids-Oh-my.patch +++ b/patches/server/0093-Flying-squids-Oh-my.patch @@ -5,31 +5,31 @@ Subject: [PATCH] Flying squids! Oh my! diff --git a/src/main/java/net/minecraft/world/entity/GlowSquid.java b/src/main/java/net/minecraft/world/entity/GlowSquid.java -index aa155ec559e748c9bbb6ccddaa278ea6bba7ac63..277a5868b3fc4bbb472086b4fb50e905b02621ba 100644 +index 730958dab7f074930cdccb88a89aa26e2b6a112b..b1ba0f24dd6f1ec4c60208564e4eb84bdcd457f4 100644 --- a/src/main/java/net/minecraft/world/entity/GlowSquid.java +++ b/src/main/java/net/minecraft/world/entity/GlowSquid.java @@ -41,6 +41,11 @@ public class GlowSquid extends Squid { + this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.glowSquidMaxHealth); } - // Purpur end + @Override + public boolean canFly() { -+ return this.level.purpurConfig.glowSquidsCanFly; ++ return this.level().purpurConfig.glowSquidsCanFly; + } + @Override protected ParticleOptions getInkParticle() { return ParticleTypes.GLOW_SQUID_INK; diff --git a/src/main/java/net/minecraft/world/entity/animal/Squid.java b/src/main/java/net/minecraft/world/entity/animal/Squid.java -index 12235bede3232fbe8ffc5ec07cf3e16d5a08517f..2658be0f3535243b5a434917c9400332246ffcbe 100644 +index de0a015cc944c36358fc34a3142ecbf9d2a332b5..1431d7f295614641c1a5a5197f4bac3fd0cd9d71 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Squid.java +++ b/src/main/java/net/minecraft/world/entity/animal/Squid.java @@ -83,6 +83,15 @@ public class Squid extends WaterAnimal { - return super.getAxisForFluidCheck().offsetY(level.purpurConfig.squidOffsetWaterCheck); + return super.getAxisForFluidCheck().offsetY(level().purpurConfig.squidOffsetWaterCheck); } + public boolean canFly() { -+ return this.level.purpurConfig.squidsCanFly; ++ return this.level().purpurConfig.squidsCanFly; + } + + @Override @@ -58,33 +58,35 @@ index 12235bede3232fbe8ffc5ec07cf3e16d5a08517f..2658be0f3535243b5a434917c9400332 float f1 = Mth.cos(f) * 0.2F; float f2 = -0.1F + this.squid.getRandom().nextFloat() * 0.2F; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f211d89ab4035cb59c2b0aeb0781cfd7261b992b..37b6eb3ad99ffe2216bc1fe991c44cbe7b70bd40 100644 +index 12676dd8b1e9a7de8ed5815a06e3d107ce1244a5..03034444e0a0bbe680dfee0ab735cfad971e4fb5 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -738,8 +738,10 @@ public class PurpurWorldConfig { - } - +@@ -901,10 +901,12 @@ public class PurpurWorldConfig { + public boolean glowSquidRidable = false; + public boolean glowSquidControllable = true; public double glowSquidMaxHealth = 10.0D; + public boolean glowSquidsCanFly = false; private void glowSquidSettings() { + glowSquidRidable = getBoolean("mobs.glow_squid.ridable", glowSquidRidable); + glowSquidControllable = getBoolean("mobs.glow_squid.controllable", glowSquidControllable); glowSquidMaxHealth = getDouble("mobs.glow_squid.attributes.max_health", glowSquidMaxHealth); + glowSquidsCanFly = getBoolean("mobs.glow_squid.can-fly", glowSquidsCanFly); } - public double goatMaxHealth = 10.0D; -@@ -1181,6 +1183,7 @@ public class PurpurWorldConfig { + public boolean goatRidable = false; +@@ -1533,6 +1535,7 @@ public class PurpurWorldConfig { public double squidMaxHealth = 10.0D; public boolean squidImmuneToEAR = true; public double squidOffsetWaterCheck = 0.0D; + public boolean squidsCanFly = false; private void squidSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.squid.attributes.max-health", squidMaxHealth); -@@ -1190,6 +1193,7 @@ public class PurpurWorldConfig { + squidRidable = getBoolean("mobs.squid.ridable", squidRidable); + squidControllable = getBoolean("mobs.squid.controllable", squidControllable); +@@ -1544,6 +1547,7 @@ public class PurpurWorldConfig { squidMaxHealth = getDouble("mobs.squid.attributes.max_health", squidMaxHealth); squidImmuneToEAR = getBoolean("mobs.squid.immune-to-EAR", squidImmuneToEAR); squidOffsetWaterCheck = getDouble("mobs.squid.water-offset-check", squidOffsetWaterCheck); + squidsCanFly = getBoolean("mobs.squid.can-fly", squidsCanFly); } - public double spiderMaxHealth = 16.0D; + public boolean spiderRidable = false; diff --git a/patches/server/0098-Arrows-should-not-reset-despawn-counter.patch b/patches/server/0098-Arrows-should-not-reset-despawn-counter.patch index 7d7437e22..7aaf175ea 100644 --- a/patches/server/0098-Arrows-should-not-reset-despawn-counter.patch +++ b/patches/server/0098-Arrows-should-not-reset-despawn-counter.patch @@ -7,7 +7,7 @@ This prevents keeping arrows alive indefinitely (such as when the block the arrow is stuck in gets removed, like a piston head going up/down) diff --git a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java -index 7226be19248a1ffb8ff2c89b55882529d33a6c0c..57f89ff7ddcd738100f296ae7a21b3240ab374de 100644 +index 7226be19248a1ffb8ff2c89b55882529d33a6c0c..4f98d7f755ad692dd9589134524a604ec747d5d9 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java +++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java @@ -312,7 +312,7 @@ public abstract class AbstractArrow extends Projectile { @@ -15,12 +15,12 @@ index 7226be19248a1ffb8ff2c89b55882529d33a6c0c..57f89ff7ddcd738100f296ae7a21b324 this.setDeltaMovement(vec3d.multiply((double) (this.random.nextFloat() * 0.2F), (double) (this.random.nextFloat() * 0.2F), (double) (this.random.nextFloat() * 0.2F))); - this.life = 0; -+ if (this.level.purpurConfig.arrowMovementResetsDespawnCounter) this.life = 0; // Purpur - do not reset despawn counter ++ if (this.level().purpurConfig.arrowMovementResetsDespawnCounter) this.life = 0; // Purpur - do not reset despawn counter } @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 4d14c68c3d5a5ee8070a678740283c5b2938b7bf..9613301106d4f5ef9121400f8a32205428b6f4bf 100644 +index 2589a64e795b69b2c9ace041202567f7959df32b..a0c82e8b354318fc2795432beb8b88f619e96dc4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -103,6 +103,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0100-Add-adjustable-breeding-cooldown-to-config.patch b/patches/server/0100-Add-adjustable-breeding-cooldown-to-config.patch index 6fcd81b4c..ad10e6876 100644 --- a/patches/server/0100-Add-adjustable-breeding-cooldown-to-config.patch +++ b/patches/server/0100-Add-adjustable-breeding-cooldown-to-config.patch @@ -104,7 +104,7 @@ index 8673d325bd866704ae90ac31eb54f78097eac952..10cff85dd4a59558dd487a3c5c7871a0 this.world = new CraftWorld((ServerLevel) this, gen, biomeProvider, env); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 90c9d40009d2e93732110915447190b81c902393..1e1cfe78113742ea865ca56d5bbf01483d2e0a2c 100644 +index 538055ccc9db86b41f204da91061807a637e6175..25976e5d003d61595db1292b294364c0a2f188b2 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -117,6 +117,7 @@ public class PurpurWorldConfig { @@ -124,13 +124,13 @@ index 90c9d40009d2e93732110915447190b81c902393..1e1cfe78113742ea865ca56d5bbf0148 public int daytimeTicks = 12000; diff --git a/src/main/java/org/purpurmc/purpur/command/PurpurCommand.java b/src/main/java/org/purpurmc/purpur/command/PurpurCommand.java -index afdf04f8b22ad0b7c0b41675e44687b49c2f86d6..2621e54879e9ab0029a875f1d09eee67878b90d5 100644 +index 173b6bba1c8eb4c6c6ab55cad478db7c4c91fd75..e1e2a010bb741110aff43690e3aa6be84a5e1bb8 100644 --- a/src/main/java/org/purpurmc/purpur/command/PurpurCommand.java +++ b/src/main/java/org/purpurmc/purpur/command/PurpurCommand.java @@ -49,6 +49,7 @@ public class PurpurCommand extends Command { PurpurConfig.init((File) console.options.valueOf("purpur-settings")); for (ServerLevel level : console.getAllLevels()) { - level.purpurConfig.init(); + level().purpurConfig.init(); + level.resetBreedingCooldowns(); } console.server.reloadCount++; diff --git a/patches/server/0101-Make-entity-breeding-times-configurable.patch b/patches/server/0101-Make-entity-breeding-times-configurable.patch index 38958454b..5d748980e 100644 --- a/patches/server/0101-Make-entity-breeding-times-configurable.patch +++ b/patches/server/0101-Make-entity-breeding-times-configurable.patch @@ -47,80 +47,80 @@ index e3a0a2914db92c95c894174e3815e3eca8d70826..4643c07bc2a26e7886b714514b7a4a05 entityanimal.resetLove(); worldserver.broadcastEntityEvent(this, (byte) 18); 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 5c1d0546c014c3a739311c8a8432e5cd1d8cacbc..e0ab585b708fd58db9688fc4631eaacd79a7c8a3 100644 +index aaf6f76cefc71f714bc9aeddc22149110ee76197..944497d617f3c6474e51fa8146dd9f0c407b1b48 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java @@ -471,6 +471,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.beeMaxHealth); + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.beeMaxHealth); } + @Override + public int getPurpurBreedTime() { -+ return this.level.purpurConfig.beeBreedingTicks; ++ return this.level().purpurConfig.beeBreedingTicks; + } + @Override public int getRemainingPersistentAngerTime() { return (Integer) this.entityData.get(Bee.DATA_REMAINING_ANGER_TIME); diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java -index 845781610102d2ef89522619b8059073cc48b75d..a312e8ff4e4cd3328f0586348a2eff3deaf4617d 100644 +index 49a6ac765e71b311c91cbfd4cf9cde2daa729239..ffa2128b63e5e45c2a41e31a6b8b6e8df0bf9be4 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java @@ -127,6 +127,11 @@ public class Cat extends TamableAnimal implements VariantHolder { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.catMaxHealth); } - // Purpur end + @Override + public int getPurpurBreedTime() { -+ return this.level.purpurConfig.catBreedingTicks; ++ return this.level().purpurConfig.catBreedingTicks; + } + public ResourceLocation getResourceLocation() { return this.getVariant().texture(); } diff --git a/src/main/java/net/minecraft/world/entity/animal/Chicken.java b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -index bf281b45979e16551fe4777ff69fb9ef67d1f839..5ad29dda33d3d7442992b2d47f44d419dda3021b 100644 +index 0f49705e3c7adf033cee9d0746319885c830224f..86b910cbb8d0e19dc9ae53078e730495bf4a3b87 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Chicken.java +++ b/src/main/java/net/minecraft/world/entity/animal/Chicken.java @@ -79,6 +79,11 @@ public class Chicken extends Animal { + } } - // Purpur end + @Override + public int getPurpurBreedTime() { -+ return this.level.purpurConfig.chickenBreedingTicks; ++ return this.level().purpurConfig.chickenBreedingTicks; + } + @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); diff --git a/src/main/java/net/minecraft/world/entity/animal/Cow.java b/src/main/java/net/minecraft/world/entity/animal/Cow.java -index 07d60d3f49a4ed67cc4739baddbb41818b557eb1..fd8ec46ccb691d7f85a7a6bb44e1d0db3703b4d6 100644 +index e5e84c85d2b1c84c7612392bb060f713bd03ddcf..1d17a9fcf80278779703e5cdd390ef0e52f9e437 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java @@ -65,6 +65,11 @@ public class Cow extends Animal { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.cowMaxHealth); } - // Purpur end + @Override + public int getPurpurBreedTime() { -+ return this.level.purpurConfig.cowBreedingTicks; ++ return this.level().purpurConfig.cowBreedingTicks; + } + @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); diff --git a/src/main/java/net/minecraft/world/entity/animal/Fox.java b/src/main/java/net/minecraft/world/entity/animal/Fox.java -index 71fba6fd95f362916e93e89b626dad7c7a72da0b..2232af2cef82014570596c122e11a47d3ae15b9b 100644 +index 7e191d8bb56d0b6591b3a60dfe07004d025eedfa..989dc460d8a21b8e54ff4464998c2b02a6a9dd37 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java @@ -186,6 +186,11 @@ public class Fox extends Animal implements VariantHolder { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.foxMaxHealth); } - // Purpur end + @Override + public int getPurpurBreedTime() { -+ return this.level.purpurConfig.foxBreedingTicks; ++ return this.level().purpurConfig.foxBreedingTicks; + } + @Override @@ -140,60 +140,60 @@ index 71fba6fd95f362916e93e89b626dad7c7a72da0b..2232af2cef82014570596c122e11a47d this.partner.resetLove(); worldserver.addFreshEntityWithPassengers(entityfox, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index 3e798a9d94963dc39ec4a81265fa659b6cfe5db8..6bc5cca1c0896dda25af505e7ff3d68e5e83a54b 100644 +index b27c0f21354a78025f9d1664c560fb8799bced91..7fd50f60aab2fa49a8227f313352a2ee251904c8 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java @@ -85,6 +85,11 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.rabbitMaxHealth); } - // Purpur end + @Override + public int getPurpurBreedTime() { -+ return this.level.purpurConfig.rabbitBreedingTicks; ++ return this.level().purpurConfig.rabbitBreedingTicks; + } + // CraftBukkit start - code from constructor public void initializePathFinderGoals(){ this.setSpeedModifier(0.0D); diff --git a/src/main/java/net/minecraft/world/entity/animal/Sheep.java b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -index 99ed0cf1bb04df94f3ac3b9acd2076a26d43ab1e..fbaa05f3564aeaf31bfaac34ef0112d11869a2c8 100644 +index 3d212b09258b9777079d4bc7ce950f529cdce69e..c3b79c109e895cb4460571c8816b210455126f1d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java +++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java @@ -139,6 +139,11 @@ public class Sheep extends Animal implements Shearable { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.sheepMaxHealth); } - // Purpur end + @Override + public int getPurpurBreedTime() { -+ return this.level.purpurConfig.sheepBreedingTicks; ++ return this.level().purpurConfig.sheepBreedingTicks; + } + @Override protected void registerGoals() { this.eatBlockGoal = new EatBlockGoal(this); diff --git a/src/main/java/net/minecraft/world/entity/animal/Turtle.java b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -index 68b50ffd17e4061c0dba0fb3452cb86014c88e89..726b53822d115fdd6f8911258ff9fc612a4ad54e 100644 +index 39590707049a19f0763efa1083a1813b6f6fff9c..c04e77f8c5c1c8c038a9c8f76546b683691c6b2a 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java +++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java @@ -105,6 +105,11 @@ public class Turtle extends Animal { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.turtleMaxHealth); } - // Purpur end + @Override + public int getPurpurBreedTime() { -+ return this.level.purpurConfig.turtleBreedingTicks; ++ return this.level().purpurConfig.turtleBreedingTicks; + } + public void setHomePos(BlockPos pos) { this.entityData.set(Turtle.HOME_POS, pos.immutable()); // Paper - called with mutablepos... } diff --git a/src/main/java/net/minecraft/world/entity/animal/Wolf.java b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -index d74b9426116770ad42b5ceb85ce9a19fe11db74a..3cd49c57d6dc4b0db31c3ac40447c89ce7e193d7 100644 +index c9ad084ce93eb618261221c7e19450c06fb8a5f5..074f1860e755348a5a3a8e9df383896656cee9af 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java @@ -129,6 +129,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.wolfMaxHealth); } - // Purpur end + @Override + public int getPurpurBreedTime() { -+ return this.level.purpurConfig.wolfBreedingTicks; ++ return this.level().purpurConfig.wolfBreedingTicks; + } + @Override protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index 11f24bf5886ffccd05b8f78ce960fa3c1ad76856..be44bbd6dd3278ae533f07bbd1f4fb3727f177b7 100644 +index 3b70849dca92ee4b0427396de6440f1c29fd724a..8b69eaf846d746e8c4a0d45378d85edcbfa4daf2 100644 --- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java @@ -120,6 +120,11 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder getModelRotationValues() { return this.modelRotationValues; diff --git a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java b/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java -index 95fbdb0e9c59edeb647fe0e5d51d5e6a35152cd6..eb7c9846aa01ec0f5e46c24005110b6e6961e295 100644 +index e2540b7e28c8ba63a0360766a8afa57ac33e336f..d560bb344fefdfb2e8393dc1c5d96ef6d9dbf0e5 100644 --- a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java +++ b/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java @@ -84,6 +84,13 @@ public class Camel extends AbstractHorse implements PlayerRideableJumping, Rider @@ -326,7 +326,7 @@ index 95fbdb0e9c59edeb647fe0e5d51d5e6a35152cd6..eb7c9846aa01ec0f5e46c24005110b6e + // Purpur start + @Override + public int getPurpurBreedTime() { -+ return this.level.purpurConfig.camelBreedingTicks; ++ return this.level().purpurConfig.camelBreedingTicks; + } + // Purpur end + @@ -334,7 +334,7 @@ index 95fbdb0e9c59edeb647fe0e5d51d5e6a35152cd6..eb7c9846aa01ec0f5e46c24005110b6e public void addAdditionalSaveData(CompoundTag nbt) { super.addAdditionalSaveData(nbt); diff --git a/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java b/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java -index b6751a90d5ae004accd08ad23c12e18b7abe2118..2cde912c79656199d31bea2d0c84d72cfb1b2a05 100644 +index 815de16599638bdc4507d8d0bdf941bb6b2aeb92..e60f530f78feebf851382f30b035ec9bcacf22b4 100644 --- a/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java +++ b/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java @@ -136,6 +136,10 @@ public class Frog extends Animal implements VariantHolder { @@ -342,14 +342,14 @@ index b6751a90d5ae004accd08ad23c12e18b7abe2118..2cde912c79656199d31bea2d0c84d72c // Purpur end + public int getPurpurBreedTime() { -+ return this.level.purpurConfig.frogBreedingTicks; ++ return this.level().purpurConfig.frogBreedingTicks; + } + @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -index b1d78fd5674826b021b9f300647b1957daa8ba08..4f7256e6e130be1e84be3b2979b836021460aceb 100644 +index 98f9489623a755778bec2f8977b57882ad2f0b4f..93b15328e00ee81925419aeb54ca2c3873aea924 100644 --- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java +++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java @@ -106,6 +106,11 @@ public class Goat extends Animal { @@ -358,83 +358,83 @@ index b1d78fd5674826b021b9f300647b1957daa8ba08..4f7256e6e130be1e84be3b2979b83602 + @Override + public int getPurpurBreedTime() { -+ return this.level.purpurConfig.goatBreedingTicks; ++ return this.level().purpurConfig.goatBreedingTicks; + } + @Override protected Brain.Provider brainProvider() { return Brain.provider(Goat.MEMORY_TYPES, Goat.SENSOR_TYPES); diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java b/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java -index e0568b3401f42ffd5cfd35da52c0a20d8626776e..a9e04b76c0a3831e6b136136ae15dd9884d68148 100644 +index 365273173e37e74470a1cf511334ea8cb25f8302..6932d0eafbeca9de80728c6b0ae42340d2297ad0 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java @@ -37,6 +37,11 @@ public class Donkey extends AbstractChestedHorse { + return generateSpeed(this.level().purpurConfig.donkeyMovementSpeedMin, this.level().purpurConfig.donkeyMovementSpeedMax); } - // Purpur end + @Override + public int getPurpurBreedTime() { -+ return this.level.purpurConfig.donkeyBreedingTicks; ++ return this.level().purpurConfig.donkeyBreedingTicks; + } + @Override protected SoundEvent getAmbientSound() { return SoundEvents.DONKEY_AMBIENT; diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java b/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java -index 508111fef316d765d284af31263d5c0dda751774..65fec83d96a02bd3b7c9ba034db95a2bb0833dba 100644 +index 92339f5a07dcb6bf7eb1bce6d584464ebd8430b5..0251ded48eb5bdf96f0e67f6456aa15909c8a4ff 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java @@ -62,6 +62,11 @@ public class Horse extends AbstractHorse implements VariantHolder { + return generateSpeed(this.level().purpurConfig.horseMovementSpeedMin, this.level().purpurConfig.horseMovementSpeedMax); } - // Purpur end + @Override + public int getPurpurBreedTime() { -+ return this.level.purpurConfig.horseBreedingTicks; ++ return this.level().purpurConfig.horseBreedingTicks; + } + @Override protected void randomizeAttributes(RandomSource random) { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue((double)generateMaxHealth(random::nextInt)); diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index 9dbfefa7311d4c0f6805fce24429bec2739c6c49..80a7bc90fb4040afd2f7f0b19f5f6dbb6f9d13e8 100644 +index 071089e3ec438c323ea715e74911df4a465a7017..5f7e564154bccd1329ad1966a8ce388282107183 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java @@ -138,6 +138,11 @@ public class Llama extends AbstractChestedHorse implements VariantHolder type, LevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { BlockPos.MutableBlockPos blockposition_mutableblockposition = pos.mutable(); diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index 419377b795f88a8ab67e048e78292a1387ca13e1..35f7f7c75c740760f95eeaef91287a6a0ec3c3cc 100644 +index 853fe631a7d665e2379296c89e433e761495a814..ae4d404b837da202e52d246dabfc00c8803e0260 100644 --- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java @@ -89,6 +89,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.hoglinMaxHealth); } - // Purpur end + @Override + public int getPurpurBreedTime() { -+ return this.level.purpurConfig.hoglinBreedingTicks; ++ return this.level().purpurConfig.hoglinBreedingTicks; + } + @Override public boolean canBeLeashed(Player player) { return !this.isLeashed(); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 1e1cfe78113742ea865ca56d5bbf01483d2e0a2c..0eda8243f19af580e6ca20bf1583e0f4d6c5504f 100644 +index 25976e5d003d61595db1292b294364c0a2f188b2..8223c4c0c24dc222fd4dad216c1b2b7daa98305f 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -480,8 +480,10 @@ public class PurpurWorldConfig { - } - +@@ -502,10 +502,12 @@ public class PurpurWorldConfig { + public boolean axolotlRidable = false; + public boolean axolotlControllable = true; public double axolotlMaxHealth = 14.0D; + public int axolotlBreedingTicks = 6000; private void axolotlSettings() { + axolotlRidable = getBoolean("mobs.axolotl.ridable", axolotlRidable); + axolotlControllable = getBoolean("mobs.axolotl.controllable", axolotlControllable); axolotlMaxHealth = getDouble("mobs.axolotl.attributes.max_health", axolotlMaxHealth); + axolotlBreedingTicks = getInt("mobs.axolotl.breeding-delay-ticks", axolotlBreedingTicks); } - public double batMaxHealth = 6.0D; -@@ -509,6 +511,7 @@ public class PurpurWorldConfig { - } - + public boolean batRidable = false; +@@ -545,6 +547,7 @@ public class PurpurWorldConfig { + public boolean beeControllable = true; + public double beeMaxY = 320D; public double beeMaxHealth = 10.0D; + public int beeBreedingTicks = 6000; private void beeSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.bee.attributes.max-health", beeMaxHealth); -@@ -516,6 +519,7 @@ public class PurpurWorldConfig { + beeRidable = getBoolean("mobs.bee.ridable", beeRidable); + beeRidableInWater = getBoolean("mobs.bee.ridable-in-water", beeRidableInWater); +@@ -556,6 +559,7 @@ public class PurpurWorldConfig { set("mobs.bee.attributes.max_health", oldValue); } beeMaxHealth = getDouble("mobs.bee.attributes.max_health", beeMaxHealth); + beeBreedingTicks = getInt("mobs.bee.breeding-delay-ticks", beeBreedingTicks); } - public double blazeMaxHealth = 20.0D; -@@ -528,6 +532,7 @@ public class PurpurWorldConfig { - blazeMaxHealth = getDouble("mobs.blaze.attributes.max_health", blazeMaxHealth); - } - -+ public int camelBreedingTicks = 6000; - public double camelMaxHealthMin = 32.0D; - public double camelMaxHealthMax = 32.0D; - public double camelJumpStrengthMin = 0.42D; -@@ -541,12 +546,14 @@ public class PurpurWorldConfig { - camelJumpStrengthMax = getDouble("mobs.camel.attributes.jump_strength.max", camelJumpStrengthMax); - camelMovementSpeedMin = getDouble("mobs.camel.attributes.movement_speed.min", camelMovementSpeedMin); - camelMovementSpeedMax = getDouble("mobs.camel.attributes.movement_speed.max", camelMovementSpeedMax); -+ camelBreedingTicks = getInt("mobs.camel.breeding-delay-ticks", camelBreedingTicks); - } - - public double catMaxHealth = 10.0D; + public boolean blazeRidable = false; +@@ -583,6 +587,7 @@ public class PurpurWorldConfig { public int catSpawnDelay = 1200; public int catSpawnSwampHutScanRange = 16; public int catSpawnVillageScanRange = 48; + public int catBreedingTicks = 6000; private void catSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.cat.attributes.max-health", catMaxHealth); -@@ -557,6 +564,7 @@ public class PurpurWorldConfig { + catRidable = getBoolean("mobs.cat.ridable", catRidable); + catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); +@@ -596,6 +601,7 @@ public class PurpurWorldConfig { catSpawnDelay = getInt("mobs.cat.spawn-delay", catSpawnDelay); catSpawnSwampHutScanRange = getInt("mobs.cat.scan-range-for-other-cats.swamp-hut", catSpawnSwampHutScanRange); catSpawnVillageScanRange = getInt("mobs.cat.scan-range-for-other-cats.village", catSpawnVillageScanRange); + catBreedingTicks = getInt("mobs.cat.breeding-delay-ticks", catBreedingTicks); } - public double caveSpiderMaxHealth = 12.0D; -@@ -571,6 +579,7 @@ public class PurpurWorldConfig { - + public boolean caveSpiderRidable = false; +@@ -619,6 +625,7 @@ public class PurpurWorldConfig { + public boolean chickenControllable = true; public double chickenMaxHealth = 4.0D; public boolean chickenRetaliate = false; + public int chickenBreedingTicks = 6000; private void chickenSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.chicken.attributes.max-health", chickenMaxHealth); -@@ -579,6 +588,7 @@ public class PurpurWorldConfig { + chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); + chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); +@@ -630,6 +637,7 @@ public class PurpurWorldConfig { } chickenMaxHealth = getDouble("mobs.chicken.attributes.max_health", chickenMaxHealth); chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate); + chickenBreedingTicks = getInt("mobs.chicken.breeding-delay-ticks", chickenBreedingTicks); } - public double codMaxHealth = 3.0D; -@@ -593,6 +603,7 @@ public class PurpurWorldConfig { - + public boolean codRidable = false; +@@ -651,6 +659,7 @@ public class PurpurWorldConfig { + public boolean cowControllable = true; public double cowMaxHealth = 10.0D; public int cowFeedMushrooms = 0; + public int cowBreedingTicks = 6000; private void cowSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.cow.attributes.max-health", cowMaxHealth); -@@ -601,6 +612,7 @@ public class PurpurWorldConfig { + cowRidable = getBoolean("mobs.cow.ridable", cowRidable); + cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); +@@ -662,6 +671,7 @@ public class PurpurWorldConfig { } cowMaxHealth = getDouble("mobs.cow.attributes.max_health", cowMaxHealth); cowFeedMushrooms = getInt("mobs.cow.feed-mushrooms-for-mooshroom", cowFeedMushrooms); + cowBreedingTicks = getInt("mobs.cow.breeding-delay-ticks", cowBreedingTicks); } - public double creeperMaxHealth = 20.0D; -@@ -635,6 +647,7 @@ public class PurpurWorldConfig { + public boolean creeperRidable = false; +@@ -713,6 +723,7 @@ public class PurpurWorldConfig { public double donkeyJumpStrengthMax = 0.5D; public double donkeyMovementSpeedMin = 0.175D; public double donkeyMovementSpeedMax = 0.175D; + public int donkeyBreedingTicks = 6000; private void donkeySettings() { + donkeyRidableInWater = getBoolean("mobs.donkey.ridable-in-water", donkeyRidableInWater); if (PurpurConfig.version < 10) { - double oldMin = getDouble("mobs.donkey.attributes.max-health.min", donkeyMaxHealthMin); -@@ -649,6 +662,7 @@ public class PurpurWorldConfig { +@@ -728,6 +739,7 @@ public class PurpurWorldConfig { donkeyJumpStrengthMax = getDouble("mobs.donkey.attributes.jump_strength.max", donkeyJumpStrengthMax); donkeyMovementSpeedMin = getDouble("mobs.donkey.attributes.movement_speed.min", donkeyMovementSpeedMin); donkeyMovementSpeedMax = getDouble("mobs.donkey.attributes.movement_speed.max", donkeyMovementSpeedMax); + donkeyBreedingTicks = getInt("mobs.donkey.breeding-delay-ticks", donkeyBreedingTicks); } - public double drownedMaxHealth = 20.0D; -@@ -729,6 +743,7 @@ public class PurpurWorldConfig { + public boolean drownedRidable = false; +@@ -760,6 +772,7 @@ public class PurpurWorldConfig { + public double camelJumpStrengthMax = 0.42D; + public double camelMovementSpeedMin = 0.09D; + public double camelMovementSpeedMax = 0.09D; ++ public int camelBreedingTicks = 6000; + private void camelSettings() { + camelMaxHealthMin = getDouble("mobs.camel.attributes.max_health.min", camelMaxHealthMin); + camelMaxHealthMax = getDouble("mobs.camel.attributes.max_health.max", camelMaxHealthMax); +@@ -767,6 +780,7 @@ public class PurpurWorldConfig { + camelJumpStrengthMax = getDouble("mobs.camel.attributes.jump_strength.max", camelJumpStrengthMax); + camelMovementSpeedMin = getDouble("mobs.camel.attributes.movement_speed.min", camelMovementSpeedMin); + camelMovementSpeedMax = getDouble("mobs.camel.attributes.movement_speed.max", camelMovementSpeedMax); ++ camelBreedingTicks = getInt("mobs.camel.breeding-delay-ticks", camelBreedingTicks); + } + public boolean elderGuardianRidable = false; +@@ -862,6 +876,7 @@ public class PurpurWorldConfig { + public boolean foxControllable = true; public double foxMaxHealth = 10.0D; public boolean foxTypeChangesWithTulips = false; + public int foxBreedingTicks = 6000; private void foxSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.fox.attributes.max-health", foxMaxHealth); -@@ -737,6 +752,12 @@ public class PurpurWorldConfig { + foxRidable = getBoolean("mobs.fox.ridable", foxRidable); + foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); +@@ -873,17 +888,20 @@ public class PurpurWorldConfig { } foxMaxHealth = getDouble("mobs.fox.attributes.max_health", foxMaxHealth); foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); + foxBreedingTicks = getInt("mobs.fox.breeding-delay-ticks", foxBreedingTicks); -+ } -+ + } + + public boolean frogRidable = false; + public boolean frogRidableInWater = true; + public boolean frogControllable = true; + public float frogRidableJumpHeight = 0.65F; + public int frogBreedingTicks = 6000; -+ private void frogSettings() { + private void frogSettings() { + frogRidable = getBoolean("mobs.frog.ridable", frogRidable); + frogRidableInWater = getBoolean("mobs.frog.ridable-in-water", frogRidableInWater); + frogControllable = getBoolean("mobs.frog.controllable", frogControllable); + frogRidableJumpHeight = (float) getDouble("mobs.frog.ridable-jump-height", frogRidableJumpHeight); + frogBreedingTicks = getInt("mobs.frog.breeding-delay-ticks", frogBreedingTicks); } - public double ghastMaxHealth = 10.0D; -@@ -783,8 +804,10 @@ public class PurpurWorldConfig { - } - + public boolean ghastRidable = false; +@@ -951,11 +969,13 @@ public class PurpurWorldConfig { + public boolean goatRidableInWater = true; + public boolean goatControllable = true; public double goatMaxHealth = 10.0D; + public int goatBreedingTicks = 6000; private void goatSettings() { + goatRidable = getBoolean("mobs.goat.ridable", goatRidable); + goatRidableInWater = getBoolean("mobs.goat.ridable-in-water", goatRidableInWater); + goatControllable = getBoolean("mobs.goat.controllable", goatControllable); goatMaxHealth = getDouble("mobs.goat.attributes.max_health", goatMaxHealth); + goatBreedingTicks = getInt("mobs.goat.breeding-delay-ticks", goatBreedingTicks); } - public double guardianMaxHealth = 30.0D; -@@ -798,6 +821,7 @@ public class PurpurWorldConfig { - } - + public boolean guardianRidable = false; +@@ -976,6 +996,7 @@ public class PurpurWorldConfig { + public boolean hoglinRidableInWater = true; + public boolean hoglinControllable = true; public double hoglinMaxHealth = 40.0D; + public int hoglinBreedingTicks = 6000; private void hoglinSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.hoglin.attributes.max-health", hoglinMaxHealth); -@@ -805,6 +829,7 @@ public class PurpurWorldConfig { + hoglinRidable = getBoolean("mobs.hoglin.ridable", hoglinRidable); + hoglinRidableInWater = getBoolean("mobs.hoglin.ridable-in-water", hoglinRidableInWater); +@@ -986,6 +1007,7 @@ public class PurpurWorldConfig { set("mobs.hoglin.attributes.max_health", oldValue); } hoglinMaxHealth = getDouble("mobs.hoglin.attributes.max_health", hoglinMaxHealth); + hoglinBreedingTicks = getInt("mobs.hoglin.breeding-delay-ticks", hoglinBreedingTicks); } - public double horseMaxHealthMin = 15.0D; -@@ -813,6 +838,7 @@ public class PurpurWorldConfig { + public boolean horseRidableInWater = false; +@@ -995,6 +1017,7 @@ public class PurpurWorldConfig { public double horseJumpStrengthMax = 1.0D; public double horseMovementSpeedMin = 0.1125D; public double horseMovementSpeedMax = 0.3375D; + public int horseBreedingTicks = 6000; private void horseSettings() { + horseRidableInWater = getBoolean("mobs.horse.ridable-in-water", horseRidableInWater); if (PurpurConfig.version < 10) { - double oldMin = getDouble("mobs.horse.attributes.max-health.min", horseMaxHealthMin); -@@ -827,6 +853,7 @@ public class PurpurWorldConfig { +@@ -1010,6 +1033,7 @@ public class PurpurWorldConfig { horseJumpStrengthMax = getDouble("mobs.horse.attributes.jump_strength.max", horseJumpStrengthMax); horseMovementSpeedMin = getDouble("mobs.horse.attributes.movement_speed.min", horseMovementSpeedMin); horseMovementSpeedMax = getDouble("mobs.horse.attributes.movement_speed.max", horseMovementSpeedMax); + horseBreedingTicks = getInt("mobs.horse.breeding-delay-ticks", horseBreedingTicks); } - public double huskMaxHealth = 20.0D; -@@ -884,6 +911,7 @@ public class PurpurWorldConfig { + public boolean huskRidable = false; +@@ -1087,6 +1111,7 @@ public class PurpurWorldConfig { public double llamaJumpStrengthMax = 0.5D; public double llamaMovementSpeedMin = 0.175D; public double llamaMovementSpeedMax = 0.175D; @@ -706,222 +720,231 @@ index 1e1cfe78113742ea865ca56d5bbf01483d2e0a2c..0eda8243f19af580e6ca20bf1583e0f4 private void llamaSettings() { llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); -@@ -901,6 +929,7 @@ public class PurpurWorldConfig { +@@ -1107,6 +1132,7 @@ public class PurpurWorldConfig { llamaJumpStrengthMax = getDouble("mobs.llama.attributes.jump_strength.max", llamaJumpStrengthMax); llamaMovementSpeedMin = getDouble("mobs.llama.attributes.movement_speed.min", llamaMovementSpeedMin); llamaMovementSpeedMax = getDouble("mobs.llama.attributes.movement_speed.max", llamaMovementSpeedMax); + llamaBreedingTicks = getInt("mobs.llama.breeding-delay-ticks", llamaBreedingTicks); } - public String magmaCubeMaxHealth = "size * size"; -@@ -920,6 +949,7 @@ public class PurpurWorldConfig { - } - + public boolean magmaCubeRidable = false; +@@ -1135,6 +1161,7 @@ public class PurpurWorldConfig { + public boolean mooshroomRidableInWater = true; + public boolean mooshroomControllable = true; public double mooshroomMaxHealth = 10.0D; + public int mooshroomBreedingTicks = 6000; private void mooshroomSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.mooshroom.attributes.max-health", mooshroomMaxHealth); -@@ -927,6 +957,7 @@ public class PurpurWorldConfig { + mooshroomRidable = getBoolean("mobs.mooshroom.ridable", mooshroomRidable); + mooshroomRidableInWater = getBoolean("mobs.mooshroom.ridable-in-water", mooshroomRidableInWater); +@@ -1145,6 +1172,7 @@ public class PurpurWorldConfig { set("mobs.mooshroom.attributes.max_health", oldValue); } mooshroomMaxHealth = getDouble("mobs.mooshroom.attributes.max_health", mooshroomMaxHealth); + mooshroomBreedingTicks = getInt("mobs.mooshroom.breeding-delay-ticks", mooshroomBreedingTicks); } - public double muleMaxHealthMin = 15.0D; -@@ -935,6 +966,7 @@ public class PurpurWorldConfig { + public boolean muleRidableInWater = false; +@@ -1154,6 +1182,7 @@ public class PurpurWorldConfig { public double muleJumpStrengthMax = 0.5D; public double muleMovementSpeedMin = 0.175D; public double muleMovementSpeedMax = 0.175D; + public int muleBreedingTicks = 6000; private void muleSettings() { + muleRidableInWater = getBoolean("mobs.mule.ridable-in-water", muleRidableInWater); if (PurpurConfig.version < 10) { - double oldMin = getDouble("mobs.mule.attributes.max-health.min", muleMaxHealthMin); -@@ -949,9 +981,11 @@ public class PurpurWorldConfig { +@@ -1169,12 +1198,14 @@ public class PurpurWorldConfig { muleJumpStrengthMax = getDouble("mobs.mule.attributes.jump_strength.max", muleJumpStrengthMax); muleMovementSpeedMin = getDouble("mobs.mule.attributes.movement_speed.min", muleMovementSpeedMin); muleMovementSpeedMax = getDouble("mobs.mule.attributes.movement_speed.max", muleMovementSpeedMax); + muleBreedingTicks = getInt("mobs.mule.breeding-delay-ticks", muleBreedingTicks); } + public boolean ocelotRidable = false; + public boolean ocelotRidableInWater = true; + public boolean ocelotControllable = true; public double ocelotMaxHealth = 10.0D; + public int ocelotBreedingTicks = 6000; private void ocelotSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.ocelot.attributes.max-health", ocelotMaxHealth); -@@ -959,9 +993,11 @@ public class PurpurWorldConfig { + ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable); + ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater); +@@ -1185,12 +1216,14 @@ public class PurpurWorldConfig { set("mobs.ocelot.attributes.max_health", oldValue); } ocelotMaxHealth = getDouble("mobs.ocelot.attributes.max_health", ocelotMaxHealth); + ocelotBreedingTicks = getInt("mobs.ocelot.breeding-delay-ticks", ocelotBreedingTicks); } + public boolean pandaRidable = false; + public boolean pandaRidableInWater = true; + public boolean pandaControllable = true; public double pandaMaxHealth = 20.0D; + public int pandaBreedingTicks = 6000; private void pandaSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.panda.attributes.max-health", pandaMaxHealth); -@@ -969,6 +1005,7 @@ public class PurpurWorldConfig { + pandaRidable = getBoolean("mobs.panda.ridable", pandaRidable); + pandaRidableInWater = getBoolean("mobs.panda.ridable-in-water", pandaRidableInWater); +@@ -1201,6 +1234,7 @@ public class PurpurWorldConfig { set("mobs.panda.attributes.max_health", oldValue); } pandaMaxHealth = getDouble("mobs.panda.attributes.max_health", pandaMaxHealth); + pandaBreedingTicks = getInt("mobs.panda.breeding-delay-ticks", pandaBreedingTicks); } - public double parrotMaxHealth = 6.0D; -@@ -1021,6 +1058,7 @@ public class PurpurWorldConfig { - + public boolean parrotRidable = false; +@@ -1278,6 +1312,7 @@ public class PurpurWorldConfig { + public boolean pigControllable = true; public double pigMaxHealth = 10.0D; public boolean pigGiveSaddleBack = false; + public int pigBreedingTicks = 6000; private void pigSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.pig.attributes.max-health", pigMaxHealth); -@@ -1029,6 +1067,7 @@ public class PurpurWorldConfig { + pigRidable = getBoolean("mobs.pig.ridable", pigRidable); + pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); +@@ -1289,6 +1324,7 @@ public class PurpurWorldConfig { } pigMaxHealth = getDouble("mobs.pig.attributes.max_health", pigMaxHealth); pigGiveSaddleBack = getBoolean("mobs.pig.give-saddle-back", pigGiveSaddleBack); + pigBreedingTicks = getInt("mobs.pig.breeding-delay-ticks", pigBreedingTicks); } - public double piglinMaxHealth = 16.0D; -@@ -1064,6 +1103,7 @@ public class PurpurWorldConfig { + public boolean piglinRidable = false; +@@ -1345,6 +1381,7 @@ public class PurpurWorldConfig { public double polarBearMaxHealth = 30.0D; public String polarBearBreedableItemString = ""; public Item polarBearBreedableItem = null; + public int polarBearBreedingTicks = 6000; private void polarBearSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.polar_bear.attributes.max-health", polarBearMaxHealth); -@@ -1074,6 +1114,7 @@ public class PurpurWorldConfig { + polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); + polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); +@@ -1358,6 +1395,7 @@ public class PurpurWorldConfig { polarBearBreedableItemString = getString("mobs.polar_bear.breedable-item", polarBearBreedableItemString); Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(polarBearBreedableItemString)); if (item != Items.AIR) polarBearBreedableItem = item; + polarBearBreedingTicks = getInt("mobs.polar_bear.breeding-delay-ticks", polarBearBreedingTicks); } - public double pufferfishMaxHealth = 3.0D; -@@ -1089,6 +1130,7 @@ public class PurpurWorldConfig { + public boolean pufferfishRidable = false; +@@ -1380,6 +1418,7 @@ public class PurpurWorldConfig { public double rabbitMaxHealth = 3.0D; public double rabbitNaturalToast = 0.0D; public double rabbitNaturalKiller = 0.0D; + public int rabbitBreedingTicks = 6000; private void rabbitSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.rabbit.attributes.max-health", rabbitMaxHealth); -@@ -1098,6 +1140,7 @@ public class PurpurWorldConfig { + rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); + rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); +@@ -1392,6 +1431,7 @@ public class PurpurWorldConfig { rabbitMaxHealth = getDouble("mobs.rabbit.attributes.max_health", rabbitMaxHealth); rabbitNaturalToast = getDouble("mobs.rabbit.spawn-toast-chance", rabbitNaturalToast); rabbitNaturalKiller = getDouble("mobs.rabbit.spawn-killer-rabbit-chance", rabbitNaturalKiller); + rabbitBreedingTicks = getInt("mobs.rabbit.breeding-delay-ticks", rabbitBreedingTicks); } - public double ravagerMaxHealth = 100.0D; -@@ -1121,6 +1164,7 @@ public class PurpurWorldConfig { - } - + public boolean ravagerRidable = false; +@@ -1428,6 +1468,7 @@ public class PurpurWorldConfig { + public boolean sheepRidableInWater = true; + public boolean sheepControllable = true; public double sheepMaxHealth = 8.0D; + public int sheepBreedingTicks = 6000; private void sheepSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.sheep.attributes.max-health", sheepMaxHealth); -@@ -1128,6 +1172,7 @@ public class PurpurWorldConfig { + sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); + sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); +@@ -1438,6 +1479,7 @@ public class PurpurWorldConfig { set("mobs.sheep.attributes.max_health", oldValue); } sheepMaxHealth = getDouble("mobs.sheep.attributes.max_health", sheepMaxHealth); + sheepBreedingTicks = getInt("mobs.sheep.breeding-delay-ticks", sheepBreedingTicks); } - public double shulkerMaxHealth = 30.0D; -@@ -1214,8 +1259,10 @@ public class PurpurWorldConfig { - } - + public boolean shulkerRidable = false; +@@ -1561,11 +1603,13 @@ public class PurpurWorldConfig { + public boolean snifferRidableInWater = true; + public boolean snifferControllable = true; public double snifferMaxHealth = 14.0D; + public int snifferBreedingTicks = 6000; private void snifferSettings() { + snifferRidable = getBoolean("mobs.sniffer.ridable", snifferRidable); + snifferRidableInWater = getBoolean("mobs.sniffer.ridable-in-water", snifferRidableInWater); + snifferControllable = getBoolean("mobs.sniffer.controllable", snifferControllable); snifferMaxHealth = getDouble("mobs.sniffer.attributes.max_health", snifferMaxHealth); + snifferBreedingTicks = getInt("mobs.sniffer.breeding-delay-ticks", chickenBreedingTicks); } - public double squidMaxHealth = 10.0D; -@@ -1255,6 +1302,7 @@ public class PurpurWorldConfig { - } - + public boolean squidRidable = false; +@@ -1624,6 +1668,7 @@ public class PurpurWorldConfig { + public boolean striderRidableInWater = false; + public boolean striderControllable = true; public double striderMaxHealth = 20.0D; + public int striderBreedingTicks = 6000; private void striderSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.strider.attributes.max-health", striderMaxHealth); -@@ -1262,6 +1310,7 @@ public class PurpurWorldConfig { + striderRidable = getBoolean("mobs.strider.ridable", striderRidable); + striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); +@@ -1634,6 +1679,7 @@ public class PurpurWorldConfig { set("mobs.strider.attributes.max_health", oldValue); } striderMaxHealth = getDouble("mobs.strider.attributes.max_health", striderMaxHealth); + striderBreedingTicks = getInt("mobs.strider.breeding-delay-ticks", striderBreedingTicks); } - public double traderLlamaMaxHealthMin = 15.0D; -@@ -1270,6 +1319,7 @@ public class PurpurWorldConfig { + public boolean tadpoleRidable = false; +@@ -1654,6 +1700,7 @@ public class PurpurWorldConfig { public double traderLlamaJumpStrengthMax = 0.5D; public double traderLlamaMovementSpeedMin = 0.175D; public double traderLlamaMovementSpeedMax = 0.175D; + public int traderLlamaBreedingTicks = 6000; private void traderLlamaSettings() { - if (PurpurConfig.version < 10) { - double oldMin = getDouble("mobs.trader_llama.attributes.max-health.min", traderLlamaMaxHealthMin); -@@ -1284,6 +1334,7 @@ public class PurpurWorldConfig { + traderLlamaRidable = getBoolean("mobs.trader_llama.ridable", traderLlamaRidable); + traderLlamaRidableInWater = getBoolean("mobs.trader_llama.ridable-in-water", traderLlamaRidableInWater); +@@ -1671,6 +1718,7 @@ public class PurpurWorldConfig { traderLlamaJumpStrengthMax = getDouble("mobs.trader_llama.attributes.jump_strength.max", traderLlamaJumpStrengthMax); traderLlamaMovementSpeedMin = getDouble("mobs.trader_llama.attributes.movement_speed.min", traderLlamaMovementSpeedMin); traderLlamaMovementSpeedMax = getDouble("mobs.trader_llama.attributes.movement_speed.max", traderLlamaMovementSpeedMax); + traderLlamaBreedingTicks = getInt("mobs.trader_llama.breeding-delay-ticks", traderLlamaBreedingTicks); } - public double tropicalFishMaxHealth = 3.0D; -@@ -1297,6 +1348,7 @@ public class PurpurWorldConfig { - } - + public boolean tropicalFishRidable = false; +@@ -1691,6 +1739,7 @@ public class PurpurWorldConfig { + public boolean turtleRidableInWater = true; + public boolean turtleControllable = true; public double turtleMaxHealth = 30.0D; + public int turtleBreedingTicks = 6000; private void turtleSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.turtle.attributes.max-health", turtleMaxHealth); -@@ -1304,6 +1356,7 @@ public class PurpurWorldConfig { + turtleRidable = getBoolean("mobs.turtle.ridable", turtleRidable); + turtleRidableInWater = getBoolean("mobs.turtle.ridable-in-water", turtleRidableInWater); +@@ -1701,6 +1750,7 @@ public class PurpurWorldConfig { set("mobs.turtle.attributes.max_health", oldValue); } turtleMaxHealth = getDouble("mobs.turtle.attributes.max_health", turtleMaxHealth); + turtleBreedingTicks = getInt("mobs.turtle.breeding-delay-ticks", turtleBreedingTicks); } - public double vexMaxY = 320D; -@@ -1322,6 +1375,7 @@ public class PurpurWorldConfig { + public boolean vexRidable = false; +@@ -1728,6 +1778,7 @@ public class PurpurWorldConfig { public boolean villagerFollowEmeraldBlock = false; public boolean villagerCanBeLeashed = false; public boolean villagerCanBreed = true; + public int villagerBreedingTicks = 6000; private void villagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.villager.attributes.max-health", villagerMaxHealth); -@@ -1332,6 +1386,7 @@ public class PurpurWorldConfig { + villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); + villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); +@@ -1741,6 +1792,7 @@ public class PurpurWorldConfig { villagerFollowEmeraldBlock = getBoolean("mobs.villager.follow-emerald-blocks", villagerFollowEmeraldBlock); villagerCanBeLeashed = getBoolean("mobs.villager.can-be-leashed", villagerCanBeLeashed); villagerCanBreed = getBoolean("mobs.villager.can-breed", villagerCanBreed); + villagerBreedingTicks = getInt("mobs.villager.breeding-delay-ticks", villagerBreedingTicks); } - public double vindicatorMaxHealth = 24.0D; -@@ -1399,6 +1454,7 @@ public class PurpurWorldConfig { - } - + public boolean vindicatorRidable = false; +@@ -1852,6 +1904,7 @@ public class PurpurWorldConfig { + public boolean wolfRidableInWater = true; + public boolean wolfControllable = true; public double wolfMaxHealth = 8.0D; + public int wolfBreedingTicks = 6000; private void wolfSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.wolf.attributes.max-health", wolfMaxHealth); -@@ -1406,6 +1462,7 @@ public class PurpurWorldConfig { + wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); + wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater); +@@ -1862,6 +1915,7 @@ public class PurpurWorldConfig { set("mobs.wolf.attributes.max_health", oldValue); } wolfMaxHealth = getDouble("mobs.wolf.attributes.max_health", wolfMaxHealth); + wolfBreedingTicks = getInt("mobs.wolf.breeding-delay-ticks", wolfBreedingTicks); } - public double zoglinMaxHealth = 40.0D; + public boolean zoglinRidable = false; diff --git a/patches/server/0102-Apply-display-names-from-item-forms-of-entities-to-e.patch b/patches/server/0102-Apply-display-names-from-item-forms-of-entities-to-e.patch index 7cc5a6240..b0118de8f 100644 --- a/patches/server/0102-Apply-display-names-from-item-forms-of-entities-to-e.patch +++ b/patches/server/0102-Apply-display-names-from-item-forms-of-entities-to-e.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Apply display names from item forms of entities to entities diff --git a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java -index 316716b8827b974fa62f7f27d57c3b776b42fbd8..1406cdd79c7183522f1f5c0b0edc6166ff9d4ed9 100644 +index 09912c11bad7dc639b8afe8b0041a5fbc3189d7f..9eb196ee4061bb4c5713f33e8b16d91ec52711cd 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java +++ b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java @@ -603,7 +603,7 @@ public class ArmorStand extends LivingEntity { @@ -14,12 +14,12 @@ index 316716b8827b974fa62f7f27d57c3b776b42fbd8..1406cdd79c7183522f1f5c0b0edc6166 ItemStack itemstack = new ItemStack(Items.ARMOR_STAND); - if (this.hasCustomName()) { -+ if (this.level.purpurConfig.persistentDroppableEntityDisplayNames && this.hasCustomName()) { // Purpur ++ if (this.level().purpurConfig.persistentDroppableEntityDisplayNames && this.hasCustomName()) { // Purpur itemstack.setHoverName(this.getCustomName()); } diff --git a/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java b/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java -index 955316687e2e29ad75a0052317a7b0f89034c82a..43f9733d4cc180b3103173d86bf2e8742f87de2a 100644 +index 955316687e2e29ad75a0052317a7b0f89034c82a..19fa9b30768e1d3d095b5efdde1399d5ac7df821 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java +++ b/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java @@ -272,7 +272,13 @@ public class ItemFrame extends HangingEntity { @@ -29,7 +29,7 @@ index 955316687e2e29ad75a0052317a7b0f89034c82a..43f9733d4cc180b3103173d86bf2e874 - this.spawnAtLocation(this.getFrameItemStack()); + // Purpur start + final ItemStack itemFrame = this.getFrameItemStack(); -+ if (this.level.purpurConfig.persistentDroppableEntityDisplayNames && this.hasCustomName()) { ++ if (this.level().purpurConfig.persistentDroppableEntityDisplayNames && this.hasCustomName()) { + itemFrame.setHoverName(this.getCustomName()); + } + this.spawnAtLocation(itemFrame); @@ -38,7 +38,7 @@ index 955316687e2e29ad75a0052317a7b0f89034c82a..43f9733d4cc180b3103173d86bf2e874 if (!itemstack.isEmpty()) { diff --git a/src/main/java/net/minecraft/world/entity/decoration/Painting.java b/src/main/java/net/minecraft/world/entity/decoration/Painting.java -index d5784a19cec98eb199a51acd9e1f4de8c6bf7265..6bf0daff390e1a7335d2b61cc52d415002cf6f08 100644 +index d5784a19cec98eb199a51acd9e1f4de8c6bf7265..4b3a8e4a084585d56dd10a08405463b1a677368b 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/Painting.java +++ b/src/main/java/net/minecraft/world/entity/decoration/Painting.java @@ -159,7 +159,13 @@ public class Painting extends HangingEntity implements VariantHolder { @@ -67,7 +67,7 @@ index 5e33f19193ff49d0d2119d811d8f81d0664e5cee..9a68c0d7cd74818a663ddedf23a22799 - this.spawnAtLocation((ItemLike) this.getDropItem()); + // Purpur start + final ItemStack boat = new ItemStack(this.getDropItem()); -+ if (this.level.purpurConfig.persistentDroppableEntityDisplayNames && this.hasCustomName()) { ++ if (this.level().purpurConfig.persistentDroppableEntityDisplayNames && this.hasCustomName()) { + boat.setHoverName(this.getCustomName()); + } + this.spawnAtLocation(boat); @@ -136,7 +136,7 @@ index b2ad6d230de2c29f371178bccde1111c7532ee70..6667926519a0f1c151e53f59cce36e74 if (((HangingEntity) object).survives()) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 0eda8243f19af580e6ca20bf1583e0f4d6c5504f..e703800b22ec6f8859504605564a9b2f06dd51c3 100644 +index 8223c4c0c24dc222fd4dad216c1b2b7daa98305f..88bc6cdabe0c3c0fb72bc4c88feb3cb376579784 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -99,8 +99,10 @@ public class PurpurWorldConfig { diff --git a/patches/server/0103-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch b/patches/server/0103-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch index 02659ad0e..b370d744f 100644 --- a/patches/server/0103-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch +++ b/patches/server/0103-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch @@ -5,19 +5,19 @@ Subject: [PATCH] Set name visible when using a Name Tag on an Armor Stand diff --git a/src/main/java/net/minecraft/world/item/NameTagItem.java b/src/main/java/net/minecraft/world/item/NameTagItem.java -index 2941c16ef486345b57ab2dfcd26f0272285d3b5a..a312bdc5c90cdcc45b40fc54a1a2a98f54eae82e 100644 +index 2941c16ef486345b57ab2dfcd26f0272285d3b5a..7cc6812bf6f2ba015f65fd1fc1eaac02dd0f53e2 100644 --- a/src/main/java/net/minecraft/world/item/NameTagItem.java +++ b/src/main/java/net/minecraft/world/item/NameTagItem.java @@ -20,6 +20,7 @@ public class NameTagItem extends Item { if (!event.callEvent()) return InteractionResult.PASS; LivingEntity newEntityLiving = ((org.bukkit.craftbukkit.entity.CraftLivingEntity) event.getEntity()).getHandle(); newEntityLiving.setCustomName(event.getName() != null ? io.papermc.paper.adventure.PaperAdventure.asVanilla(event.getName()) : null); -+ if (user.level.purpurConfig.armorstandFixNametags && entity instanceof net.minecraft.world.entity.decoration.ArmorStand) entity.setCustomNameVisible(true); // Purpur ++ if (user.level().purpurConfig.armorstandFixNametags && entity instanceof net.minecraft.world.entity.decoration.ArmorStand) entity.setCustomNameVisible(true); // Purpur if (event.isPersistent() && newEntityLiving instanceof Mob) { ((Mob) newEntityLiving).setPersistenceRequired(); // Paper end diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e703800b22ec6f8859504605564a9b2f06dd51c3..6369804009951ed9efb15d9c2d4f74d5810850f9 100644 +index 88bc6cdabe0c3c0fb72bc4c88feb3cb376579784..edf78456ecd22923503732242e2fb04c15a7a5d6 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -100,9 +100,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0104-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch b/patches/server/0104-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch index e5f4f67bb..6b2d4cd8d 100644 --- a/patches/server/0104-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch +++ b/patches/server/0104-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch @@ -8,7 +8,7 @@ This should help to reduce the amount of dirt, gravel, grass, and etc. that Endermen like to randomly place all over the world. 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 ba7d9d2b6927dd20e82009d57d77f713ab9be8ab..094ed658eaedcd88461330de0816e29b7db8acd2 100644 +index 15eb4c93ddd4ea06640ff45e11c54b5c761ca89a..47b82549b401acca5e9a5702d41674652ab6853f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java @@ -484,7 +484,7 @@ public class EnderMan extends Monster implements NeutralMob { @@ -16,27 +16,27 @@ index ba7d9d2b6927dd20e82009d57d77f713ab9be8ab..094ed658eaedcd88461330de0816e29b @Override public boolean requiresCustomPersistence() { - return super.requiresCustomPersistence() || this.getCarriedBlock() != null; -+ return super.requiresCustomPersistence() || (!this.level.purpurConfig.endermanDespawnEvenWithBlock && this.getCarriedBlock() != null); // Purpur ++ return super.requiresCustomPersistence() || (!this.level().purpurConfig.endermanDespawnEvenWithBlock && this.getCarriedBlock() != null); // Purpur } private static class EndermanFreezeWhenLookedAt extends Goal { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 6369804009951ed9efb15d9c2d4f74d5810850f9..07ca764cd3436f2da79e9b8c7bb370f61d1a854f 100644 +index edf78456ecd22923503732242e2fb04c15a7a5d6..5f7069b47deed8835aa91303e2c037e09e78fbc5 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -717,6 +717,7 @@ public class PurpurWorldConfig { - +@@ -832,6 +832,7 @@ public class PurpurWorldConfig { + public boolean endermanControllable = true; public double endermanMaxHealth = 40.0D; public boolean endermanAllowGriefing = true; + public boolean endermanDespawnEvenWithBlock = false; private void endermanSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.enderman.attributes.max-health", endermanMaxHealth); -@@ -725,6 +726,7 @@ public class PurpurWorldConfig { + endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); + endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); +@@ -843,6 +844,7 @@ public class PurpurWorldConfig { } endermanMaxHealth = getDouble("mobs.enderman.attributes.max_health", endermanMaxHealth); endermanAllowGriefing = getBoolean("mobs.enderman.allow-griefing", endermanAllowGriefing); + endermanDespawnEvenWithBlock = getBoolean("mobs.enderman.can-despawn-with-held-block", endermanDespawnEvenWithBlock); } - public double endermiteMaxHealth = 8.0D; + public boolean endermiteRidable = false; diff --git a/patches/server/0105-Add-configurable-snowball-damage.patch b/patches/server/0105-Add-configurable-snowball-damage.patch index 665ee022d..f444e0e2b 100644 --- a/patches/server/0105-Add-configurable-snowball-damage.patch +++ b/patches/server/0105-Add-configurable-snowball-damage.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add configurable snowball damage diff --git a/src/main/java/net/minecraft/world/entity/projectile/Snowball.java b/src/main/java/net/minecraft/world/entity/projectile/Snowball.java -index 718e120c9768cf716b32d3d652f53f1dda925168..e1e19a360be99b189dee1652e5289292f4996d92 100644 +index 718e120c9768cf716b32d3d652f53f1dda925168..b90cedad282e95a067aca176fafa9f72a726f520 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/Snowball.java +++ b/src/main/java/net/minecraft/world/entity/projectile/Snowball.java @@ -53,7 +53,7 @@ public class Snowball extends ThrowableItemProjectile { @@ -13,12 +13,12 @@ index 718e120c9768cf716b32d3d652f53f1dda925168..e1e19a360be99b189dee1652e5289292 super.onHitEntity(entityHitResult); Entity entity = entityHitResult.getEntity(); - int i = entity instanceof Blaze ? 3 : 0; -+ int i = entity.level.purpurConfig.snowballDamage >= 0 ? entity.level.purpurConfig.snowballDamage : entity instanceof Blaze ? 3 : 0; // Purpur ++ int i = entity.level().purpurConfig.snowballDamage >= 0 ? entity.level().purpurConfig.snowballDamage : entity instanceof Blaze ? 3 : 0; // Purpur entity.hurt(this.damageSources().thrown(this, this.getOwner()), (float)i); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 07ca764cd3436f2da79e9b8c7bb370f61d1a854f..abb4fb180bc16441e294f77a3b8a1b9d5543061f 100644 +index 5f7069b47deed8835aa91303e2c037e09e78fbc5..168da72bdbb443f8c5bebc7d2a1ed8820020cf49 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -356,6 +356,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0107-Add-boat-fall-damage-config.patch b/patches/server/0107-Add-boat-fall-damage-config.patch index ac22a9a52..218342651 100644 --- a/patches/server/0107-Add-boat-fall-damage-config.patch +++ b/patches/server/0107-Add-boat-fall-damage-config.patch @@ -5,20 +5,20 @@ Subject: [PATCH] Add boat fall damage config diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 375a6a12cabfdc798792166a60e3b18e8cbd7480..8c1a2fafd2e53720a524c1b84bb95f3865d029f9 100644 +index 8dc74f36bcccc4b5023fafce22115778ec08bff6..344ea725ab5f4fb373542dac63761263dfe95035 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -1112,7 +1112,16 @@ public class ServerPlayer extends Player { if (this.isInvulnerableTo(source)) { return false; } else { -- if (source.is(DamageTypeTags.IS_FALL) && getRootVehicle() instanceof net.minecraft.world.entity.vehicle.AbstractMinecart && level.purpurConfig.minecartControllable && !level.purpurConfig.minecartControllableFallDamage) return false; // Purpur +- if (source.is(DamageTypeTags.IS_FALL) && getRootVehicle() instanceof net.minecraft.world.entity.vehicle.AbstractMinecart && level().purpurConfig.minecartControllable && !level().purpurConfig.minecartControllableFallDamage) return false; // Purpur + // Purpur start + if (source.is(DamageTypeTags.IS_FALL)) { // Purpur -+ if (getRootVehicle() instanceof net.minecraft.world.entity.vehicle.AbstractMinecart && level.purpurConfig.minecartControllable && !level.purpurConfig.minecartControllableFallDamage) { ++ if (getRootVehicle() instanceof net.minecraft.world.entity.vehicle.AbstractMinecart && level().purpurConfig.minecartControllable && !level().purpurConfig.minecartControllableFallDamage) { + return false; + } -+ if (getRootVehicle() instanceof net.minecraft.world.entity.vehicle.Boat && !level.purpurConfig.boatsDoFallDamage) { ++ if (getRootVehicle() instanceof net.minecraft.world.entity.vehicle.Boat && !level().purpurConfig.boatsDoFallDamage) { + return false; + } + } @@ -27,7 +27,7 @@ index 375a6a12cabfdc798792166a60e3b18e8cbd7480..8c1a2fafd2e53720a524c1b84bb95f38 if (!flag && isSpawnInvulnerable() && !source.is(DamageTypeTags.BYPASSES_INVULNERABILITY)) { // Purpur diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index cdbf53d7c249d418d5958372b81ab9e7b3236925..0fb351aabd461ca77badd2099978c1095e0af220 100644 +index 4af6702e967bec733bbd5ba21dc8599f7b25a7cc..9fa8f9fb1c36157f849b81ae712bed28e4a68b8f 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -114,6 +114,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0108-Snow-Golem-rate-of-fire-config.patch b/patches/server/0108-Snow-Golem-rate-of-fire-config.patch index 418f1a2cd..10a265214 100644 --- a/patches/server/0108-Snow-Golem-rate-of-fire-config.patch +++ b/patches/server/0108-Snow-Golem-rate-of-fire-config.patch @@ -10,7 +10,7 @@ If min-shoot-interval-ticks and max-shoot-interval-ticks are both set to 0, snow golems won't shoot any snowballs. diff --git a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -index d4d843ee7fe52a97dc1dd063c7437f6a6b05b9de..f43c37505e9e7c171b62cfc0621e425f5726dc3d 100644 +index 2a5ffaf5614e19305f4e08e15752364919e68a49..ecc0f221fca332b6f4d8feb72dbafc52e1002a23 100644 --- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java @@ -79,7 +79,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM @@ -18,15 +18,15 @@ index d4d843ee7fe52a97dc1dd063c7437f6a6b05b9de..f43c37505e9e7c171b62cfc0621e425f protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - this.goalSelector.addGoal(1, new RangedAttackGoal(this, 1.25D, 20, 10.0F)); -+ this.goalSelector.addGoal(1, new RangedAttackGoal(this, level.purpurConfig.snowGolemAttackDistance, level.purpurConfig.snowGolemSnowBallMin, level.purpurConfig.snowGolemSnowBallMax, level.purpurConfig.snowGolemSnowBallModifier)); // Purpur ++ this.goalSelector.addGoal(1, new RangedAttackGoal(this, level().purpurConfig.snowGolemAttackDistance, level().purpurConfig.snowGolemSnowBallMin, level().purpurConfig.snowGolemSnowBallMax, level().purpurConfig.snowGolemSnowBallModifier)); // Purpur this.goalSelector.addGoal(2, new WaterAvoidingRandomStrollGoal(this, 1.0D, 1.0000001E-5F)); this.goalSelector.addGoal(3, new LookAtPlayerGoal(this, Player.class, 6.0F)); this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 0fb351aabd461ca77badd2099978c1095e0af220..3e7226737f786399c06b80d72f2b0b7ec5bbd8e6 100644 +index 9fa8f9fb1c36157f849b81ae712bed28e4a68b8f..5aeb547458ab4a632e64189c749586bba86d20d9 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1263,6 +1263,10 @@ public class PurpurWorldConfig { +@@ -1601,6 +1601,10 @@ public class PurpurWorldConfig { public double snowGolemMaxHealth = 4.0D; public boolean snowGolemDropsPumpkin = true; public boolean snowGolemPutPumpkinBack = false; @@ -35,9 +35,9 @@ index 0fb351aabd461ca77badd2099978c1095e0af220..3e7226737f786399c06b80d72f2b0b7e + public float snowGolemSnowBallModifier = 10.0F; + public double snowGolemAttackDistance = 1.25D; private void snowGolemSettings() { - snowGolemLeaveTrailWhenRidden = getBoolean("mobs.snow_golem.leave-trail-when-ridden", snowGolemLeaveTrailWhenRidden); - if (PurpurConfig.version < 10) { -@@ -1273,6 +1277,10 @@ public class PurpurWorldConfig { + snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); + snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); +@@ -1614,6 +1618,10 @@ public class PurpurWorldConfig { snowGolemMaxHealth = getDouble("mobs.snow_golem.attributes.max_health", snowGolemMaxHealth); snowGolemDropsPumpkin = getBoolean("mobs.snow_golem.drop-pumpkin-when-sheared", snowGolemDropsPumpkin); snowGolemPutPumpkinBack = getBoolean("mobs.snow_golem.pumpkin-can-be-added-back", snowGolemPutPumpkinBack); @@ -47,4 +47,4 @@ index 0fb351aabd461ca77badd2099978c1095e0af220..3e7226737f786399c06b80d72f2b0b7e + snowGolemAttackDistance = getDouble("mobs.snow_golem.attack-distance", snowGolemAttackDistance); } - public double snifferMaxHealth = 14.0D; + public boolean snifferRidable = false; diff --git a/patches/server/0110-Toggle-for-Zombified-Piglin-death-always-counting-as.patch b/patches/server/0110-Toggle-for-Zombified-Piglin-death-always-counting-as.patch index dca24ebff..d94e10c90 100644 --- a/patches/server/0110-Toggle-for-Zombified-Piglin-death-always-counting-as.patch +++ b/patches/server/0110-Toggle-for-Zombified-Piglin-death-always-counting-as.patch @@ -13,7 +13,7 @@ to the Piglin being angry, even though the player never hit them. This patch adds a toggle to disable this behavior. diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index 0f53ab48bb28188400c7b420cd79ea202c8f5746..921d4e60052f6ceb9a6ecc2956350bd70c94dca7 100644 +index 3d61b27c23d90e87fdfc8c170eafc116716ac047..67fd554cfd6b848ca1f2cf804ad4543ad2c88845 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java @@ -152,7 +152,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { @@ -21,7 +21,7 @@ index 0f53ab48bb28188400c7b420cd79ea202c8f5746..921d4e60052f6ceb9a6ecc2956350bd7 } - if (this.isAngry()) { -+ if (this.isAngry() && this.level.purpurConfig.zombifiedPiglinCountAsPlayerKillWhenAngry) { // Purpur ++ if (this.isAngry() && this.level().purpurConfig.zombifiedPiglinCountAsPlayerKillWhenAngry) { // Purpur this.lastHurtByPlayerTime = this.tickCount; } @@ -30,27 +30,26 @@ index 0f53ab48bb28188400c7b420cd79ea202c8f5746..921d4e60052f6ceb9a6ecc2956350bd7 } - if (entityliving instanceof Player) { -+ if (entityliving instanceof Player && this.level.purpurConfig.zombifiedPiglinCountAsPlayerKillWhenAngry) { // Purpur ++ if (entityliving instanceof Player && this.level().purpurConfig.zombifiedPiglinCountAsPlayerKillWhenAngry) { // Purpur this.setLastHurtByPlayer((Player) entityliving); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3e7226737f786399c06b80d72f2b0b7ec5bbd8e6..75a55280a0f57ef3586f3c32d5b37de504ee1fcc 100644 +index 5aeb547458ab4a632e64189c749586bba86d20d9..b29c4380dc2bc7c0aab0e47b5714f14883e7a919 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1566,6 +1566,7 @@ public class PurpurWorldConfig { +@@ -2039,6 +2039,7 @@ public class PurpurWorldConfig { public boolean zombifiedPiglinJockeyOnlyBaby = true; public double zombifiedPiglinJockeyChance = 0.05D; public boolean zombifiedPiglinJockeyTryExistingChickens = true; + public boolean zombifiedPiglinCountAsPlayerKillWhenAngry = true; private void zombifiedPiglinSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.zombified_piglin.attributes.max-health", zombifiedPiglinMaxHealth); -@@ -1577,6 +1578,7 @@ public class PurpurWorldConfig { + zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); + zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); +@@ -2053,5 +2054,6 @@ public class PurpurWorldConfig { 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); + zombifiedPiglinCountAsPlayerKillWhenAngry = getBoolean("mobs.zombified_piglin.count-as-player-kill-when-angry", zombifiedPiglinCountAsPlayerKillWhenAngry); } - - public boolean babiesAreRidable = true; + } diff --git a/patches/server/0111-Configurable-chance-for-wolves-to-spawn-rabid.patch b/patches/server/0111-Configurable-chance-for-wolves-to-spawn-rabid.patch index 9eee03fb5..d409fb869 100644 --- a/patches/server/0111-Configurable-chance-for-wolves-to-spawn-rabid.patch +++ b/patches/server/0111-Configurable-chance-for-wolves-to-spawn-rabid.patch @@ -7,7 +7,7 @@ Configurable chance to spawn a wolf that is rabid. Rabid wolves attack all players, mobs, and animals. diff --git a/src/main/java/net/minecraft/world/entity/animal/Wolf.java b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -index 3cd49c57d6dc4b0db31c3ac40447c89ce7e193d7..d8acf9fde413d2661cb14ff4d198f6e138a1e549 100644 +index 074f1860e755348a5a3a8e9df383896656cee9af..563347f7b683d796f7d3575206d40656247a897c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java @@ -10,6 +10,7 @@ import net.minecraft.network.syncher.EntityDataAccessor; @@ -94,7 +94,7 @@ index 3cd49c57d6dc4b0db31c3ac40447c89ce7e193d7..d8acf9fde413d2661cb14ff4d198f6e1 private static final float TAME_HEALTH = 20.0F; private float interestedAngle; @@ -134,6 +172,37 @@ public class Wolf extends TamableAnimal implements NeutralMob { - return this.level.purpurConfig.wolfBreedingTicks; + return this.level().purpurConfig.wolfBreedingTicks; } + public boolean isRabid() { @@ -184,7 +184,7 @@ index 3cd49c57d6dc4b0db31c3ac40447c89ce7e193d7..d8acf9fde413d2661cb14ff4d198f6e1 this.level().broadcastEntityEvent(this, (byte) 6); } + // Purpur start -+ else if (this.level.purpurConfig.wolfMilkCuresRabies && itemstack.getItem() == Items.MILK_BUCKET && this.isRabid()) { ++ else if (this.level().purpurConfig.wolfMilkCuresRabies && itemstack.getItem() == Items.MILK_BUCKET && this.isRabid()) { + if (!player.isCreative()) { + player.setItemInHand(hand, new ItemStack(Items.BUCKET)); + } @@ -222,19 +222,19 @@ index e43fd3e59fd8c74828ae65965fade27f56beef65..b2f133c8baabba1cffa6e92ea0f85453 + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 75a55280a0f57ef3586f3c32d5b37de504ee1fcc..15a8ec2ee6677d6dd5b0fd60ae1d02c7c6c21548 100644 +index b29c4380dc2bc7c0aab0e47b5714f14883e7a919..f9a21e10b3d9faf9d7890ea3ca1c7fd3e1ccc03c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1479,6 +1479,8 @@ public class PurpurWorldConfig { - } - +@@ -1929,6 +1929,8 @@ public class PurpurWorldConfig { + public boolean wolfRidableInWater = true; + public boolean wolfControllable = true; public double wolfMaxHealth = 8.0D; + public boolean wolfMilkCuresRabies = true; + public double wolfNaturalRabid = 0.0D; public int wolfBreedingTicks = 6000; private void wolfSettings() { - if (PurpurConfig.version < 10) { -@@ -1487,6 +1489,8 @@ public class PurpurWorldConfig { + wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); +@@ -1940,6 +1942,8 @@ public class PurpurWorldConfig { set("mobs.wolf.attributes.max_health", oldValue); } wolfMaxHealth = getDouble("mobs.wolf.attributes.max_health", wolfMaxHealth); diff --git a/patches/server/0112-Configurable-default-collar-color.patch b/patches/server/0112-Configurable-default-collar-color.patch index c3143766d..504e55e56 100644 --- a/patches/server/0112-Configurable-default-collar-color.patch +++ b/patches/server/0112-Configurable-default-collar-color.patch @@ -7,7 +7,7 @@ This allows for the server to set a default collar color when a wolf or cat is t Resets to RED when the value is invalid. diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java -index a312e8ff4e4cd3328f0586348a2eff3deaf4617d..bb827b0a7273a2636d01a506fae09d32e99db178 100644 +index ffa2128b63e5e45c2a41e31a6b8b6e8df0bf9be4..956f125c9ae62537570bb9870be66872f3519f6a 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java @@ -345,6 +345,14 @@ public class Cat extends TamableAnimal implements VariantHolder { @@ -17,7 +17,7 @@ index a312e8ff4e4cd3328f0586348a2eff3deaf4617d..bb827b0a7273a2636d01a506fae09d32 + // Purpur start + @Override + public void tame(Player player) { -+ setCollarColor(level.purpurConfig.catDefaultCollarColor); ++ setCollarColor(level().purpurConfig.catDefaultCollarColor); + super.tame(player); + } + // Purpur end @@ -26,7 +26,7 @@ index a312e8ff4e4cd3328f0586348a2eff3deaf4617d..bb827b0a7273a2636d01a506fae09d32 @Override public Cat getBreedOffspring(ServerLevel world, AgeableMob entity) { diff --git a/src/main/java/net/minecraft/world/entity/animal/Wolf.java b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -index d8acf9fde413d2661cb14ff4d198f6e138a1e549..8eb72d7f29bf9085bda1decc43f89125c14b1a2b 100644 +index 563347f7b683d796f7d3575206d40656247a897c..6b270c1aa37096443701d7f4fbdab006afe2556c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java @@ -203,6 +203,12 @@ public class Wolf extends TamableAnimal implements NeutralMob { @@ -35,7 +35,7 @@ index d8acf9fde413d2661cb14ff4d198f6e138a1e549..8eb72d7f29bf9085bda1decc43f89125 + @Override + public void tame(Player player) { -+ setCollarColor(level.purpurConfig.wolfDefaultCollarColor); ++ setCollarColor(level().purpurConfig.wolfDefaultCollarColor); + super.tame(player); + } + @@ -43,18 +43,18 @@ index d8acf9fde413d2661cb14ff4d198f6e138a1e549..8eb72d7f29bf9085bda1decc43f89125 protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 15a8ec2ee6677d6dd5b0fd60ae1d02c7c6c21548..8373d41949bef5ca988e2ea2c515885ae1de7fea 100644 +index f9a21e10b3d9faf9d7890ea3ca1c7fd3e1ccc03c..0d9a4180f3af0752a44c0829df48fc0bbb52a116 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -569,6 +569,7 @@ public class PurpurWorldConfig { +@@ -603,6 +603,7 @@ public class PurpurWorldConfig { public int catSpawnSwampHutScanRange = 16; public int catSpawnVillageScanRange = 48; public int catBreedingTicks = 6000; + public DyeColor catDefaultCollarColor = DyeColor.RED; private void catSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.cat.attributes.max-health", catMaxHealth); -@@ -580,6 +581,11 @@ public class PurpurWorldConfig { + catRidable = getBoolean("mobs.cat.ridable", catRidable); + catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); +@@ -617,6 +618,11 @@ public class PurpurWorldConfig { catSpawnSwampHutScanRange = getInt("mobs.cat.scan-range-for-other-cats.swamp-hut", catSpawnSwampHutScanRange); catSpawnVillageScanRange = getInt("mobs.cat.scan-range-for-other-cats.village", catSpawnVillageScanRange); catBreedingTicks = getInt("mobs.cat.breeding-delay-ticks", catBreedingTicks); @@ -65,16 +65,16 @@ index 15a8ec2ee6677d6dd5b0fd60ae1d02c7c6c21548..8373d41949bef5ca988e2ea2c515885a + } } - public double caveSpiderMaxHealth = 12.0D; -@@ -1479,6 +1485,7 @@ public class PurpurWorldConfig { - } - + public boolean caveSpiderRidable = false; +@@ -1929,6 +1935,7 @@ public class PurpurWorldConfig { + public boolean wolfRidableInWater = true; + public boolean wolfControllable = true; public double wolfMaxHealth = 8.0D; + public DyeColor wolfDefaultCollarColor = DyeColor.RED; public boolean wolfMilkCuresRabies = true; public double wolfNaturalRabid = 0.0D; public int wolfBreedingTicks = 6000; -@@ -1489,6 +1496,11 @@ public class PurpurWorldConfig { +@@ -1942,6 +1949,11 @@ public class PurpurWorldConfig { set("mobs.wolf.attributes.max_health", oldValue); } wolfMaxHealth = getDouble("mobs.wolf.attributes.max_health", wolfMaxHealth); diff --git a/patches/server/0113-Phantom-flames-on-swoop.patch b/patches/server/0113-Phantom-flames-on-swoop.patch index 66b416d48..e5054a235 100644 --- a/patches/server/0113-Phantom-flames-on-swoop.patch +++ b/patches/server/0113-Phantom-flames-on-swoop.patch @@ -5,34 +5,34 @@ Subject: [PATCH] Phantom flames on swoop diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -index b230733d72843f3142c26cc7d0e9bf93054fc628..518c1cdf1459a8ac97c7ab39461cca074bad5bcf 100644 +index 67aa490540d264775d8a8382cb5922f365ca6913..a9a942896dd428cd974970cac16857c27d08a7ec 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java @@ -219,6 +219,7 @@ public class Phantom extends FlyingMob implements Enemy { this.level().addParticle(ParticleTypes.MYCELIUM, this.getX() - (double) f2, this.getY() + (double) f4, this.getZ() - (double) f3, 0.0D, 0.0D, 0.0D); } -+ if (level.purpurConfig.phantomFlamesOnSwoop && attackPhase == AttackPhase.SWOOP) shoot(); // Purpur ++ if (level().purpurConfig.phantomFlamesOnSwoop && attackPhase == AttackPhase.SWOOP) shoot(); // Purpur } @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8373d41949bef5ca988e2ea2c515885ae1de7fea..55ec718b1e03dec575c151336faa1a567946e8d8 100644 +index 0d9a4180f3af0752a44c0829df48fc0bbb52a116..3a1c437eab3783c02e2adac370f49f016b107a27 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1054,6 +1054,7 @@ public class PurpurWorldConfig { +@@ -1298,6 +1298,7 @@ public class PurpurWorldConfig { public int phantomBurnInLight = 0; public boolean phantomIgnorePlayersWithTorch = false; public boolean phantomBurnInDaylight = true; + public boolean phantomFlamesOnSwoop = false; private void phantomSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.phantom.attributes.max-health", Double.parseDouble(phantomMaxHealth)); -@@ -1077,6 +1078,7 @@ public class PurpurWorldConfig { + phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); + phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); +@@ -1328,6 +1329,7 @@ public class PurpurWorldConfig { phantomBurnInLight = getInt("mobs.phantom.burn-in-light", phantomBurnInLight); phantomBurnInDaylight = getBoolean("mobs.phantom.burn-in-daylight", phantomBurnInDaylight); phantomIgnorePlayersWithTorch = getBoolean("mobs.phantom.ignore-players-with-torch", phantomIgnorePlayersWithTorch); + phantomFlamesOnSwoop = getBoolean("mobs.phantom.flames-on-swoop", phantomFlamesOnSwoop); } - public double pigMaxHealth = 10.0D; + public boolean pigRidable = false; diff --git a/patches/server/0116-Striders-give-saddle-back.patch b/patches/server/0116-Striders-give-saddle-back.patch index b7fe06685..12ffcd1a1 100644 --- a/patches/server/0116-Striders-give-saddle-back.patch +++ b/patches/server/0116-Striders-give-saddle-back.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Striders give saddle back diff --git a/src/main/java/net/minecraft/world/entity/monster/Strider.java b/src/main/java/net/minecraft/world/entity/monster/Strider.java -index dded8bde49978c01c2534d448adc17812a2c4474..43459013151fc93c5707112161b212da88930e00 100644 +index 93dca4758ed995373fe1585930f225604a4153fa..4c077c94b654f54465ece2aa45c5ead0a417ad0d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Strider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java @@ -486,6 +486,19 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { @@ -13,7 +13,7 @@ index dded8bde49978c01c2534d448adc17812a2c4474..43459013151fc93c5707112161b212da boolean flag = this.isFood(player.getItemInHand(hand)); + // Purpur start -+ if (level.purpurConfig.striderGiveSaddleBack && player.isSecondaryUseActive() && !flag && isSaddled() && !isVehicle()) { ++ if (level().purpurConfig.striderGiveSaddleBack && player.isSecondaryUseActive() && !flag && isSaddled() && !isVehicle()) { + this.steering.setSaddle(false); + if (!player.getAbilities().instabuild) { + ItemStack saddle = new ItemStack(Items.SADDLE); @@ -29,22 +29,22 @@ index dded8bde49978c01c2534d448adc17812a2c4474..43459013151fc93c5707112161b212da if (!this.level().isClientSide) { player.startRiding(this); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 481ac57133506633b776db448819e73aebfb39e8..f319d80c225576e6970cf28c1fa11d305ac233db 100644 +index 2bc29728f2731f56c144185757b7932aa6c038dd..b3697cffbf9e0ef637c547167b5b9091a3b9bf40 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1341,6 +1341,7 @@ public class PurpurWorldConfig { - +@@ -1707,6 +1707,7 @@ public class PurpurWorldConfig { + public boolean striderControllable = true; public double striderMaxHealth = 20.0D; public int striderBreedingTicks = 6000; + public boolean striderGiveSaddleBack = false; private void striderSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.strider.attributes.max-health", striderMaxHealth); -@@ -1349,6 +1350,7 @@ public class PurpurWorldConfig { + striderRidable = getBoolean("mobs.strider.ridable", striderRidable); + striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); +@@ -1718,6 +1719,7 @@ public class PurpurWorldConfig { } striderMaxHealth = getDouble("mobs.strider.attributes.max_health", striderMaxHealth); striderBreedingTicks = getInt("mobs.strider.breeding-delay-ticks", striderBreedingTicks); + striderGiveSaddleBack = getBoolean("mobs.strider.give-saddle-back", striderGiveSaddleBack); } - public double traderLlamaMaxHealthMin = 15.0D; + public boolean tadpoleRidable = false; diff --git a/patches/server/0118-Full-netherite-armor-grants-fire-resistance.patch b/patches/server/0118-Full-netherite-armor-grants-fire-resistance.patch index f4bf39eee..94b4ff1bb 100644 --- a/patches/server/0118-Full-netherite-armor-grants-fire-resistance.patch +++ b/patches/server/0118-Full-netherite-armor-grants-fire-resistance.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Full netherite armor grants fire resistance diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index f67bd221a239d98151e055f444795dea28a07269..2f6856a29cb8dd7c84e3bf4bb4af6293fba0760e 100644 +index fa2a0cc24bbe31abd49ce0f3f41bab2aa5d9c81f..ca16f896ede5cfb957849ef3ad1f90f6518659dc 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java @@ -366,6 +366,16 @@ public abstract class Player extends LivingEntity { @@ -13,12 +13,12 @@ index f67bd221a239d98151e055f444795dea28a07269..2f6856a29cb8dd7c84e3bf4bb4af6293 } + // Purpur start -+ if (this.level.purpurConfig.playerNetheriteFireResistanceDuration > 0 && this.level.getGameTime() % 20 == 0) { ++ if (this.level().purpurConfig.playerNetheriteFireResistanceDuration > 0 && this.level.getGameTime() % 20 == 0) { + if (itemstack.is(Items.NETHERITE_HELMET) + && this.getItemBySlot(EquipmentSlot.CHEST).is(Items.NETHERITE_CHESTPLATE) + && this.getItemBySlot(EquipmentSlot.LEGS).is(Items.NETHERITE_LEGGINGS) + && this.getItemBySlot(EquipmentSlot.FEET).is(Items.NETHERITE_BOOTS)) { -+ this.addEffect(new MobEffectInstance(MobEffects.FIRE_RESISTANCE, this.level.purpurConfig.playerNetheriteFireResistanceDuration, this.level.purpurConfig.playerNetheriteFireResistanceAmplifier, this.level.purpurConfig.playerNetheriteFireResistanceAmbient, this.level.purpurConfig.playerNetheriteFireResistanceShowParticles, this.level.purpurConfig.playerNetheriteFireResistanceShowIcon), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.NETHERITE_ARMOR); ++ this.addEffect(new MobEffectInstance(MobEffects.FIRE_RESISTANCE, this.level().purpurConfig.playerNetheriteFireResistanceDuration, this.level().purpurConfig.playerNetheriteFireResistanceAmplifier, this.level().purpurConfig.playerNetheriteFireResistanceAmbient, this.level().purpurConfig.playerNetheriteFireResistanceShowParticles, this.level().purpurConfig.playerNetheriteFireResistanceShowIcon), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.NETHERITE_ARMOR); + } + } + // Purpur end @@ -26,7 +26,7 @@ index f67bd221a239d98151e055f444795dea28a07269..2f6856a29cb8dd7c84e3bf4bb4af6293 protected ItemCooldowns createItemCooldowns() { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f319d80c225576e6970cf28c1fa11d305ac233db..06cb62b768168c06a7b454e0e7bb105b750729c3 100644 +index b3697cffbf9e0ef637c547167b5b9091a3b9bf40..63b8d72db812f29fbd82bc62fd21d0d53413bd79 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -297,6 +297,19 @@ public class PurpurWorldConfig { diff --git a/patches/server/0120-Add-mobGriefing-bypass-to-everything-affected.patch b/patches/server/0120-Add-mobGriefing-bypass-to-everything-affected.patch index 58ba360cf..6bdee5c2d 100644 --- a/patches/server/0120-Add-mobGriefing-bypass-to-everything-affected.patch +++ b/patches/server/0120-Add-mobGriefing-bypass-to-everything-affected.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add mobGriefing bypass to everything affected diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 1d0d22c9d3b8c907502b8fb044ebf8c5c49f6885..eac15c03b842840a47a0b2d1b0f3ea3920a621a5 100644 +index 27df4e881e850a73947651ce7ad98df5159f4c1c..182436020d2376101f5863f80b4b6d3d9ebd6a2e 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -1767,7 +1767,7 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -18,7 +18,7 @@ index 1d0d22c9d3b8c907502b8fb044ebf8c5c49f6885..eac15c03b842840a47a0b2d1b0f3ea39 BlockState iblockdata = Blocks.WITHER_ROSE.defaultBlockState(); diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 4fbc1fa9d3d37129b2ef243b65844dce9fe44884..1f1c7a8668dcdf7850720b46b395322601dbf9a0 100644 +index 0bdd8bcb37a899c1a4191ba13c0922f3385f020f..b0ce2885a304cb15964a1d3bf047c49f95ab594d 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java @@ -701,7 +701,7 @@ public abstract class Mob extends LivingEntity implements Targeting { @@ -57,7 +57,7 @@ index 4253b3b1263a7ae5a2f5f3a34674dfea615a81ea..a987c94fd321f51241c405659d6a0b23 @Override diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/EatBlockGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/EatBlockGoal.java -index abf796c3369da6b73c8587dfc05f56d0b8933fde..95dc62687d10e5c6f54baadda4a725094c52c07f 100644 +index abf796c3369da6b73c8587dfc05f56d0b8933fde..f169bb0ca0d1f7bd1507436beca806a790d6b7d2 100644 --- a/src/main/java/net/minecraft/world/entity/ai/goal/EatBlockGoal.java +++ b/src/main/java/net/minecraft/world/entity/ai/goal/EatBlockGoal.java @@ -69,7 +69,7 @@ public class EatBlockGoal extends Goal { @@ -65,7 +65,7 @@ index abf796c3369da6b73c8587dfc05f56d0b8933fde..95dc62687d10e5c6f54baadda4a72509 if (EatBlockGoal.IS_TALL_GRASS.test(this.level.getBlockState(blockposition))) { // CraftBukkit - if (!CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockposition, Blocks.AIR.defaultBlockState(), !this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)).isCancelled()) { -+ if (!CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockposition, Blocks.AIR.defaultBlockState(), !this.level.purpurConfig.sheepBypassMobGriefing && !this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)).isCancelled()) { // Purpur ++ if (!CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockposition, Blocks.AIR.defaultBlockState(), !this.level().purpurConfig.sheepBypassMobGriefing && !this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)).isCancelled()) { // Purpur this.level.destroyBlock(blockposition, false); } @@ -74,7 +74,7 @@ index abf796c3369da6b73c8587dfc05f56d0b8933fde..95dc62687d10e5c6f54baadda4a72509 if (this.level.getBlockState(blockposition1).is(Blocks.GRASS_BLOCK)) { // CraftBukkit - if (!CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockposition1, Blocks.DIRT.defaultBlockState(), !this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)).isCancelled()) { // Paper - Fix wrong block state -+ if (!CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockposition1, Blocks.DIRT.defaultBlockState(), !this.level.purpurConfig.sheepBypassMobGriefing && !this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)).isCancelled()) { // Paper - Fix wrong block state // Purpur ++ if (!CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockposition1, Blocks.DIRT.defaultBlockState(), !this.level().purpurConfig.sheepBypassMobGriefing && !this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)).isCancelled()) { // Paper - Fix wrong block state // Purpur this.level.levelEvent(2001, blockposition1, Block.getId(Blocks.GRASS_BLOCK.defaultBlockState())); this.level.setBlock(blockposition1, Blocks.DIRT.defaultBlockState(), 2); } @@ -92,7 +92,7 @@ index 0035461aff86fa3f44c860e7d77589b974446048..8c08457b5a9ade9b602851c9a12b015e } else if (this.nextStartTick > 0) { --this.nextStartTick; diff --git a/src/main/java/net/minecraft/world/entity/animal/Fox.java b/src/main/java/net/minecraft/world/entity/animal/Fox.java -index 2232af2cef82014570596c122e11a47d3ae15b9b..eca7c43ac555417b0746ebb20f67978fa801af59 100644 +index 989dc460d8a21b8e54ff4464998c2b02a6a9dd37..aa190c36d32aef0413e6bf89621fa9b42be16d82 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java @@ -1377,7 +1377,7 @@ public class Fox extends Animal implements VariantHolder { @@ -105,7 +105,7 @@ index 2232af2cef82014570596c122e11a47d3ae15b9b..eca7c43ac555417b0746ebb20f67978f if (iblockdata.is(Blocks.SWEET_BERRY_BUSH)) { diff --git a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -index 857d4a70c8a9678e689ee0807f42cd5f7cc4902d..59aaa76f9c5b4639a632ef6ee67092983e7edf35 100644 +index c21d48eb213dac6c932edfe7c4161e76510450a4..c5de6e469030615d9afc64f24cc50f901a557840 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java @@ -637,7 +637,7 @@ public class Rabbit extends Animal implements VariantHolder { @@ -118,7 +118,7 @@ index 857d4a70c8a9678e689ee0807f42cd5f7cc4902d..59aaa76f9c5b4639a632ef6ee6709298 } diff --git a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -index f43c37505e9e7c171b62cfc0621e425f5726dc3d..1db7bb084674cea5dd2bbf4d5ed05048414aa85c 100644 +index ecc0f221fca332b6f4d8feb72dbafc52e1002a23..dc6b0446336b8d689f8273c9ffe1d3c27cf1281a 100644 --- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java @@ -127,7 +127,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM @@ -131,7 +131,7 @@ index f43c37505e9e7c171b62cfc0621e425f5726dc3d..1db7bb084674cea5dd2bbf4d5ed05048 } diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -index 587a6cd7bd4cb724a778f98677eb09b0eb494349..ce82644310d6f5fe4a60294004cd663c2c12f06b 100644 +index 81cf89bc57af0f43d05ba93256255155bf0c4d53..2b0aac1e4291549efa6391cb3b41492184c9aeda 100644 --- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java @@ -612,7 +612,7 @@ public class EnderDragon extends Mob implements Enemy { @@ -144,7 +144,7 @@ index 587a6cd7bd4cb724a778f98677eb09b0eb494349..ce82644310d6f5fe4a60294004cd663c // flag1 = this.level().removeBlock(blockposition, false) || flag1; flag1 = true; 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 52f6459b0bfff7991da6cb0deda1b15664c4d00b..aabc5523343e16974d7fb2af476ba84c9059f119 100644 +index b39a7dfb910e99f04275fa8e246581f5ccc27afa..f68f330e5a36f1c3cbf956a39b5b2886e30a37d2 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 @@ -496,7 +496,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob @@ -157,7 +157,7 @@ index 52f6459b0bfff7991da6cb0deda1b15664c4d00b..aabc5523343e16974d7fb2af476ba84c j = Mth.floor(this.getX()); int i1 = Mth.floor(this.getZ()); 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 094ed658eaedcd88461330de0816e29b7db8acd2..2189cf09f7d9299ff9a3e4b62d3e199caedfbc0d 100644 +index 47b82549b401acca5e9a5702d41674652ab6853f..87960051bd908822cf8c0d5c7b2d1faa6396c92f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java @@ -532,7 +532,15 @@ public class EnderMan extends Monster implements NeutralMob { @@ -195,7 +195,7 @@ index 094ed658eaedcd88461330de0816e29b7db8acd2..2189cf09f7d9299ff9a3e4b62d3e199c @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Evoker.java b/src/main/java/net/minecraft/world/entity/monster/Evoker.java -index f113c96af07eeceef2e51cd310d46b2763c8224b..629e29bfeb26f686d41a27218b3caca601018bed 100644 +index f71a70a72ba0bb01c26291ad9dbdd3b01bbf6ee7..ea2a2c56f94d03b73a5e3a06f91aee7fcb0867f4 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Evoker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Evoker.java @@ -341,7 +341,7 @@ public class Evoker extends SpellcasterIllager { @@ -208,7 +208,7 @@ index f113c96af07eeceef2e51cd310d46b2763c8224b..629e29bfeb26f686d41a27218b3caca6 } else { List list = Evoker.this.level().getNearbyEntities(Sheep.class, this.wololoTargeting, Evoker.this, Evoker.this.getBoundingBox().inflate(16.0D, 4.0D, 16.0D)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Ravager.java b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -index c35266d89bfacf193662738366a8c91943b29250..62ffd3ca6276df8e111198aae523ec7de47df691 100644 +index 990a4ef6e2eccc228b06ba4cb3aadfce0733de5f..e62cb511e78c272346a8735081d1b4b93a6d3c5d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java @@ -190,7 +190,7 @@ public class Ravager extends Raider { @@ -221,7 +221,7 @@ index c35266d89bfacf193662738366a8c91943b29250..62ffd3ca6276df8e111198aae523ec7d AABB axisalignedbb = this.getBoundingBox().inflate(0.2D); Iterator iterator = BlockPos.betweenClosed(Mth.floor(axisalignedbb.minX), Mth.floor(axisalignedbb.minY), Mth.floor(axisalignedbb.minZ), Mth.floor(axisalignedbb.maxX), Mth.floor(axisalignedbb.maxY), Mth.floor(axisalignedbb.maxZ)).iterator(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java -index 1d91686e354cffeec7431f0a70e22b39225ed2b7..b4b5f2d564accb4e7b0361af4f67d22185755d51 100644 +index 0a78b3231700ff4ec4bc6ab9d3cbaebc261601e1..dbde54c4a616d6baba672a470b9886c9714133b9 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java +++ b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java @@ -208,7 +208,7 @@ public class Silverfish extends Monster { @@ -243,7 +243,7 @@ index 1d91686e354cffeec7431f0a70e22b39225ed2b7..b4b5f2d564accb4e7b0361af4f67d221 BlockPos blockposition = BlockPos.containing(this.mob.getX(), this.mob.getY() + 0.5D, this.mob.getZ()).relative(this.selectedDirection); BlockState iblockdata = this.mob.level().getBlockState(blockposition); diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -index bd084cfaecee1098b29e03f75d64e3fecd10a1ea..98ee31528c93ae1a1d294d47c7722ac8b017edbe 100644 +index 24b8fc91775bc3a305b0293916600d34fdd7eb00..b40e43c94c7a7bb39e4428c4fa35f5697d8e954c 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java @@ -428,7 +428,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @@ -374,7 +374,7 @@ index 1942649e868fc985a488034c411a6721595ecc67..7495e0e8beedad59fff24ebf189b58b3 } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 06cb62b768168c06a7b454e0e7bb105b750729c3..86ad2600050ad695942ed3fdd5af910d5d6d8db0 100644 +index 63b8d72db812f29fbd82bc62fd21d0d53413bd79..3b53d35be4e5ddf0514556d8515c31ddf3bf6b3a 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -117,8 +117,11 @@ public class PurpurWorldConfig { @@ -437,236 +437,243 @@ index 06cb62b768168c06a7b454e0e7bb105b750729c3..86ad2600050ad695942ed3fdd5af910d + turtleEggsBypassMobGriefing = getBoolean("blocks.turtle_egg.bypass-mob-griefing", turtleEggsBypassMobGriefing); } - public double axolotlMaxHealth = 14.0D; -@@ -657,6 +672,7 @@ public class PurpurWorldConfig { + public boolean babiesAreRidable = true; +@@ -719,6 +734,7 @@ public class PurpurWorldConfig { public double creeperMaxHealth = 20.0D; public double creeperChargedChance = 0.0D; public boolean creeperAllowGriefing = true; + public boolean creeperBypassMobGriefing = false; private void creeperSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.creeper.attributes.max-health", creeperMaxHealth); -@@ -666,6 +682,7 @@ public class PurpurWorldConfig { + creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); + creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); +@@ -731,6 +747,7 @@ public class PurpurWorldConfig { creeperMaxHealth = getDouble("mobs.creeper.attributes.max_health", creeperMaxHealth); creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); creeperAllowGriefing = getBoolean("mobs.creeper.allow-griefing", creeperAllowGriefing); + creeperBypassMobGriefing = getBoolean("mobs.creeper.bypass-mob-griefing", creeperBypassMobGriefing); } - public double dolphinMaxHealth = 10.0D; -@@ -734,6 +751,7 @@ public class PurpurWorldConfig { - + public boolean dolphinRidable = false; +@@ -842,6 +859,7 @@ public class PurpurWorldConfig { + public double enderDragonMaxY = 320D; public double enderDragonMaxHealth = 200.0D; public boolean enderDragonAlwaysDropsFullExp = false; + public boolean enderDragonBypassMobGriefing = false; private void enderDragonSettings() { - if (PurpurConfig.version < 8) { - double oldValue = getDouble("mobs.ender_dragon.max-health", enderDragonMaxHealth); -@@ -746,11 +764,13 @@ public class PurpurWorldConfig { + enderDragonRidable = getBoolean("mobs.ender_dragon.ridable", enderDragonRidable); + enderDragonRidableInWater = getBoolean("mobs.ender_dragon.ridable-in-water", enderDragonRidableInWater); +@@ -858,6 +876,7 @@ public class PurpurWorldConfig { } enderDragonMaxHealth = getDouble("mobs.ender_dragon.attributes.max_health", enderDragonMaxHealth); enderDragonAlwaysDropsFullExp = getBoolean("mobs.ender_dragon.always-drop-full-exp", enderDragonAlwaysDropsFullExp); + enderDragonBypassMobGriefing = getBoolean("mobs.ender_dragon.bypass-mob-griefing", enderDragonBypassMobGriefing); } + public boolean endermanRidable = false; +@@ -866,6 +885,7 @@ public class PurpurWorldConfig { public double endermanMaxHealth = 40.0D; public boolean endermanAllowGriefing = true; public boolean endermanDespawnEvenWithBlock = false; + public boolean endermanBypassMobGriefing = false; private void endermanSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.enderman.attributes.max-health", endermanMaxHealth); -@@ -760,6 +780,7 @@ public class PurpurWorldConfig { + endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); + endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); +@@ -878,6 +898,7 @@ public class PurpurWorldConfig { endermanMaxHealth = getDouble("mobs.enderman.attributes.max_health", endermanMaxHealth); endermanAllowGriefing = getBoolean("mobs.enderman.allow-griefing", endermanAllowGriefing); endermanDespawnEvenWithBlock = getBoolean("mobs.enderman.can-despawn-with-held-block", endermanDespawnEvenWithBlock); + endermanBypassMobGriefing = getBoolean("mobs.enderman.bypass-mob-griefing", endermanBypassMobGriefing); } - public double endermiteMaxHealth = 8.0D; -@@ -773,6 +794,7 @@ public class PurpurWorldConfig { - } - + public boolean endermiteRidable = false; +@@ -900,6 +921,7 @@ public class PurpurWorldConfig { + public boolean evokerRidableInWater = true; + public boolean evokerControllable = true; public double evokerMaxHealth = 24.0D; + public boolean evokerBypassMobGriefing = false; private void evokerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.evoker.attributes.max-health", evokerMaxHealth); -@@ -780,11 +802,13 @@ public class PurpurWorldConfig { + evokerRidable = getBoolean("mobs.evoker.ridable", evokerRidable); + evokerRidableInWater = getBoolean("mobs.evoker.ridable-in-water", evokerRidableInWater); +@@ -910,6 +932,7 @@ public class PurpurWorldConfig { set("mobs.evoker.attributes.max_health", oldValue); } evokerMaxHealth = getDouble("mobs.evoker.attributes.max_health", evokerMaxHealth); + evokerBypassMobGriefing = getBoolean("mobs.evoker.bypass-mob-griefing", evokerBypassMobGriefing); } + public boolean foxRidable = false; +@@ -918,6 +941,7 @@ public class PurpurWorldConfig { public double foxMaxHealth = 10.0D; public boolean foxTypeChangesWithTulips = false; public int foxBreedingTicks = 6000; + public boolean foxBypassMobGriefing = false; private void foxSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.fox.attributes.max-health", foxMaxHealth); -@@ -794,6 +818,7 @@ public class PurpurWorldConfig { + foxRidable = getBoolean("mobs.fox.ridable", foxRidable); + foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); +@@ -930,6 +954,7 @@ public class PurpurWorldConfig { foxMaxHealth = getDouble("mobs.fox.attributes.max_health", foxMaxHealth); foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); foxBreedingTicks = getInt("mobs.fox.breeding-delay-ticks", foxBreedingTicks); + foxBypassMobGriefing = getBoolean("mobs.fox.bypass-mob-griefing", foxBypassMobGriefing); } - public int frogBreedingTicks = 6000; -@@ -1114,6 +1139,7 @@ public class PurpurWorldConfig { - } - + public boolean frogRidable = false; +@@ -1374,6 +1399,7 @@ public class PurpurWorldConfig { + public boolean piglinRidableInWater = true; + public boolean piglinControllable = true; public double piglinMaxHealth = 16.0D; + public boolean piglinBypassMobGriefing = false; private void piglinSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.piglin.attributes.max-health", piglinMaxHealth); -@@ -1121,6 +1147,7 @@ public class PurpurWorldConfig { + piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); + piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); +@@ -1384,6 +1410,7 @@ public class PurpurWorldConfig { set("mobs.piglin.attributes.max_health", oldValue); } piglinMaxHealth = getDouble("mobs.piglin.attributes.max_health", piglinMaxHealth); + piglinBypassMobGriefing = getBoolean("mobs.piglin.bypass-mob-griefing", piglinBypassMobGriefing); } - public double piglinBruteMaxHealth = 50.0D; -@@ -1134,6 +1161,7 @@ public class PurpurWorldConfig { - } - + public boolean piglinBruteRidable = false; +@@ -1406,6 +1433,7 @@ public class PurpurWorldConfig { + public boolean pillagerRidableInWater = true; + public boolean pillagerControllable = true; public double pillagerMaxHealth = 24.0D; + public boolean pillagerBypassMobGriefing = false; private void pillagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.pillager.attributes.max-health", pillagerMaxHealth); -@@ -1141,6 +1169,7 @@ public class PurpurWorldConfig { + pillagerRidable = getBoolean("mobs.pillager.ridable", pillagerRidable); + pillagerRidableInWater = getBoolean("mobs.pillager.ridable-in-water", pillagerRidableInWater); +@@ -1416,6 +1444,7 @@ public class PurpurWorldConfig { set("mobs.pillager.attributes.max_health", oldValue); } pillagerMaxHealth = getDouble("mobs.pillager.attributes.max_health", pillagerMaxHealth); + pillagerBypassMobGriefing = getBoolean("mobs.pillager.bypass-mob-griefing", pillagerBypassMobGriefing); } - public double polarBearMaxHealth = 30.0D; -@@ -1174,6 +1203,7 @@ public class PurpurWorldConfig { + public boolean polarBearRidable = false; +@@ -1462,6 +1491,7 @@ public class PurpurWorldConfig { public double rabbitNaturalToast = 0.0D; public double rabbitNaturalKiller = 0.0D; public int rabbitBreedingTicks = 6000; + public boolean rabbitBypassMobGriefing = false; private void rabbitSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.rabbit.attributes.max-health", rabbitMaxHealth); -@@ -1184,9 +1214,11 @@ public class PurpurWorldConfig { + rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); + rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); +@@ -1475,12 +1505,14 @@ public class PurpurWorldConfig { rabbitNaturalToast = getDouble("mobs.rabbit.spawn-toast-chance", rabbitNaturalToast); rabbitNaturalKiller = getDouble("mobs.rabbit.spawn-killer-rabbit-chance", rabbitNaturalKiller); rabbitBreedingTicks = getInt("mobs.rabbit.breeding-delay-ticks", rabbitBreedingTicks); + rabbitBypassMobGriefing = getBoolean("mobs.rabbit.bypass-mob-griefing", rabbitBypassMobGriefing); } + public boolean ravagerRidable = false; + public boolean ravagerRidableInWater = false; + public boolean ravagerControllable = true; public double ravagerMaxHealth = 100.0D; + public boolean ravagerBypassMobGriefing = false; private void ravagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.ravager.attributes.max-health", ravagerMaxHealth); -@@ -1194,6 +1226,7 @@ public class PurpurWorldConfig { + ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); + ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); +@@ -1491,6 +1523,7 @@ public class PurpurWorldConfig { set("mobs.ravager.attributes.max_health", oldValue); } ravagerMaxHealth = getDouble("mobs.ravager.attributes.max_health", ravagerMaxHealth); + ravagerBypassMobGriefing = getBoolean("mobs.ravager.bypass-mob-griefing", ravagerBypassMobGriefing); } - public double salmonMaxHealth = 3.0D; -@@ -1208,6 +1241,7 @@ public class PurpurWorldConfig { - + public boolean salmonRidable = false; +@@ -1512,6 +1545,7 @@ public class PurpurWorldConfig { + public boolean sheepControllable = true; public double sheepMaxHealth = 8.0D; public int sheepBreedingTicks = 6000; + public boolean sheepBypassMobGriefing = false; private void sheepSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.sheep.attributes.max-health", sheepMaxHealth); -@@ -1216,6 +1250,7 @@ public class PurpurWorldConfig { + sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); + sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); +@@ -1523,6 +1557,7 @@ public class PurpurWorldConfig { } sheepMaxHealth = getDouble("mobs.sheep.attributes.max_health", sheepMaxHealth); sheepBreedingTicks = getInt("mobs.sheep.breeding-delay-ticks", sheepBreedingTicks); + sheepBypassMobGriefing = getBoolean("mobs.sheep.bypass-mob-griefing", sheepBypassMobGriefing); } - public double shulkerMaxHealth = 30.0D; -@@ -1229,6 +1264,7 @@ public class PurpurWorldConfig { - } - + public boolean shulkerRidable = false; +@@ -1545,6 +1580,7 @@ public class PurpurWorldConfig { + public boolean silverfishRidableInWater = true; + public boolean silverfishControllable = true; public double silverfishMaxHealth = 8.0D; + public boolean silverfishBypassMobGriefing = false; private void silverfishSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.silverfish.attributes.max-health", silverfishMaxHealth); -@@ -1236,6 +1272,7 @@ public class PurpurWorldConfig { + silverfishRidable = getBoolean("mobs.silverfish.ridable", silverfishRidable); + silverfishRidableInWater = getBoolean("mobs.silverfish.ridable-in-water", silverfishRidableInWater); +@@ -1555,6 +1591,7 @@ public class PurpurWorldConfig { set("mobs.silverfish.attributes.max_health", oldValue); } silverfishMaxHealth = getDouble("mobs.silverfish.attributes.max_health", silverfishMaxHealth); + silverfishBypassMobGriefing = getBoolean("mobs.silverfish.bypass-mob-griefing", silverfishBypassMobGriefing); } - public double skeletonMaxHealth = 20.0D; -@@ -1293,6 +1330,7 @@ public class PurpurWorldConfig { + public boolean skeletonRidable = false; +@@ -1631,6 +1668,7 @@ public class PurpurWorldConfig { public int snowGolemSnowBallMax = 20; public float snowGolemSnowBallModifier = 10.0F; public double snowGolemAttackDistance = 1.25D; + public boolean snowGolemBypassMobGriefing = false; private void snowGolemSettings() { - snowGolemLeaveTrailWhenRidden = getBoolean("mobs.snow_golem.leave-trail-when-ridden", snowGolemLeaveTrailWhenRidden); - if (PurpurConfig.version < 10) { -@@ -1307,6 +1345,7 @@ public class PurpurWorldConfig { + snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); + snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); +@@ -1648,6 +1686,7 @@ public class PurpurWorldConfig { snowGolemSnowBallMax = getInt("mobs.snow_golem.max-shoot-interval-ticks", snowGolemSnowBallMax); snowGolemSnowBallModifier = (float) getDouble("mobs.snow_golem.snow-ball-modifier", snowGolemSnowBallModifier); snowGolemAttackDistance = getDouble("mobs.snow_golem.attack-distance", snowGolemAttackDistance); + snowGolemBypassMobGriefing = getBoolean("mobs.snow_golem.bypass-mob-griefing", snowGolemBypassMobGriefing); } - public double snifferMaxHealth = 14.0D; -@@ -1429,6 +1468,7 @@ public class PurpurWorldConfig { + public boolean snifferRidable = false; +@@ -1832,6 +1871,7 @@ public class PurpurWorldConfig { public boolean villagerCanBeLeashed = false; public boolean villagerCanBreed = true; public int villagerBreedingTicks = 6000; + public boolean villagerBypassMobGriefing = false; private void villagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.villager.attributes.max-health", villagerMaxHealth); -@@ -1440,6 +1480,7 @@ public class PurpurWorldConfig { + villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); + villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); +@@ -1846,6 +1886,7 @@ public class PurpurWorldConfig { villagerCanBeLeashed = getBoolean("mobs.villager.can-be-leashed", villagerCanBeLeashed); villagerCanBreed = getBoolean("mobs.villager.can-breed", villagerCanBreed); villagerBreedingTicks = getInt("mobs.villager.breeding-delay-ticks", villagerBreedingTicks); + villagerBypassMobGriefing = getBoolean("mobs.villager.bypass-mob-griefing", villagerBypassMobGriefing); } - public double vindicatorMaxHealth = 24.0D; -@@ -1481,6 +1522,7 @@ public class PurpurWorldConfig { + public boolean vindicatorRidable = false; +@@ -1918,6 +1959,7 @@ public class PurpurWorldConfig { public double witherMaxHealth = 300.0D; public float witherHealthRegenAmount = 1.0f; public int witherHealthRegenDelay = 20; + public boolean witherBypassMobGriefing = false; private void witherSettings() { - if (PurpurConfig.version < 8) { - double oldValue = getDouble("mobs.wither.max-health", witherMaxHealth); -@@ -1494,6 +1536,7 @@ public class PurpurWorldConfig { + witherRidable = getBoolean("mobs.wither.ridable", witherRidable); + witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); +@@ -1935,6 +1977,7 @@ public class PurpurWorldConfig { witherMaxHealth = getDouble("mobs.wither.attributes.max_health", witherMaxHealth); witherHealthRegenAmount = (float) getDouble("mobs.wither.health-regen-amount", witherHealthRegenAmount); witherHealthRegenDelay = getInt("mobs.wither.health-regen-delay", witherHealthRegenDelay); + witherBypassMobGriefing = getBoolean("mobs.wither.bypass-mob-griefing", witherBypassMobGriefing); } - public double witherSkeletonMaxHealth = 20.0D; -@@ -1544,6 +1587,7 @@ public class PurpurWorldConfig { + public boolean witherSkeletonRidable = false; +@@ -2006,6 +2049,7 @@ public class PurpurWorldConfig { public double zombieJockeyChance = 0.05D; public boolean zombieJockeyTryExistingChickens = true; public boolean zombieAggressiveTowardsVillagerWhenLagging = true; + public boolean zombieBypassMobGriefing = false; private void zombieSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.zombie.attributes.max-health", zombieMaxHealth); -@@ -1556,6 +1600,7 @@ public class PurpurWorldConfig { + zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); + zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); +@@ -2021,6 +2065,7 @@ public class PurpurWorldConfig { zombieJockeyChance = getDouble("mobs.zombie.jockey.chance", zombieJockeyChance); zombieJockeyTryExistingChickens = getBoolean("mobs.zombie.jockey.try-existing-chickens", zombieJockeyTryExistingChickens); zombieAggressiveTowardsVillagerWhenLagging = getBoolean("mobs.zombie.aggressive-towards-villager-when-lagging", zombieAggressiveTowardsVillagerWhenLagging); + zombieBypassMobGriefing = getBoolean("mobs.zombie.bypass-mob-griefing", zombieBypassMobGriefing); } - public double zombieHorseMaxHealthMin = 15.0D; + public boolean zombieHorseRidableInWater = false; diff --git a/patches/server/0124-Movement-options-for-armor-stands.patch b/patches/server/0124-Movement-options-for-armor-stands.patch index 60dea7dec..1af06131d 100644 --- a/patches/server/0124-Movement-options-for-armor-stands.patch +++ b/patches/server/0124-Movement-options-for-armor-stands.patch @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 9f213ed6b14c24fd9cb5fefb689d72032a883d09..67382c78e35110090e2f54f1fd11b12a19b2c529 100644 +index 68233db015138b0a615a65eac8c11afc42f7a1c6..8c2327fa0af4c2148cf6bab7f5960f81660c6259 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -1795,7 +1795,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -30,7 +30,7 @@ index 9f213ed6b14c24fd9cb5fefb689d72032a883d09..67382c78e35110090e2f54f1fd11b12a if (entity instanceof Boat) { diff --git a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java -index 1406cdd79c7183522f1f5c0b0edc6166ff9d4ed9..cfe4c6f3316a9bcb3fb77bbb839525bed5527b17 100644 +index 9eb196ee4061bb4c5713f33e8b16d91ec52711cd..59257815c1a3ec30e2c00f63a557c0555db77ef2 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java +++ b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java @@ -99,10 +99,12 @@ public class ArmorStand extends LivingEntity { @@ -54,8 +54,8 @@ index 1406cdd79c7183522f1f5c0b0edc6166ff9d4ed9..cfe4c6f3316a9bcb3fb77bbb839525be + // Purpur start + @Override + public void updateInWaterStateAndDoWaterCurrentPushing() { -+ if (this.level.purpurConfig.armorstandWaterMovement && -+ (this.level.purpurConfig.armorstandWaterFence || !(level.getBlockState(blockPosition().below()).getBlock() instanceof net.minecraft.world.level.block.FenceBlock))) ++ if (this.level().purpurConfig.armorstandWaterMovement && ++ (this.level().purpurConfig.armorstandWaterFence || !(level.getBlockState(blockPosition().below()).getBlock() instanceof net.minecraft.world.level.block.FenceBlock))) + super.updateInWaterStateAndDoWaterCurrentPushing(); + } + @@ -66,7 +66,7 @@ index 1406cdd79c7183522f1f5c0b0edc6166ff9d4ed9..cfe4c6f3316a9bcb3fb77bbb839525be + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f09bf510749064c34d4fb1401a68090529bb6d6b..ec0fdbe239a8b402ed9e2154904b31294a6f92b2 100644 +index 9e10f9f5299f0e56ccc50692e11f20605182a2c4..4b8514a938a9029ab9b1af8698beb12e1b33e039 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -101,10 +101,16 @@ public class PurpurWorldConfig { diff --git a/patches/server/0125-Fix-stuck-in-portals.patch b/patches/server/0125-Fix-stuck-in-portals.patch index 4c6f7db0e..0c572af7b 100644 --- a/patches/server/0125-Fix-stuck-in-portals.patch +++ b/patches/server/0125-Fix-stuck-in-portals.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Fix stuck in portals diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 4a133de61090ab78ad9bc7d02e30c917024711ab..eac27b6ff180369cd0c9423d176a5a7bf7406ab1 100644 +index faab60eb03989338f5376c22148c98a0407a36a5..0ecd8b6bf8696b6aac50b91f16450ba5925c0115 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -1271,6 +1271,7 @@ public class ServerPlayer extends Player { @@ -17,7 +17,7 @@ index 4a133de61090ab78ad9bc7d02e30c917024711ab..eac27b6ff180369cd0c9423d176a5a7b // CraftBukkit end this.setServerLevel(worldserver); diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 67382c78e35110090e2f54f1fd11b12a19b2c529..4a6c13e2f9835219161b3b83e0b3aecafb4eed73 100644 +index 8c2327fa0af4c2148cf6bab7f5960f81660c6259..10dca8fdfea6c4c98bd36684598fab425cbd348a 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -2996,12 +2996,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -27,9 +27,9 @@ index 67382c78e35110090e2f54f1fd11b12a19b2c529..4a6c13e2f9835219161b3b83e0b3aeca + public BlockPos portalPos = BlockPos.ZERO; // Purpur public void handleInsidePortal(BlockPos pos) { if (this.isOnPortalCooldown()) { -+ if (!(level.purpurConfig.playerFixStuckPortal && this instanceof Player && !pos.equals(portalPos))) // Purpur ++ if (!(level().purpurConfig.playerFixStuckPortal && this instanceof Player && !pos.equals(portalPos))) // Purpur this.setPortalCooldown(); - } else if (level.purpurConfig.entitiesCanUsePortals || this instanceof ServerPlayer) { // Purpur + } else if (level().purpurConfig.entitiesCanUsePortals || this instanceof ServerPlayer) { // Purpur if (!this.level().isClientSide && !pos.equals(this.portalEntrancePos)) { this.portalEntrancePos = pos.immutable(); + portalPos = BlockPos.ZERO; // Purpur @@ -37,7 +37,7 @@ index 67382c78e35110090e2f54f1fd11b12a19b2c529..4a6c13e2f9835219161b3b83e0b3aeca this.isInsidePortal = true; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index ec0fdbe239a8b402ed9e2154904b31294a6f92b2..a53c3fdbf11c8c33407aa0082f788848ac77dc34 100644 +index 4b8514a938a9029ab9b1af8698beb12e1b33e039..705c6b3ae0db79d0ef0a9eaea504381145b4af21 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -337,6 +337,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0126-Toggle-for-water-sensitive-mob-damage.patch b/patches/server/0126-Toggle-for-water-sensitive-mob-damage.patch index 7a9df70d3..8a8b4c452 100644 --- a/patches/server/0126-Toggle-for-water-sensitive-mob-damage.patch +++ b/patches/server/0126-Toggle-for-water-sensitive-mob-damage.patch @@ -5,39 +5,39 @@ Subject: [PATCH] Toggle for water sensitive mob damage diff --git a/src/main/java/net/minecraft/world/entity/GlowSquid.java b/src/main/java/net/minecraft/world/entity/GlowSquid.java -index 277a5868b3fc4bbb472086b4fb50e905b02621ba..4570f2859ed4251a2e9cf79ecbc7255523cbbc79 100644 +index b1ba0f24dd6f1ec4c60208564e4eb84bdcd457f4..1a67f46b57e398d23fbc495ee81ae62e0d84d3dc 100644 --- a/src/main/java/net/minecraft/world/entity/GlowSquid.java +++ b/src/main/java/net/minecraft/world/entity/GlowSquid.java @@ -46,6 +46,11 @@ public class GlowSquid extends Squid { - return this.level.purpurConfig.glowSquidsCanFly; + return this.level().purpurConfig.glowSquidsCanFly; } + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.glowSquidTakeDamageFromWater; ++ return this.level().purpurConfig.glowSquidTakeDamageFromWater; + } + @Override protected ParticleOptions getInkParticle() { return ParticleTypes.GLOW_SQUID_INK; diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -index 052304db93aa2996d292df6b5d1e8593351239e4..b4c0f7b8841c536e700c80248d12ca2f0a507e6f 100644 +index 0dc811f18724d3142561c0dddf840dbbb28bb12e..81bf59b7b41835dc034f2880c8eac89ff396b695 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java @@ -290,6 +290,11 @@ public class Bat extends AmbientCreature { - this.getAttribute(Attributes.ATTACK_KNOCKBACK).setBaseValue(this.level.purpurConfig.batAttackKnockback); + this.getAttribute(Attributes.ATTACK_KNOCKBACK).setBaseValue(this.level().purpurConfig.batAttackKnockback); } + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.batTakeDamageFromWater; ++ return this.level().purpurConfig.batTakeDamageFromWater; + } + @Override public void readAdditionalSaveData(CompoundTag nbt) { super.readAdditionalSaveData(nbt); 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 e0ab585b708fd58db9688fc4631eaacd79a7c8a3..f68dd3af977190e310d6854ba251b0f12f914c70 100644 +index 944497d617f3c6474e51fa8146dd9f0c407b1b48..33f9b39d770262dd56ef17b0ec59c3175be32ff6 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java @@ -175,7 +175,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { @@ -50,179 +50,179 @@ index e0ab585b708fd58db9688fc4631eaacd79a7c8a3..f68dd3af977190e310d6854ba251b0f1 this.setPathfindingMalus(BlockPathTypes.COCOA, -1.0F); this.setPathfindingMalus(BlockPathTypes.FENCE, -1.0F); @@ -476,6 +476,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { - return this.level.purpurConfig.beeBreedingTicks; + return this.level().purpurConfig.beeBreedingTicks; } + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.beeTakeDamageFromWater; ++ return this.level().purpurConfig.beeTakeDamageFromWater; + } + @Override public int getRemainingPersistentAngerTime() { return (Integer) this.entityData.get(Bee.DATA_REMAINING_ANGER_TIME); diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java -index bb827b0a7273a2636d01a506fae09d32e99db178..fa437d0af82292797c1e4432c57a8384c7aacdc4 100644 +index 956f125c9ae62537570bb9870be66872f3519f6a..1554e4a0e068e06ec121adf56421f8332132f062 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java @@ -132,6 +132,11 @@ public class Cat extends TamableAnimal implements VariantHolder { - return this.level.purpurConfig.catBreedingTicks; + return this.level().purpurConfig.catBreedingTicks; } + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.catTakeDamageFromWater; ++ return this.level().purpurConfig.catTakeDamageFromWater; + } + public ResourceLocation getResourceLocation() { return this.getVariant().texture(); } diff --git a/src/main/java/net/minecraft/world/entity/animal/Chicken.java b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -index 5ad29dda33d3d7442992b2d47f44d419dda3021b..970e4274edf409fbf61c267e32075426d00480d1 100644 +index 86b910cbb8d0e19dc9ae53078e730495bf4a3b87..6fe3e62ba4534e821937baa14d728186f8c6439e 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Chicken.java +++ b/src/main/java/net/minecraft/world/entity/animal/Chicken.java @@ -84,6 +84,11 @@ public class Chicken extends Animal { - return this.level.purpurConfig.chickenBreedingTicks; + return this.level().purpurConfig.chickenBreedingTicks; } + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.chickenTakeDamageFromWater; ++ return this.level().purpurConfig.chickenTakeDamageFromWater; + } + @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); diff --git a/src/main/java/net/minecraft/world/entity/animal/Cod.java b/src/main/java/net/minecraft/world/entity/animal/Cod.java -index d6a9281208f6462628e5e9547c40590a42be89d0..dd4a116dfe471eaca9a7915db430d39ea8a81915 100644 +index 3d61c2d5da103de68242c16d85c703813979d179..2343325fa9a771de7b9445cda24a2bcd7a7c1761 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cod.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cod.java @@ -30,6 +30,11 @@ public class Cod extends AbstractSchoolingFish { + this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.codMaxHealth); } - // Purpur end + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.codTakeDamageFromWater; ++ return this.level().purpurConfig.codTakeDamageFromWater; + } + @Override public ItemStack getBucketItemStack() { return new ItemStack(Items.COD_BUCKET); diff --git a/src/main/java/net/minecraft/world/entity/animal/Cow.java b/src/main/java/net/minecraft/world/entity/animal/Cow.java -index fd8ec46ccb691d7f85a7a6bb44e1d0db3703b4d6..3f67e626b66cf64034dcc9ebf35244631b081516 100644 +index 1d17a9fcf80278779703e5cdd390ef0e52f9e437..008ce5fed911484b6207eb711f5d1dfcc6348984 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java @@ -70,6 +70,11 @@ public class Cow extends Animal { - return this.level.purpurConfig.cowBreedingTicks; + return this.level().purpurConfig.cowBreedingTicks; } + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.cowTakeDamageFromWater; ++ return this.level().purpurConfig.cowTakeDamageFromWater; + } + @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); diff --git a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java -index 584b812c86d4f7180d971b5ad263c549dec51e61..6371c835989dda0ed5048667875ac1ae34ba0cf7 100644 +index c9bc4eec14f40a31dbbe928f14277b12044c3089..d7f1a0ddad919fe87be29c16d6ef442cb5692fde 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java +++ b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java @@ -159,6 +159,11 @@ public class Dolphin extends WaterAnimal { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.dolphinMaxHealth); } - // Purpur end + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.dolphinTakeDamageFromWater; ++ return this.level().purpurConfig.dolphinTakeDamageFromWater; + } + @Nullable @Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, @Nullable SpawnGroupData entityData, @Nullable CompoundTag entityNbt) { diff --git a/src/main/java/net/minecraft/world/entity/animal/Fox.java b/src/main/java/net/minecraft/world/entity/animal/Fox.java -index eca7c43ac555417b0746ebb20f67978fa801af59..35491e36fbab850110ae4fd255cc0acd1e9d8792 100644 +index aa190c36d32aef0413e6bf89621fa9b42be16d82..1cc0f08a1b63a6786d62fb1ee120e47f1b622d52 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java @@ -191,6 +191,11 @@ public class Fox extends Animal implements VariantHolder { - return this.level.purpurConfig.foxBreedingTicks; + return this.level().purpurConfig.foxBreedingTicks; } + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.foxTakeDamageFromWater; ++ return this.level().purpurConfig.foxTakeDamageFromWater; + } + @Override protected void defineSynchedData() { super.defineSynchedData(); diff --git a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -index 1a4992dbe62b908b21f6b44b39a55237e7127cde..b89f01408c9ebaeeee93f1924010be6db89f1c66 100644 +index 95ff109511c97d603aeaf9e73c49397a841fcbce..58539d29b8e2a8c0676cc574f64e7d61613e1451 100644 --- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java @@ -88,6 +88,11 @@ public class IronGolem extends AbstractGolem implements NeutralMob { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.ironGolemMaxHealth); } + // Purpur end + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.ironGolemTakeDamageFromWater; ++ return this.level().purpurConfig.ironGolemTakeDamageFromWater; + } + @Override protected void registerGoals() { - if (level.purpurConfig.ironGolemCanSwim) this.goalSelector.addGoal(0, new net.minecraft.world.entity.ai.goal.FloatGoal(this)); // Purpur + if (level().purpurConfig.ironGolemCanSwim) this.goalSelector.addGoal(0, new net.minecraft.world.entity.ai.goal.FloatGoal(this)); // Purpur diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index 6bc5cca1c0896dda25af505e7ff3d68e5e83a54b..d7705035b80f92b9053b16ae413f82b85624ab76 100644 +index 7fd50f60aab2fa49a8227f313352a2ee251904c8..56fb35206af7e04a78eba489d444135176188a20 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java @@ -90,6 +90,11 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder { - return this.level.purpurConfig.rabbitBreedingTicks; + return this.level().purpurConfig.rabbitBreedingTicks; } + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.rabbitTakeDamageFromWater; ++ return this.level().purpurConfig.rabbitTakeDamageFromWater; + } + // CraftBukkit start - code from constructor public void initializePathFinderGoals(){ this.setSpeedModifier(0.0D); diff --git a/src/main/java/net/minecraft/world/entity/animal/Salmon.java b/src/main/java/net/minecraft/world/entity/animal/Salmon.java -index a1ad0c0eb4c7b6d39bc24be24b8d511697a5b628..e28290c96da8e27fa6d61cf0ad1684e6787cb19b 100644 +index 742805994f29a18af444912b10af631d2c60cacf..e101c3bf425902908c43ffa18867fb83a5e1f16e 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Salmon.java +++ b/src/main/java/net/minecraft/world/entity/animal/Salmon.java @@ -30,6 +30,11 @@ public class Salmon extends AbstractSchoolingFish { + this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.salmonMaxHealth); } - // Purpur end + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.salmonTakeDamageFromWater; ++ return this.level().purpurConfig.salmonTakeDamageFromWater; + } + @Override public int getMaxSchoolSize() { return 5; diff --git a/src/main/java/net/minecraft/world/entity/animal/Sheep.java b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -index fbaa05f3564aeaf31bfaac34ef0112d11869a2c8..c5f4e9d3774eefc43b5b5b4bf895efbb06ae2a9e 100644 +index c3b79c109e895cb4460571c8816b210455126f1d..35decea07efa8ca9f7ed896be9b8f3eb5afbf082 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java +++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java @@ -144,6 +144,11 @@ public class Sheep extends Animal implements Shearable { - return this.level.purpurConfig.sheepBreedingTicks; + return this.level().purpurConfig.sheepBreedingTicks; } + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.sheepTakeDamageFromWater; ++ return this.level().purpurConfig.sheepTakeDamageFromWater; + } + @Override protected void registerGoals() { this.eatBlockGoal = new EatBlockGoal(this); diff --git a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -index 1db7bb084674cea5dd2bbf4d5ed05048414aa85c..cfdc9b1341bafc9c92a520b1793add877336a8a3 100644 +index dc6b0446336b8d689f8273c9ffe1d3c27cf1281a..2acd9fdd1b311f00cc5fae7d879427ededdeecec 100644 --- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java @@ -116,7 +116,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM @@ -342,12 +342,12 @@ index 1db7bb084674cea5dd2bbf4d5ed05048414aa85c..cfdc9b1341bafc9c92a520b1793add87 @Override public boolean isSensitiveToWater() { - return true; -+ return this.level.purpurConfig.snowGolemTakeDamageFromWater; // Purpur ++ return this.level().purpurConfig.snowGolemTakeDamageFromWater; // Purpur } @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Squid.java b/src/main/java/net/minecraft/world/entity/animal/Squid.java -index 2658be0f3535243b5a434917c9400332246ffcbe..6e52d61dae3956ae165c4e1b7a1992e57419edc8 100644 +index 1431d7f295614641c1a5a5197f4bac3fd0cd9d71..80192e663bf8998d38fb3933894608327e50c46c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Squid.java +++ b/src/main/java/net/minecraft/world/entity/animal/Squid.java @@ -92,6 +92,11 @@ public class Squid extends WaterAnimal { @@ -356,46 +356,46 @@ index 2658be0f3535243b5a434917c9400332246ffcbe..6e52d61dae3956ae165c4e1b7a1992e5 + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.squidTakeDamageFromWater; ++ return this.level().purpurConfig.squidTakeDamageFromWater; + } + @Override protected void registerGoals() { this.goalSelector.addGoal(0, new Squid.SquidRandomMovementGoal(this)); diff --git a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -index 1904e78ad39d2dd8e4dfbc64d187065a860b2103..edf1092f32e24abcefc73b173bde56224121f97a 100644 +index 7d02e552a27632939bb9c40a62f4e0df7bd60bbc..b16d075581a352714f86f1b87805f24c9e336aa3 100644 --- a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java +++ b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java @@ -59,6 +59,11 @@ public class TropicalFish extends AbstractSchoolingFish implements VariantHolder + this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.tropicalFishMaxHealth); } - // Purpur end + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.tropicalFishTakeDamageFromWater; ++ return this.level().purpurConfig.tropicalFishTakeDamageFromWater; + } + public static String getPredefinedName(int variant) { return "entity.minecraft.tropical_fish.predefined." + variant; } diff --git a/src/main/java/net/minecraft/world/entity/animal/Turtle.java b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -index 726b53822d115fdd6f8911258ff9fc612a4ad54e..4505783c91992085bfc2965f4a78a0b5df21de77 100644 +index c04e77f8c5c1c8c038a9c8f76546b683691c6b2a..5c2fc833dac13dd8b959f035abb74432ec6c82c9 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java +++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java @@ -110,6 +110,11 @@ public class Turtle extends Animal { - return this.level.purpurConfig.turtleBreedingTicks; + return this.level().purpurConfig.turtleBreedingTicks; } + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.turtleTakeDamageFromWater; ++ return this.level().purpurConfig.turtleTakeDamageFromWater; + } + public void setHomePos(BlockPos pos) { this.entityData.set(Turtle.HOME_POS, pos.immutable()); // Paper - called with mutablepos... } diff --git a/src/main/java/net/minecraft/world/entity/animal/Wolf.java b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -index 8eb72d7f29bf9085bda1decc43f89125c14b1a2b..1054218628fdefc1aa5356de25ebe4f2672ee3de 100644 +index 6b270c1aa37096443701d7f4fbdab006afe2556c..4cd58a67c0af8019e802812c1e2ff893591d4c5f 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java @@ -209,6 +209,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { @@ -404,110 +404,110 @@ index 8eb72d7f29bf9085bda1decc43f89125c14b1a2b..1054218628fdefc1aa5356de25ebe4f2 + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.wolfTakeDamageFromWater; ++ return this.level().purpurConfig.wolfTakeDamageFromWater; + } + @Override protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index be44bbd6dd3278ae533f07bbd1f4fb3727f177b7..1f3618fc9679ad3938c2939b192132125b0e2201 100644 +index 8b69eaf846d746e8c4a0d45378d85edcbfa4daf2..b0b0176ce1660d71fbbb96e60bba43f8deff3cd8 100644 --- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java @@ -125,6 +125,11 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder getModelRotationValues() { return this.modelRotationValues; diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -index 4f7256e6e130be1e84be3b2979b836021460aceb..fde16c2060bcf1af102ce8fa5cbcacc58dbd5b1e 100644 +index 93b15328e00ee81925419aeb54ca2c3873aea924..fad539b4804204b9d5730962e6a7de114dda3f1a 100644 --- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java +++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java @@ -111,6 +111,11 @@ public class Goat extends Animal { - return this.level.purpurConfig.goatBreedingTicks; + return this.level().purpurConfig.goatBreedingTicks; } + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.goatTakeDamageFromWater; ++ return this.level().purpurConfig.goatTakeDamageFromWater; + } + @Override protected Brain.Provider brainProvider() { return Brain.provider(Goat.MEMORY_TYPES, Goat.SENSOR_TYPES); diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java b/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java -index a9e04b76c0a3831e6b136136ae15dd9884d68148..21f17176d1e10aa036fbc470d4864611855f79ce 100644 +index 6932d0eafbeca9de80728c6b0ae42340d2297ad0..af4bac165cbc39fb6959983a1116a6fb65af0ecb 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java @@ -42,6 +42,11 @@ public class Donkey extends AbstractChestedHorse { - return this.level.purpurConfig.donkeyBreedingTicks; + return this.level().purpurConfig.donkeyBreedingTicks; } + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.donkeyTakeDamageFromWater; ++ return this.level().purpurConfig.donkeyTakeDamageFromWater; + } + @Override protected SoundEvent getAmbientSound() { return SoundEvents.DONKEY_AMBIENT; diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java b/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java -index 65fec83d96a02bd3b7c9ba034db95a2bb0833dba..b47d9039bc4a7cfd4fa5f31aeb02f72283aaf64b 100644 +index 0251ded48eb5bdf96f0e67f6456aa15909c8a4ff..f8dbea402f723bf38d7ab3f2468d1b02b7124560 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java @@ -67,6 +67,11 @@ public class Horse extends AbstractHorse implements VariantHolder { - return this.level.purpurConfig.horseBreedingTicks; + return this.level().purpurConfig.horseBreedingTicks; } + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.horseTakeDamageFromWater; ++ return this.level().purpurConfig.horseTakeDamageFromWater; + } + @Override protected void randomizeAttributes(RandomSource random) { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue((double)generateMaxHealth(random::nextInt)); diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index 80a7bc90fb4040afd2f7f0b19f5f6dbb6f9d13e8..9440c55671473e717ad1019019c5edd38898e387 100644 +index 5f7e564154bccd1329ad1966a8ce388282107183..2c5f4ead1141269a029176140c4df848c75b9620 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java @@ -143,6 +143,11 @@ public class Llama extends AbstractChestedHorse implements VariantHolder type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { return checkMonsterSpawnRules(type, world, spawnReason, pos, random) && (spawnReason == MobSpawnType.SPAWNER || world.canSeeSky(pos)); } diff --git a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java -index d85f8e126832193d6080328d474312d30a81c301..18edadaaddc68ee6aafaf35bd4b38f1c15d41493 100644 +index 0f3e6c19e55a18cde71f3cb84c1e92b433ebcb7f..91294d87521c884c402485b923691f9fd8985353 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java +++ b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java @@ -83,6 +83,11 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.illusionerMaxHealth); } - // Purpur end + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.illusionerTakeDamageFromWater; ++ return this.level().purpurConfig.illusionerTakeDamageFromWater; + } + @Override protected void registerGoals() { super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java -index 291e7a1331aade8a413d132d215bc494440b9f51..9e84790e77802a23fbbf7df24cc302958d5304b1 100644 +index b472309f97b24f1d7b97d8b6d464c479c2d602d5..e0ebc4c2d8dd718ce78d981a1d099e7482221f1f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java +++ b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java @@ -67,6 +67,11 @@ public class MagmaCube extends Slime { + return level().purpurConfig.magmaCubeAttackDamageCache; } - // Purpur end + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.magmaCubeTakeDamageFromWater; ++ return this.level().purpurConfig.magmaCubeTakeDamageFromWater; + } + public static AttributeSupplier.Builder createAttributes() { return Monster.createMonsterAttributes().add(Attributes.MOVEMENT_SPEED, (double)0.2F); } diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -index 518c1cdf1459a8ac97c7ab39461cca074bad5bcf..33e2f87c38fdbd79c3dcccc0c0dada5e05f78871 100644 +index a9a942896dd428cd974970cac16857c27d08a7ec..6ae67916366ebdc5eed859c4c821e852781c5441 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java @@ -119,6 +119,11 @@ public class Phantom extends FlyingMob implements Enemy { @@ -832,142 +832,142 @@ index 518c1cdf1459a8ac97c7ab39461cca074bad5bcf..33e2f87c38fdbd79c3dcccc0c0dada5e + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.phantomTakeDamageFromWater; ++ return this.level().purpurConfig.phantomTakeDamageFromWater; + } + @Override public boolean isFlapping() { return (this.getUniqueFlapTickOffset() + this.tickCount) % Phantom.TICKS_PER_FLAP == 0; diff --git a/src/main/java/net/minecraft/world/entity/monster/Pillager.java b/src/main/java/net/minecraft/world/entity/monster/Pillager.java -index 594573c2e1f27617dc11e72b97eaf4b6de12e8ed..0e5c2437419518d95186ff2c067bead47b60ef2b 100644 +index 6a6349c7002439965422aa4979682b4ce6dfba1e..1f64dc8442de75447c17ae4fd5483345d4b7fd3e 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Pillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Pillager.java @@ -84,6 +84,11 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.pillagerMaxHealth); } - // Purpur end + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.pillagerTakeDamageFromWater; ++ return this.level().purpurConfig.pillagerTakeDamageFromWater; + } + @Override protected void registerGoals() { super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Ravager.java b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -index 62ffd3ca6276df8e111198aae523ec7de47df691..fb4e452e6c7e8701a3b2ebfe28a458026040c0e2 100644 +index e62cb511e78c272346a8735081d1b4b93a6d3c5d..6180ebf48c64fc004f33ecc382953e72f2fb7578 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java @@ -93,6 +93,11 @@ public class Ravager extends Raider { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.ravagerMaxHealth); } - // Purpur end + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.ravagerTakeDamageFromWater; ++ return this.level().purpurConfig.ravagerTakeDamageFromWater; + } + @Override protected void registerGoals() { super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Shulker.java b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -index ba3246b099ae13f83b4aa94903192018518c2b6e..f328cac216a0f2a3e4956ab65d083caf072351d0 100644 +index 73c1c023e2c0511bca866cfbef86a9f4fa688592..8680668d97cbb737a72315ff5d3a68b30d14ffa6 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java @@ -120,6 +120,11 @@ public class Shulker extends AbstractGolem implements VariantHolder type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { BlockPos blockPos = pos; diff --git a/src/main/java/net/minecraft/world/entity/monster/Strider.java b/src/main/java/net/minecraft/world/entity/monster/Strider.java -index 43459013151fc93c5707112161b212da88930e00..c942f7f5df032b32a51e1f60a90af54385327e1c 100644 +index 4c077c94b654f54465ece2aa45c5ead0a417ad0d..88fc9317aeac79f3352fc8955f8c4f6b3f87eddc 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Strider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java @@ -94,7 +94,7 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { @@ -984,610 +984,667 @@ index 43459013151fc93c5707112161b212da88930e00..c942f7f5df032b32a51e1f60a90af543 @Override public boolean isSensitiveToWater() { - return true; -+ return this.level.purpurConfig.striderTakeDamageFromWater; // Purpur ++ return this.level().purpurConfig.striderTakeDamageFromWater; // Purpur } @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Vex.java b/src/main/java/net/minecraft/world/entity/monster/Vex.java -index f63b6c2a61af9b518a59aba4152a76afbf8df592..c2464a01feeb470db88c25c95011ad0175a90917 100644 +index 764fdf4654b4fa2184493b77976fc29aedf592c2..3d79723a6b1d5e099d70bb82917ee551d9f2df7e 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vex.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vex.java @@ -112,6 +112,11 @@ public class Vex extends Monster implements TraceableEntity { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.vexMaxHealth); } - // Purpur end + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.vexTakeDamageFromWater; ++ return this.level().purpurConfig.vexTakeDamageFromWater; + } + @Override protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) { return dimensions.height - 0.28125F; diff --git a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java -index db832e9c8287d0f62db65ff3a2d2625541758762..1c9a54e6b67f9e688130f1cb9c1e5411c6e75e37 100644 +index 2a5b6b94b15bf066b5722e7a4f782bc87f9debf4..34a6105c04d107278c18f3b2829282b227c5c5c5 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java @@ -80,6 +80,11 @@ public class Vindicator extends AbstractIllager { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.vindicatorMaxHealth); } - // Purpur end + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.vindicatorTakeDamageFromWater; ++ return this.level().purpurConfig.vindicatorTakeDamageFromWater; + } + @Override protected void registerGoals() { super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Witch.java b/src/main/java/net/minecraft/world/entity/monster/Witch.java -index 2ca044d6ab0acf56fbbe43e936c844d370c1d97c..53a2999a84e68938b5e976ccd8a61cad1c5a397a 100644 +index 289c9261d0019b558c4447a75b3b03229cdd9498..d49813eeaf417806a16ff7d9b7ef8a9c30cfe8d6 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Witch.java +++ b/src/main/java/net/minecraft/world/entity/monster/Witch.java @@ -79,6 +79,11 @@ public class Witch extends Raider implements RangedAttackMob { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.witchMaxHealth); } - // Purpur end + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.witchTakeDamageFromWater; ++ return this.level().purpurConfig.witchTakeDamageFromWater; + } + @Override protected void registerGoals() { super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java -index 8baf2c7bf590620baeb6b93cae64c07df0f434e5..d24fa628d76029b04daa7971aa9f39a262f89844 100644 +index 25e2aca9dafe63ccaf21dc42e79563c5a3c8e638..c6f36715de37c8694860fc3834f203664c264138 100644 --- a/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java +++ b/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java @@ -57,6 +57,11 @@ public class WitherSkeleton extends AbstractSkeleton { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.witherSkeletonMaxHealth); } - // Purpur end + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.witherSkeletonTakeDamageFromWater; ++ return this.level().purpurConfig.witherSkeletonTakeDamageFromWater; + } + @Override protected void registerGoals() { this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractPiglin.class, true)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -index a5ce5e82f12bef3bdd5a4a87409aa31787bb90ac..df8cd4f58cc75df2d9c6822e1675f9cf2f8a2936 100644 +index 323ec328226e3a46ef8afeaf07178bb9f4042134..651c4f4b3d9349b8e9d6601a37ca5da192898a61 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java @@ -89,6 +89,11 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zoglinMaxHealth); } - // Purpur end + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.zoglinTakeDamageFromWater; ++ return this.level().purpurConfig.zoglinTakeDamageFromWater; + } + @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index 57a1ea56cfc6b0b8fe3a3379c9a602cf46fd8fbd..54ee2eafe257fe8ac16ded66a8c49ba68d433450 100644 +index bd75aa78a7dd437d6fce79a6cb18298184affe75..a676d66dcb5ee72e6d8ffef4e210a3d2c8d605f2 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java @@ -140,6 +140,11 @@ public class Zombie extends Monster { - return level.purpurConfig.zombieJockeyTryExistingChickens; + return level().purpurConfig.zombieJockeyTryExistingChickens; } + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.zombieTakeDamageFromWater; ++ return this.level().purpurConfig.zombieTakeDamageFromWater; + } + @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur 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 b0b39609a50ac0a7dade15651f5f33ff2b426e5a..0f8b9ceca20e43b5010bb54e5b94a8598995115f 100644 +index 6f3667751e430ff6020a9a26f82a25e4ec043ce6..c3f220a85b91a25662c943b5ee4508cd7a18c75d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java @@ -106,6 +106,11 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { + this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level().purpurConfig.zombieVillagerSpawnReinforcements); } - // Purpur end + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.zombieVillagerTakeDamageFromWater; ++ return this.level().purpurConfig.zombieVillagerTakeDamageFromWater; + } + @Override public boolean jockeyOnlyBaby() { - return level.purpurConfig.zombieVillagerJockeyOnlyBaby; + return level().purpurConfig.zombieVillagerJockeyOnlyBaby; diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index 921d4e60052f6ceb9a6ecc2956350bd70c94dca7..4e6495f6cde80d1fe8c8902012ab63738d444e26 100644 +index 67fd554cfd6b848ca1f2cf804ad4543ad2c88845..21ba6ea58dfbfd9a7c0bf7d518d7f12730841a08 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java @@ -85,6 +85,11 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zombifiedPiglinMaxHealth); } - // Purpur end + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.zombifiedPiglinTakeDamageFromWater; ++ return this.level().purpurConfig.zombifiedPiglinTakeDamageFromWater; + } + @Override public boolean jockeyOnlyBaby() { - return level.purpurConfig.zombifiedPiglinJockeyOnlyBaby; + return level().purpurConfig.zombifiedPiglinJockeyOnlyBaby; diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index 35f7f7c75c740760f95eeaef91287a6a0ec3c3cc..17a7623466e55ff967a4c54ed0d674f16e0a23ca 100644 +index ae4d404b837da202e52d246dabfc00c8803e0260..3b99761fabc02255a66ec84f5c6cf199848455dc 100644 --- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java @@ -94,6 +94,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { - return this.level.purpurConfig.hoglinBreedingTicks; + return this.level().purpurConfig.hoglinBreedingTicks; } + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.hoglinTakeDamageFromWater; ++ return this.level().purpurConfig.hoglinTakeDamageFromWater; + } + @Override public boolean canBeLeashed(Player player) { return !this.isLeashed(); diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -index 98ee31528c93ae1a1d294d47c7722ac8b017edbe..f9ca274c7d273f7c56bbc2ffb8e78b6f51880bbd 100644 +index b40e43c94c7a7bb39e4428c4fa35f5697d8e954c..e2d04fc258e093b0b2b5d11ae061a81f286d55ce 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java @@ -118,6 +118,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.piglinMaxHealth); } - // Purpur end + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.piglinTakeDamageFromWater; ++ return this.level().purpurConfig.piglinTakeDamageFromWater; + } + @Override public void addAdditionalSaveData(CompoundTag nbt) { super.addAdditionalSaveData(nbt); diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -index 349fb046ba7930af29251973efde4e1ecfef16f4..54bb2392a71dffaaa73b00ada833291dd0a86ab7 100644 +index 04e54c241078e6cd6419a21ba1bf913fd3b413d1..b63d87df0f48dd63c89118f91b31dc4e3622e3b8 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java @@ -63,6 +63,11 @@ public class PiglinBrute extends AbstractPiglin { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.piglinBruteMaxHealth); } - // Purpur end + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.piglinBruteTakeDamageFromWater; ++ return this.level().purpurConfig.piglinBruteTakeDamageFromWater; + } + public static AttributeSupplier.Builder createAttributes() { return Monster.createMonsterAttributes().add(Attributes.MAX_HEALTH, 50.0D).add(Attributes.MOVEMENT_SPEED, (double)0.35F).add(Attributes.ATTACK_DAMAGE, 7.0D); } diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 26d7b7de2dc2b59224311bc9541a5f0f0f386277..831254902b21104a8d6376446853a141197278a5 100644 +index 52a84f354cc51b3ca875756514588b2e6309fc25..2936b4856c92dcbe6034f9ace2cb8b94887a4dd8 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java @@ -187,6 +187,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler - return level.purpurConfig.villagerCanBeLeashed && !this.isLeashed(); + return level().purpurConfig.villagerCanBeLeashed && !this.isLeashed(); } + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.villagerTakeDamageFromWater; ++ return this.level().purpurConfig.villagerTakeDamageFromWater; + } + @Override public Brain getBrain() { return (Brain) super.getBrain(); // CraftBukkit - decompile error diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index 4dc8ac6a3e26a619ff4f2d7b907f192766c8281a..36e99dc4c37d321608b0781c9c7787986d21307d 100644 +index 41ddf073ecb8ea97cca8021390500d65866488a5..e2a9179bb7a5ecbc31d98a2410a09f5e2107234b 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java @@ -93,6 +93,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill - return level.purpurConfig.wanderingTraderCanBeLeashed && !this.isLeashed(); + return level().purpurConfig.wanderingTraderCanBeLeashed && !this.isLeashed(); } + @Override + public boolean isSensitiveToWater() { -+ return this.level.purpurConfig.wanderingTraderTakeDamageFromWater; ++ return this.level().purpurConfig.wanderingTraderTakeDamageFromWater; + } + @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a53c3fdbf11c8c33407aa0082f788848ac77dc34..104a3e088e0d181e140a68ddf5271a221d51e979 100644 +index 705c6b3ae0db79d0ef0a9eaea504381145b4af21..a902a1fff34382032fd56a6672b2c7225378527c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -547,9 +547,11 @@ public class PurpurWorldConfig { - +@@ -569,11 +569,13 @@ public class PurpurWorldConfig { + public boolean axolotlControllable = true; public double axolotlMaxHealth = 14.0D; public int axolotlBreedingTicks = 6000; + public boolean axolotlTakeDamageFromWater = false; private void axolotlSettings() { + axolotlRidable = getBoolean("mobs.axolotl.ridable", axolotlRidable); + axolotlControllable = getBoolean("mobs.axolotl.controllable", axolotlControllable); axolotlMaxHealth = getDouble("mobs.axolotl.attributes.max_health", axolotlMaxHealth); axolotlBreedingTicks = getInt("mobs.axolotl.breeding-delay-ticks", axolotlBreedingTicks); + axolotlTakeDamageFromWater = getBoolean("mobs.axolotl.takes-damage-from-water", axolotlTakeDamageFromWater); } - public double batMaxHealth = 6.0D; -@@ -560,6 +562,7 @@ public class PurpurWorldConfig { + public boolean batRidable = false; +@@ -588,6 +590,7 @@ public class PurpurWorldConfig { public double batArmor = 0.0D; public double batArmorToughness = 0.0D; public double batAttackKnockback = 0.0D; + public boolean batTakeDamageFromWater = false; private void batSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.bat.attributes.max-health", batMaxHealth); -@@ -574,10 +577,12 @@ public class PurpurWorldConfig { + batRidable = getBoolean("mobs.bat.ridable", batRidable); + batRidableInWater = getBoolean("mobs.bat.ridable-in-water", batRidableInWater); +@@ -606,6 +609,7 @@ public class PurpurWorldConfig { batArmor = getDouble("mobs.bat.attributes.armor", batArmor); batArmorToughness = getDouble("mobs.bat.attributes.armor_toughness", batArmorToughness); batAttackKnockback = getDouble("mobs.bat.attributes.attack_knockback", batAttackKnockback); + batTakeDamageFromWater = getBoolean("mobs.bat.takes-damage-from-water", batTakeDamageFromWater); } + public boolean beeRidable = false; +@@ -614,6 +618,7 @@ public class PurpurWorldConfig { + public double beeMaxY = 320D; public double beeMaxHealth = 10.0D; public int beeBreedingTicks = 6000; + public boolean beeTakeDamageFromWater = false; private void beeSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.bee.attributes.max-health", beeMaxHealth); -@@ -586,9 +591,11 @@ public class PurpurWorldConfig { + beeRidable = getBoolean("mobs.bee.ridable", beeRidable); + beeRidableInWater = getBoolean("mobs.bee.ridable-in-water", beeRidableInWater); +@@ -626,6 +631,7 @@ public class PurpurWorldConfig { } beeMaxHealth = getDouble("mobs.bee.attributes.max_health", beeMaxHealth); beeBreedingTicks = getInt("mobs.bee.breeding-delay-ticks", beeBreedingTicks); + beeTakeDamageFromWater = getBoolean("mobs.bee.takes-damage-from-water", beeTakeDamageFromWater); } + public boolean blazeRidable = false; +@@ -633,6 +639,7 @@ public class PurpurWorldConfig { + public boolean blazeControllable = true; + public double blazeMaxY = 320D; public double blazeMaxHealth = 20.0D; + public boolean blazeTakeDamageFromWater = true; private void blazeSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.blaze.attributes.max-health", blazeMaxHealth); -@@ -596,6 +603,7 @@ public class PurpurWorldConfig { + blazeRidable = getBoolean("mobs.blaze.ridable", blazeRidable); + blazeRidableInWater = getBoolean("mobs.blaze.ridable-in-water", blazeRidableInWater); +@@ -644,6 +651,7 @@ public class PurpurWorldConfig { set("mobs.blaze.attributes.max_health", oldValue); } blazeMaxHealth = getDouble("mobs.blaze.attributes.max_health", blazeMaxHealth); + blazeTakeDamageFromWater = getBoolean("mobs.blaze.takes-damage-from-water", blazeTakeDamageFromWater); } - public int camelBreedingTicks = 6000; -@@ -621,6 +629,7 @@ public class PurpurWorldConfig { + public boolean catRidable = false; +@@ -655,6 +663,7 @@ public class PurpurWorldConfig { public int catSpawnVillageScanRange = 48; public int catBreedingTicks = 6000; public DyeColor catDefaultCollarColor = DyeColor.RED; + public boolean catTakeDamageFromWater = false; private void catSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.cat.attributes.max-health", catMaxHealth); -@@ -637,9 +646,11 @@ public class PurpurWorldConfig { + catRidable = getBoolean("mobs.cat.ridable", catRidable); + catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); +@@ -674,12 +683,14 @@ public class PurpurWorldConfig { } catch (IllegalArgumentException ignore) { catDefaultCollarColor = DyeColor.RED; } + catTakeDamageFromWater = getBoolean("mobs.cat.takes-damage-from-water", catTakeDamageFromWater); } + public boolean caveSpiderRidable = false; + public boolean caveSpiderRidableInWater = true; + public boolean caveSpiderControllable = true; public double caveSpiderMaxHealth = 12.0D; + public boolean caveSpiderTakeDamageFromWater = false; private void caveSpiderSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.cave_spider.attributes.max-health", caveSpiderMaxHealth); -@@ -647,11 +658,13 @@ public class PurpurWorldConfig { + caveSpiderRidable = getBoolean("mobs.cave_spider.ridable", caveSpiderRidable); + caveSpiderRidableInWater = getBoolean("mobs.cave_spider.ridable-in-water", caveSpiderRidableInWater); +@@ -690,6 +701,7 @@ public class PurpurWorldConfig { set("mobs.cave_spider.attributes.max_health", oldValue); } caveSpiderMaxHealth = getDouble("mobs.cave_spider.attributes.max_health", caveSpiderMaxHealth); + caveSpiderTakeDamageFromWater = getBoolean("mobs.cave_spider.takes-damage-from-water", caveSpiderTakeDamageFromWater); } + public boolean chickenRidable = false; +@@ -698,6 +710,7 @@ public class PurpurWorldConfig { public double chickenMaxHealth = 4.0D; public boolean chickenRetaliate = false; public int chickenBreedingTicks = 6000; + public boolean chickenTakeDamageFromWater = false; private void chickenSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.chicken.attributes.max-health", chickenMaxHealth); -@@ -661,9 +674,11 @@ public class PurpurWorldConfig { + chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); + chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); +@@ -710,11 +723,13 @@ public class PurpurWorldConfig { chickenMaxHealth = getDouble("mobs.chicken.attributes.max_health", chickenMaxHealth); chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate); chickenBreedingTicks = getInt("mobs.chicken.breeding-delay-ticks", chickenBreedingTicks); + chickenTakeDamageFromWater = getBoolean("mobs.chicken.takes-damage-from-water", chickenTakeDamageFromWater); } + public boolean codRidable = false; + public boolean codControllable = true; public double codMaxHealth = 3.0D; + public boolean codTakeDamageFromWater = false; private void codSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.cod.attributes.max-health", codMaxHealth); -@@ -671,11 +686,13 @@ public class PurpurWorldConfig { + codRidable = getBoolean("mobs.cod.ridable", codRidable); + codControllable = getBoolean("mobs.cod.controllable", codControllable); +@@ -724,6 +739,7 @@ public class PurpurWorldConfig { set("mobs.cod.attributes.max_health", oldValue); } codMaxHealth = getDouble("mobs.cod.attributes.max_health", codMaxHealth); + codTakeDamageFromWater = getBoolean("mobs.cod.takes-damage-from-water", codTakeDamageFromWater); } + public boolean cowRidable = false; +@@ -732,6 +748,7 @@ public class PurpurWorldConfig { public double cowMaxHealth = 10.0D; public int cowFeedMushrooms = 0; public int cowBreedingTicks = 6000; + public boolean cowTakeDamageFromWater = false; private void cowSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.cow.attributes.max-health", cowMaxHealth); -@@ -685,12 +702,14 @@ public class PurpurWorldConfig { + cowRidable = getBoolean("mobs.cow.ridable", cowRidable); + cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); +@@ -744,6 +761,7 @@ public class PurpurWorldConfig { cowMaxHealth = getDouble("mobs.cow.attributes.max_health", cowMaxHealth); cowFeedMushrooms = getInt("mobs.cow.feed-mushrooms-for-mooshroom", cowFeedMushrooms); cowBreedingTicks = getInt("mobs.cow.breeding-delay-ticks", cowBreedingTicks); + cowTakeDamageFromWater = getBoolean("mobs.cow.takes-damage-from-water", cowTakeDamageFromWater); } - public double creeperMaxHealth = 20.0D; + public boolean creeperRidable = false; +@@ -753,6 +771,7 @@ public class PurpurWorldConfig { public double creeperChargedChance = 0.0D; public boolean creeperAllowGriefing = true; public boolean creeperBypassMobGriefing = false; + public boolean creeperTakeDamageFromWater = false; private void creeperSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.creeper.attributes.max-health", creeperMaxHealth); -@@ -701,10 +720,12 @@ public class PurpurWorldConfig { + creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); + creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); +@@ -766,6 +785,7 @@ public class PurpurWorldConfig { creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); creeperAllowGriefing = getBoolean("mobs.creeper.allow-griefing", creeperAllowGriefing); creeperBypassMobGriefing = getBoolean("mobs.creeper.bypass-mob-griefing", creeperBypassMobGriefing); + creeperTakeDamageFromWater = getBoolean("mobs.creeper.takes-damage-from-water", creeperTakeDamageFromWater); } + public boolean dolphinRidable = false; +@@ -775,6 +795,7 @@ public class PurpurWorldConfig { + public float dolphinSpitDamage = 2.0F; public double dolphinMaxHealth = 10.0D; public boolean dolphinDisableTreasureSearching = false; + public boolean dolphinTakeDamageFromWater = false; private void dolphinSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.dolphin.attributes.max-health", dolphinMaxHealth); -@@ -713,6 +734,7 @@ public class PurpurWorldConfig { + dolphinRidable = getBoolean("mobs.dolphin.ridable", dolphinRidable); + dolphinControllable = getBoolean("mobs.dolphin.controllable", dolphinControllable); +@@ -788,6 +809,7 @@ public class PurpurWorldConfig { } dolphinMaxHealth = getDouble("mobs.dolphin.attributes.max_health", dolphinMaxHealth); dolphinDisableTreasureSearching = getBoolean("mobs.dolphin.disable-treasure-searching", dolphinDisableTreasureSearching); + dolphinTakeDamageFromWater = getBoolean("mobs.dolphin.takes-damage-from-water", dolphinTakeDamageFromWater); } - public double donkeyMaxHealthMin = 15.0D; -@@ -722,6 +744,7 @@ public class PurpurWorldConfig { + public boolean donkeyRidableInWater = false; +@@ -798,6 +820,7 @@ public class PurpurWorldConfig { public double donkeyMovementSpeedMin = 0.175D; public double donkeyMovementSpeedMax = 0.175D; public int donkeyBreedingTicks = 6000; + public boolean donkeyTakeDamageFromWater = false; private void donkeySettings() { + donkeyRidableInWater = getBoolean("mobs.donkey.ridable-in-water", donkeyRidableInWater); if (PurpurConfig.version < 10) { - double oldMin = getDouble("mobs.donkey.attributes.max-health.min", donkeyMaxHealthMin); -@@ -737,6 +760,7 @@ public class PurpurWorldConfig { +@@ -814,6 +837,7 @@ public class PurpurWorldConfig { donkeyMovementSpeedMin = getDouble("mobs.donkey.attributes.movement_speed.min", donkeyMovementSpeedMin); donkeyMovementSpeedMax = getDouble("mobs.donkey.attributes.movement_speed.max", donkeyMovementSpeedMax); donkeyBreedingTicks = getInt("mobs.donkey.breeding-delay-ticks", donkeyBreedingTicks); + donkeyTakeDamageFromWater = getBoolean("mobs.donkey.takes-damage-from-water", donkeyTakeDamageFromWater); } - public double drownedMaxHealth = 20.0D; -@@ -744,6 +768,7 @@ public class PurpurWorldConfig { + public boolean drownedRidable = false; +@@ -824,6 +848,7 @@ public class PurpurWorldConfig { public boolean drownedJockeyOnlyBaby = true; public double drownedJockeyChance = 0.05D; public boolean drownedJockeyTryExistingChickens = true; + public boolean drownedTakeDamageFromWater = false; private void drownedSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.drowned.attributes.max-health", drownedMaxHealth); -@@ -755,9 +780,11 @@ public class PurpurWorldConfig { + drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); + drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); +@@ -838,6 +863,7 @@ public class PurpurWorldConfig { drownedJockeyOnlyBaby = getBoolean("mobs.drowned.jockey.only-babies", drownedJockeyOnlyBaby); drownedJockeyChance = getDouble("mobs.drowned.jockey.chance", drownedJockeyChance); drownedJockeyTryExistingChickens = getBoolean("mobs.drowned.jockey.try-existing-chickens", drownedJockeyTryExistingChickens); + drownedTakeDamageFromWater = getBoolean("mobs.drowned.takes-damage-from-water", drownedTakeDamageFromWater); } + public double camelMaxHealthMin = 32.0D; +@@ -860,6 +886,7 @@ public class PurpurWorldConfig { + public boolean elderGuardianRidable = false; + public boolean elderGuardianControllable = true; public double elderGuardianMaxHealth = 80.0D; + public boolean elderGuardianTakeDamageFromWater = false; private void elderGuardianSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.elder_guardian.attributes.max-health", elderGuardianMaxHealth); -@@ -765,11 +792,13 @@ public class PurpurWorldConfig { + elderGuardianRidable = getBoolean("mobs.elder_guardian.ridable", elderGuardianRidable); + elderGuardianControllable = getBoolean("mobs.elder_guardian.controllable", elderGuardianControllable); +@@ -869,6 +896,7 @@ public class PurpurWorldConfig { set("mobs.elder_guardian.attributes.max_health", oldValue); } elderGuardianMaxHealth = getDouble("mobs.elder_guardian.attributes.max_health", elderGuardianMaxHealth); + elderGuardianTakeDamageFromWater = getBoolean("mobs.elder_guardian.takes-damage-from-water", elderGuardianTakeDamageFromWater); } + public boolean enderDragonRidable = false; +@@ -878,6 +906,7 @@ public class PurpurWorldConfig { public double enderDragonMaxHealth = 200.0D; public boolean enderDragonAlwaysDropsFullExp = false; public boolean enderDragonBypassMobGriefing = false; + public boolean enderDragonTakeDamageFromWater = false; private void enderDragonSettings() { - if (PurpurConfig.version < 8) { - double oldValue = getDouble("mobs.ender_dragon.max-health", enderDragonMaxHealth); -@@ -783,12 +812,14 @@ public class PurpurWorldConfig { + enderDragonRidable = getBoolean("mobs.ender_dragon.ridable", enderDragonRidable); + enderDragonRidableInWater = getBoolean("mobs.ender_dragon.ridable-in-water", enderDragonRidableInWater); +@@ -895,6 +924,7 @@ public class PurpurWorldConfig { enderDragonMaxHealth = getDouble("mobs.ender_dragon.attributes.max_health", enderDragonMaxHealth); enderDragonAlwaysDropsFullExp = getBoolean("mobs.ender_dragon.always-drop-full-exp", enderDragonAlwaysDropsFullExp); enderDragonBypassMobGriefing = getBoolean("mobs.ender_dragon.bypass-mob-griefing", enderDragonBypassMobGriefing); + enderDragonTakeDamageFromWater = getBoolean("mobs.ender_dragon.takes-damage-from-water", enderDragonTakeDamageFromWater); } - public double endermanMaxHealth = 40.0D; + public boolean endermanRidable = false; +@@ -904,6 +934,7 @@ public class PurpurWorldConfig { public boolean endermanAllowGriefing = true; public boolean endermanDespawnEvenWithBlock = false; public boolean endermanBypassMobGriefing = false; + public boolean endermanTakeDamageFromWater = true; private void endermanSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.enderman.attributes.max-health", endermanMaxHealth); -@@ -799,9 +830,11 @@ public class PurpurWorldConfig { + endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); + endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); +@@ -917,12 +948,14 @@ public class PurpurWorldConfig { endermanAllowGriefing = getBoolean("mobs.enderman.allow-griefing", endermanAllowGriefing); endermanDespawnEvenWithBlock = getBoolean("mobs.enderman.can-despawn-with-held-block", endermanDespawnEvenWithBlock); endermanBypassMobGriefing = getBoolean("mobs.enderman.bypass-mob-griefing", endermanBypassMobGriefing); + endermanTakeDamageFromWater = getBoolean("mobs.enderman.takes-damage-from-water", endermanTakeDamageFromWater); } + public boolean endermiteRidable = false; + public boolean endermiteRidableInWater = true; + public boolean endermiteControllable = true; public double endermiteMaxHealth = 8.0D; + public boolean endermiteTakeDamageFromWater = false; private void endermiteSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.endermite.attributes.max-health", endermiteMaxHealth); -@@ -809,10 +842,12 @@ public class PurpurWorldConfig { + endermiteRidable = getBoolean("mobs.endermite.ridable", endermiteRidable); + endermiteRidableInWater = getBoolean("mobs.endermite.ridable-in-water", endermiteRidableInWater); +@@ -933,6 +966,7 @@ public class PurpurWorldConfig { set("mobs.endermite.attributes.max_health", oldValue); } endermiteMaxHealth = getDouble("mobs.endermite.attributes.max_health", endermiteMaxHealth); + endermiteTakeDamageFromWater = getBoolean("mobs.endermite.takes-damage-from-water", endermiteTakeDamageFromWater); } + public boolean evokerRidable = false; +@@ -940,6 +974,7 @@ public class PurpurWorldConfig { + public boolean evokerControllable = true; public double evokerMaxHealth = 24.0D; public boolean evokerBypassMobGriefing = false; + public boolean evokerTakeDamageFromWater = false; private void evokerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.evoker.attributes.max-health", evokerMaxHealth); -@@ -821,12 +856,14 @@ public class PurpurWorldConfig { + evokerRidable = getBoolean("mobs.evoker.ridable", evokerRidable); + evokerRidableInWater = getBoolean("mobs.evoker.ridable-in-water", evokerRidableInWater); +@@ -951,6 +986,7 @@ public class PurpurWorldConfig { } evokerMaxHealth = getDouble("mobs.evoker.attributes.max_health", evokerMaxHealth); evokerBypassMobGriefing = getBoolean("mobs.evoker.bypass-mob-griefing", evokerBypassMobGriefing); + evokerTakeDamageFromWater = getBoolean("mobs.evoker.takes-damage-from-water", evokerTakeDamageFromWater); } - public double foxMaxHealth = 10.0D; + public boolean foxRidable = false; +@@ -960,6 +996,7 @@ public class PurpurWorldConfig { public boolean foxTypeChangesWithTulips = false; public int foxBreedingTicks = 6000; public boolean foxBypassMobGriefing = false; + public boolean foxTakeDamageFromWater = false; private void foxSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.fox.attributes.max-health", foxMaxHealth); -@@ -837,6 +874,7 @@ public class PurpurWorldConfig { + foxRidable = getBoolean("mobs.fox.ridable", foxRidable); + foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); +@@ -973,6 +1010,7 @@ public class PurpurWorldConfig { foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); foxBreedingTicks = getInt("mobs.fox.breeding-delay-ticks", foxBreedingTicks); foxBypassMobGriefing = getBoolean("mobs.fox.bypass-mob-griefing", foxBypassMobGriefing); + foxTakeDamageFromWater = getBoolean("mobs.fox.takes-damage-from-water", foxTakeDamageFromWater); } - public int frogBreedingTicks = 6000; -@@ -845,6 +883,7 @@ public class PurpurWorldConfig { - } - + public boolean frogRidable = false; +@@ -993,6 +1031,7 @@ public class PurpurWorldConfig { + public boolean ghastControllable = true; + public double ghastMaxY = 320D; public double ghastMaxHealth = 10.0D; + public boolean ghastTakeDamageFromWater = false; private void ghastSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.ghast.attributes.max-health", ghastMaxHealth); -@@ -852,6 +891,7 @@ public class PurpurWorldConfig { + ghastRidable = getBoolean("mobs.ghast.ridable", ghastRidable); + ghastRidableInWater = getBoolean("mobs.ghast.ridable-in-water", ghastRidableInWater); +@@ -1004,6 +1043,7 @@ public class PurpurWorldConfig { set("mobs.ghast.attributes.max_health", oldValue); } ghastMaxHealth = getDouble("mobs.ghast.attributes.max_health", ghastMaxHealth); + ghastTakeDamageFromWater = getBoolean("mobs.ghast.takes-damage-from-water", ghastTakeDamageFromWater); } - public double giantMovementSpeed = 0.5D; -@@ -861,6 +901,7 @@ public class PurpurWorldConfig { + public boolean giantRidable = false; +@@ -1016,6 +1056,7 @@ public class PurpurWorldConfig { public float giantJumpHeight = 1.0F; public boolean giantHaveAI = false; public boolean giantHaveHostileAI = false; + public boolean giantTakeDamageFromWater = false; private void giantSettings() { - giantMovementSpeed = getDouble("mobs.giant.movement-speed", giantMovementSpeed); - giantAttackDamage = getDouble("mobs.giant.attack-damage", giantAttackDamage); -@@ -878,23 +919,29 @@ public class PurpurWorldConfig { + giantRidable = getBoolean("mobs.giant.ridable", giantRidable); + giantRidableInWater = getBoolean("mobs.giant.ridable-in-water", giantRidableInWater); +@@ -1036,17 +1077,20 @@ public class PurpurWorldConfig { giantJumpHeight = (float) getDouble("mobs.giant.jump-height", giantJumpHeight); giantHaveAI = getBoolean("mobs.giant.have-ai", giantHaveAI); giantHaveHostileAI = getBoolean("mobs.giant.have-hostile-ai", giantHaveHostileAI); + giantTakeDamageFromWater = getBoolean("mobs.giant.takes-damage-from-water", giantTakeDamageFromWater); } + public boolean glowSquidRidable = false; + public boolean glowSquidControllable = true; public double glowSquidMaxHealth = 10.0D; public boolean glowSquidsCanFly = false; + public boolean glowSquidTakeDamageFromWater = false; private void glowSquidSettings() { + glowSquidRidable = getBoolean("mobs.glow_squid.ridable", glowSquidRidable); + glowSquidControllable = getBoolean("mobs.glow_squid.controllable", glowSquidControllable); glowSquidMaxHealth = getDouble("mobs.glow_squid.attributes.max_health", glowSquidMaxHealth); glowSquidsCanFly = getBoolean("mobs.glow_squid.can-fly", glowSquidsCanFly); + glowSquidTakeDamageFromWater = getBoolean("mobs.glow_squid.takes-damage-from-water", glowSquidTakeDamageFromWater); } + public boolean goatRidable = false; +@@ -1054,17 +1098,20 @@ public class PurpurWorldConfig { + public boolean goatControllable = true; public double goatMaxHealth = 10.0D; public int goatBreedingTicks = 6000; + public boolean goatTakeDamageFromWater = false; private void goatSettings() { + goatRidable = getBoolean("mobs.goat.ridable", goatRidable); + goatRidableInWater = getBoolean("mobs.goat.ridable-in-water", goatRidableInWater); + goatControllable = getBoolean("mobs.goat.controllable", goatControllable); goatMaxHealth = getDouble("mobs.goat.attributes.max_health", goatMaxHealth); goatBreedingTicks = getInt("mobs.goat.breeding-delay-ticks", goatBreedingTicks); + goatTakeDamageFromWater = getBoolean("mobs.goat.takes-damage-from-water", goatTakeDamageFromWater); } + public boolean guardianRidable = false; + public boolean guardianControllable = true; public double guardianMaxHealth = 30.0D; + public boolean guardianTakeDamageFromWater = false; private void guardianSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.guardian.attributes.max-health", guardianMaxHealth); -@@ -902,10 +949,12 @@ public class PurpurWorldConfig { + guardianRidable = getBoolean("mobs.guardian.ridable", guardianRidable); + guardianControllable = getBoolean("mobs.guardian.controllable", guardianControllable); +@@ -1074,6 +1121,7 @@ public class PurpurWorldConfig { set("mobs.guardian.attributes.max_health", oldValue); } guardianMaxHealth = getDouble("mobs.guardian.attributes.max_health", guardianMaxHealth); + guardianTakeDamageFromWater = getBoolean("mobs.guardian.takes-damage-from-water", guardianTakeDamageFromWater); } + public boolean hoglinRidable = false; +@@ -1081,6 +1129,7 @@ public class PurpurWorldConfig { + public boolean hoglinControllable = true; public double hoglinMaxHealth = 40.0D; public int hoglinBreedingTicks = 6000; + public boolean hoglinTakeDamageFromWater = false; private void hoglinSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.hoglin.attributes.max-health", hoglinMaxHealth); -@@ -914,6 +963,7 @@ public class PurpurWorldConfig { + hoglinRidable = getBoolean("mobs.hoglin.ridable", hoglinRidable); + hoglinRidableInWater = getBoolean("mobs.hoglin.ridable-in-water", hoglinRidableInWater); +@@ -1092,6 +1141,7 @@ public class PurpurWorldConfig { } hoglinMaxHealth = getDouble("mobs.hoglin.attributes.max_health", hoglinMaxHealth); hoglinBreedingTicks = getInt("mobs.hoglin.breeding-delay-ticks", hoglinBreedingTicks); + hoglinTakeDamageFromWater = getBoolean("mobs.hoglin.takes-damage-from-water", hoglinTakeDamageFromWater); } - public double horseMaxHealthMin = 15.0D; -@@ -923,6 +973,7 @@ public class PurpurWorldConfig { + public boolean horseRidableInWater = false; +@@ -1102,6 +1152,7 @@ public class PurpurWorldConfig { public double horseMovementSpeedMin = 0.1125D; public double horseMovementSpeedMax = 0.3375D; public int horseBreedingTicks = 6000; + public boolean horseTakeDamageFromWater = false; private void horseSettings() { + horseRidableInWater = getBoolean("mobs.horse.ridable-in-water", horseRidableInWater); if (PurpurConfig.version < 10) { - double oldMin = getDouble("mobs.horse.attributes.max-health.min", horseMaxHealthMin); -@@ -938,6 +989,7 @@ public class PurpurWorldConfig { +@@ -1118,6 +1169,7 @@ public class PurpurWorldConfig { horseMovementSpeedMin = getDouble("mobs.horse.attributes.movement_speed.min", horseMovementSpeedMin); horseMovementSpeedMax = getDouble("mobs.horse.attributes.movement_speed.max", horseMovementSpeedMax); horseBreedingTicks = getInt("mobs.horse.breeding-delay-ticks", horseBreedingTicks); + horseTakeDamageFromWater = getBoolean("mobs.horse.takes-damage-from-water", horseTakeDamageFromWater); } - public double huskMaxHealth = 20.0D; -@@ -945,6 +997,7 @@ public class PurpurWorldConfig { + public boolean huskRidable = false; +@@ -1128,6 +1180,7 @@ public class PurpurWorldConfig { public boolean huskJockeyOnlyBaby = true; public double huskJockeyChance = 0.05D; public boolean huskJockeyTryExistingChickens = true; + public boolean huskTakeDamageFromWater = false; private void huskSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.husk.attributes.max-health", huskMaxHealth); -@@ -956,11 +1009,13 @@ public class PurpurWorldConfig { + huskRidable = getBoolean("mobs.husk.ridable", huskRidable); + huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); +@@ -1142,6 +1195,7 @@ public class PurpurWorldConfig { huskJockeyOnlyBaby = getBoolean("mobs.husk.jockey.only-babies", huskJockeyOnlyBaby); huskJockeyChance = getDouble("mobs.husk.jockey.chance", huskJockeyChance); huskJockeyTryExistingChickens = getBoolean("mobs.husk.jockey.try-existing-chickens", huskJockeyTryExistingChickens); + huskTakeDamageFromWater = getBoolean("mobs.husk.takes-damage-from-water", huskTakeDamageFromWater); } + public boolean illusionerRidable = false; +@@ -1150,6 +1204,7 @@ public class PurpurWorldConfig { public double illusionerMovementSpeed = 0.5D; public double illusionerFollowRange = 18.0D; public double illusionerMaxHealth = 32.0D; + public boolean illusionerTakeDamageFromWater = false; private void illusionerSettings() { - illusionerMovementSpeed = getDouble("mobs.illusioner.movement-speed", illusionerMovementSpeed); - illusionerFollowRange = getDouble("mobs.illusioner.follow-range", illusionerFollowRange); -@@ -974,9 +1029,11 @@ public class PurpurWorldConfig { + illusionerRidable = getBoolean("mobs.illusioner.ridable", illusionerRidable); + illusionerRidableInWater = getBoolean("mobs.illusioner.ridable-in-water", illusionerRidableInWater); +@@ -1166,6 +1221,7 @@ public class PurpurWorldConfig { set("mobs.illusioner.attributes.max_health", oldValue); } illusionerMaxHealth = getDouble("mobs.illusioner.attributes.max_health", illusionerMaxHealth); + illusionerTakeDamageFromWater = getBoolean("mobs.illusioner.takes-damage-from-water", illusionerTakeDamageFromWater); } + public boolean ironGolemRidable = false; +@@ -1173,6 +1229,7 @@ public class PurpurWorldConfig { + public boolean ironGolemControllable = true; + public boolean ironGolemCanSwim = false; public double ironGolemMaxHealth = 100.0D; + public boolean ironGolemTakeDamageFromWater = false; private void ironGolemSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.iron_golem.attributes.max-health", ironGolemMaxHealth); -@@ -984,6 +1041,7 @@ public class PurpurWorldConfig { + ironGolemRidable = getBoolean("mobs.iron_golem.ridable", ironGolemRidable); + ironGolemRidableInWater = getBoolean("mobs.iron_golem.ridable-in-water", ironGolemRidableInWater); +@@ -1184,6 +1241,7 @@ public class PurpurWorldConfig { set("mobs.iron_golem.attributes.max_health", oldValue); } ironGolemMaxHealth = getDouble("mobs.iron_golem.attributes.max_health", ironGolemMaxHealth); @@ -1595,7 +1652,7 @@ index a53c3fdbf11c8c33407aa0082f788848ac77dc34..104a3e088e0d181e140a68ddf5271a22 } public boolean llamaRidable = false; -@@ -996,6 +1054,7 @@ public class PurpurWorldConfig { +@@ -1196,6 +1254,7 @@ public class PurpurWorldConfig { public double llamaMovementSpeedMin = 0.175D; public double llamaMovementSpeedMax = 0.175D; public int llamaBreedingTicks = 6000; @@ -1603,609 +1660,685 @@ index a53c3fdbf11c8c33407aa0082f788848ac77dc34..104a3e088e0d181e140a68ddf5271a22 private void llamaSettings() { llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); -@@ -1014,12 +1073,14 @@ public class PurpurWorldConfig { +@@ -1217,6 +1276,7 @@ public class PurpurWorldConfig { llamaMovementSpeedMin = getDouble("mobs.llama.attributes.movement_speed.min", llamaMovementSpeedMin); llamaMovementSpeedMax = getDouble("mobs.llama.attributes.movement_speed.max", llamaMovementSpeedMax); llamaBreedingTicks = getInt("mobs.llama.breeding-delay-ticks", llamaBreedingTicks); + llamaTakeDamageFromWater = getBoolean("mobs.llama.takes-damage-from-water", llamaTakeDamageFromWater); } - public String magmaCubeMaxHealth = "size * size"; + public boolean magmaCubeRidable = false; +@@ -1226,6 +1286,7 @@ public class PurpurWorldConfig { public String magmaCubeAttackDamage = "size"; public Map magmaCubeMaxHealthCache = new HashMap<>(); public Map magmaCubeAttackDamageCache = new HashMap<>(); + public boolean magmaCubeTakeDamageFromWater = false; private void magmaCubeSettings() { - if (PurpurConfig.version < 10) { - String oldValue = getString("mobs.magma_cube.attributes.max-health", magmaCubeMaxHealth); -@@ -1030,10 +1091,12 @@ public class PurpurWorldConfig { + magmaCubeRidable = getBoolean("mobs.magma_cube.ridable", magmaCubeRidable); + magmaCubeRidableInWater = getBoolean("mobs.magma_cube.ridable-in-water", magmaCubeRidableInWater); +@@ -1239,6 +1300,7 @@ public class PurpurWorldConfig { magmaCubeAttackDamage = getString("mobs.magma_cube.attributes.attack_damage", magmaCubeAttackDamage); magmaCubeMaxHealthCache.clear(); magmaCubeAttackDamageCache.clear(); + magmaCubeTakeDamageFromWater = getBoolean("mobs.magma_cube.takes-damage-from-water", magmaCubeTakeDamageFromWater); } + public boolean mooshroomRidable = false; +@@ -1246,6 +1308,7 @@ public class PurpurWorldConfig { + public boolean mooshroomControllable = true; public double mooshroomMaxHealth = 10.0D; public int mooshroomBreedingTicks = 6000; + public boolean mooshroomTakeDamageFromWater = false; private void mooshroomSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.mooshroom.attributes.max-health", mooshroomMaxHealth); -@@ -1042,6 +1105,7 @@ public class PurpurWorldConfig { + mooshroomRidable = getBoolean("mobs.mooshroom.ridable", mooshroomRidable); + mooshroomRidableInWater = getBoolean("mobs.mooshroom.ridable-in-water", mooshroomRidableInWater); +@@ -1257,6 +1320,7 @@ public class PurpurWorldConfig { } mooshroomMaxHealth = getDouble("mobs.mooshroom.attributes.max_health", mooshroomMaxHealth); mooshroomBreedingTicks = getInt("mobs.mooshroom.breeding-delay-ticks", mooshroomBreedingTicks); + mooshroomTakeDamageFromWater = getBoolean("mobs.mooshroom.takes-damage-from-water", mooshroomTakeDamageFromWater); } - public double muleMaxHealthMin = 15.0D; -@@ -1051,6 +1115,7 @@ public class PurpurWorldConfig { + public boolean muleRidableInWater = false; +@@ -1267,6 +1331,7 @@ public class PurpurWorldConfig { public double muleMovementSpeedMin = 0.175D; public double muleMovementSpeedMax = 0.175D; public int muleBreedingTicks = 6000; + public boolean muleTakeDamageFromWater = false; private void muleSettings() { + muleRidableInWater = getBoolean("mobs.mule.ridable-in-water", muleRidableInWater); if (PurpurConfig.version < 10) { - double oldMin = getDouble("mobs.mule.attributes.max-health.min", muleMaxHealthMin); -@@ -1066,10 +1131,12 @@ public class PurpurWorldConfig { +@@ -1283,6 +1348,7 @@ public class PurpurWorldConfig { muleMovementSpeedMin = getDouble("mobs.mule.attributes.movement_speed.min", muleMovementSpeedMin); muleMovementSpeedMax = getDouble("mobs.mule.attributes.movement_speed.max", muleMovementSpeedMax); muleBreedingTicks = getInt("mobs.mule.breeding-delay-ticks", muleBreedingTicks); + muleTakeDamageFromWater = getBoolean("mobs.mule.takes-damage-from-water", muleTakeDamageFromWater); } + public boolean ocelotRidable = false; +@@ -1290,6 +1356,7 @@ public class PurpurWorldConfig { + public boolean ocelotControllable = true; public double ocelotMaxHealth = 10.0D; public int ocelotBreedingTicks = 6000; + public boolean ocelotTakeDamageFromWater = false; private void ocelotSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.ocelot.attributes.max-health", ocelotMaxHealth); -@@ -1078,10 +1145,12 @@ public class PurpurWorldConfig { + ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable); + ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater); +@@ -1301,6 +1368,7 @@ public class PurpurWorldConfig { } ocelotMaxHealth = getDouble("mobs.ocelot.attributes.max_health", ocelotMaxHealth); ocelotBreedingTicks = getInt("mobs.ocelot.breeding-delay-ticks", ocelotBreedingTicks); + ocelotTakeDamageFromWater = getBoolean("mobs.ocelot.takes-damage-from-water", ocelotTakeDamageFromWater); } + public boolean pandaRidable = false; +@@ -1308,6 +1376,7 @@ public class PurpurWorldConfig { + public boolean pandaControllable = true; public double pandaMaxHealth = 20.0D; public int pandaBreedingTicks = 6000; + public boolean pandaTakeDamageFromWater = false; private void pandaSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.panda.attributes.max-health", pandaMaxHealth); -@@ -1090,9 +1159,11 @@ public class PurpurWorldConfig { + pandaRidable = getBoolean("mobs.panda.ridable", pandaRidable); + pandaRidableInWater = getBoolean("mobs.panda.ridable-in-water", pandaRidableInWater); +@@ -1319,6 +1388,7 @@ public class PurpurWorldConfig { } pandaMaxHealth = getDouble("mobs.panda.attributes.max_health", pandaMaxHealth); pandaBreedingTicks = getInt("mobs.panda.breeding-delay-ticks", pandaBreedingTicks); + pandaTakeDamageFromWater = getBoolean("mobs.panda.takes-damage-from-water", pandaTakeDamageFromWater); } + public boolean parrotRidable = false; +@@ -1326,6 +1396,7 @@ public class PurpurWorldConfig { + public boolean parrotControllable = true; + public double parrotMaxY = 320D; public double parrotMaxHealth = 6.0D; + public boolean parrotTakeDamageFromWater = false; private void parrotSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.parrot.attributes.max-health", parrotMaxHealth); -@@ -1100,6 +1171,7 @@ public class PurpurWorldConfig { + parrotRidable = getBoolean("mobs.parrot.ridable", parrotRidable); + parrotRidableInWater = getBoolean("mobs.parrot.ridable-in-water", parrotRidableInWater); +@@ -1337,6 +1408,7 @@ public class PurpurWorldConfig { set("mobs.parrot.attributes.max_health", oldValue); } parrotMaxHealth = getDouble("mobs.parrot.attributes.max_health", parrotMaxHealth); + parrotTakeDamageFromWater = getBoolean("mobs.parrot.takes-damage-from-water", parrotTakeDamageFromWater); } - public String phantomMaxHealth = "20.0"; -@@ -1116,6 +1188,7 @@ public class PurpurWorldConfig { + public boolean phantomRidable = false; +@@ -1360,6 +1432,7 @@ public class PurpurWorldConfig { public boolean phantomIgnorePlayersWithTorch = false; public boolean phantomBurnInDaylight = true; public boolean phantomFlamesOnSwoop = false; + public boolean phantomTakeDamageFromWater = false; private void phantomSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.phantom.attributes.max-health", Double.parseDouble(phantomMaxHealth)); -@@ -1140,11 +1213,13 @@ public class PurpurWorldConfig { + phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); + phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); +@@ -1391,6 +1464,7 @@ public class PurpurWorldConfig { phantomBurnInDaylight = getBoolean("mobs.phantom.burn-in-daylight", phantomBurnInDaylight); phantomIgnorePlayersWithTorch = getBoolean("mobs.phantom.ignore-players-with-torch", phantomIgnorePlayersWithTorch); phantomFlamesOnSwoop = getBoolean("mobs.phantom.flames-on-swoop", phantomFlamesOnSwoop); + phantomTakeDamageFromWater = getBoolean("mobs.phantom.takes-damage-from-water", phantomTakeDamageFromWater); } + public boolean pigRidable = false; +@@ -1399,6 +1473,7 @@ public class PurpurWorldConfig { public double pigMaxHealth = 10.0D; public boolean pigGiveSaddleBack = false; public int pigBreedingTicks = 6000; + public boolean pigTakeDamageFromWater = false; private void pigSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.pig.attributes.max-health", pigMaxHealth); -@@ -1154,10 +1229,12 @@ public class PurpurWorldConfig { + pigRidable = getBoolean("mobs.pig.ridable", pigRidable); + pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); +@@ -1411,6 +1486,7 @@ public class PurpurWorldConfig { pigMaxHealth = getDouble("mobs.pig.attributes.max_health", pigMaxHealth); pigGiveSaddleBack = getBoolean("mobs.pig.give-saddle-back", pigGiveSaddleBack); pigBreedingTicks = getInt("mobs.pig.breeding-delay-ticks", pigBreedingTicks); + pigTakeDamageFromWater = getBoolean("mobs.pig.takes-damage-from-water", pigTakeDamageFromWater); } + public boolean piglinRidable = false; +@@ -1418,6 +1494,7 @@ public class PurpurWorldConfig { + public boolean piglinControllable = true; public double piglinMaxHealth = 16.0D; public boolean piglinBypassMobGriefing = false; + public boolean piglinTakeDamageFromWater = false; private void piglinSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.piglin.attributes.max-health", piglinMaxHealth); -@@ -1166,9 +1243,11 @@ public class PurpurWorldConfig { + piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); + piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); +@@ -1429,12 +1506,14 @@ public class PurpurWorldConfig { } piglinMaxHealth = getDouble("mobs.piglin.attributes.max_health", piglinMaxHealth); piglinBypassMobGriefing = getBoolean("mobs.piglin.bypass-mob-griefing", piglinBypassMobGriefing); + piglinTakeDamageFromWater = getBoolean("mobs.piglin.takes-damage-from-water", piglinTakeDamageFromWater); } + public boolean piglinBruteRidable = false; + public boolean piglinBruteRidableInWater = true; + public boolean piglinBruteControllable = true; public double piglinBruteMaxHealth = 50.0D; + public boolean piglinBruteTakeDamageFromWater = false; private void piglinBruteSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.piglin_brute.attributes.max-health", piglinBruteMaxHealth); -@@ -1176,10 +1255,12 @@ public class PurpurWorldConfig { + piglinBruteRidable = getBoolean("mobs.piglin_brute.ridable", piglinBruteRidable); + piglinBruteRidableInWater = getBoolean("mobs.piglin_brute.ridable-in-water", piglinBruteRidableInWater); +@@ -1445,6 +1524,7 @@ public class PurpurWorldConfig { set("mobs.piglin_brute.attributes.max_health", oldValue); } piglinBruteMaxHealth = getDouble("mobs.piglin_brute.attributes.max_health", piglinBruteMaxHealth); + piglinBruteTakeDamageFromWater = getBoolean("mobs.piglin_brute.takes-damage-from-water", piglinBruteTakeDamageFromWater); } + public boolean pillagerRidable = false; +@@ -1452,6 +1532,7 @@ public class PurpurWorldConfig { + public boolean pillagerControllable = true; public double pillagerMaxHealth = 24.0D; public boolean pillagerBypassMobGriefing = false; + public boolean pillagerTakeDamageFromWater = false; private void pillagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.pillager.attributes.max-health", pillagerMaxHealth); -@@ -1188,12 +1269,14 @@ public class PurpurWorldConfig { + pillagerRidable = getBoolean("mobs.pillager.ridable", pillagerRidable); + pillagerRidableInWater = getBoolean("mobs.pillager.ridable-in-water", pillagerRidableInWater); +@@ -1463,6 +1544,7 @@ public class PurpurWorldConfig { } pillagerMaxHealth = getDouble("mobs.pillager.attributes.max_health", pillagerMaxHealth); pillagerBypassMobGriefing = getBoolean("mobs.pillager.bypass-mob-griefing", pillagerBypassMobGriefing); + pillagerTakeDamageFromWater = getBoolean("mobs.pillager.takes-damage-from-water", pillagerTakeDamageFromWater); } - public double polarBearMaxHealth = 30.0D; + public boolean polarBearRidable = false; +@@ -1472,6 +1554,7 @@ public class PurpurWorldConfig { public String polarBearBreedableItemString = ""; public Item polarBearBreedableItem = null; public int polarBearBreedingTicks = 6000; + public boolean polarBearTakeDamageFromWater = false; private void polarBearSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.polar_bear.attributes.max-health", polarBearMaxHealth); -@@ -1205,9 +1288,11 @@ public class PurpurWorldConfig { + polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); + polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); +@@ -1486,11 +1569,13 @@ public class PurpurWorldConfig { Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(polarBearBreedableItemString)); if (item != Items.AIR) polarBearBreedableItem = item; polarBearBreedingTicks = getInt("mobs.polar_bear.breeding-delay-ticks", polarBearBreedingTicks); + polarBearTakeDamageFromWater = getBoolean("mobs.polar_bear.takes-damage-from-water", polarBearTakeDamageFromWater); } + public boolean pufferfishRidable = false; + public boolean pufferfishControllable = true; public double pufferfishMaxHealth = 3.0D; + public boolean pufferfishTakeDamageFromWater = false; private void pufferfishSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.pufferfish.attributes.max-health", pufferfishMaxHealth); -@@ -1215,6 +1300,7 @@ public class PurpurWorldConfig { + pufferfishRidable = getBoolean("mobs.pufferfish.ridable", pufferfishRidable); + pufferfishControllable = getBoolean("mobs.pufferfish.controllable", pufferfishControllable); +@@ -1500,6 +1585,7 @@ public class PurpurWorldConfig { set("mobs.pufferfish.attributes.max_health", oldValue); } pufferfishMaxHealth = getDouble("mobs.pufferfish.attributes.max_health", pufferfishMaxHealth); + pufferfishTakeDamageFromWater = getBoolean("mobs.pufferfish.takes-damage-from-water", pufferfishTakeDamageFromWater); } - public double rabbitMaxHealth = 3.0D; -@@ -1222,6 +1308,7 @@ public class PurpurWorldConfig { + public boolean rabbitRidable = false; +@@ -1510,6 +1596,7 @@ public class PurpurWorldConfig { public double rabbitNaturalKiller = 0.0D; public int rabbitBreedingTicks = 6000; public boolean rabbitBypassMobGriefing = false; + public boolean rabbitTakeDamageFromWater = false; private void rabbitSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.rabbit.attributes.max-health", rabbitMaxHealth); -@@ -1233,10 +1320,12 @@ public class PurpurWorldConfig { + rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); + rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); +@@ -1524,6 +1611,7 @@ public class PurpurWorldConfig { rabbitNaturalKiller = getDouble("mobs.rabbit.spawn-killer-rabbit-chance", rabbitNaturalKiller); rabbitBreedingTicks = getInt("mobs.rabbit.breeding-delay-ticks", rabbitBreedingTicks); rabbitBypassMobGriefing = getBoolean("mobs.rabbit.bypass-mob-griefing", rabbitBypassMobGriefing); + rabbitTakeDamageFromWater = getBoolean("mobs.rabbit.takes-damage-from-water", rabbitTakeDamageFromWater); } + public boolean ravagerRidable = false; +@@ -1531,6 +1619,7 @@ public class PurpurWorldConfig { + public boolean ravagerControllable = true; public double ravagerMaxHealth = 100.0D; public boolean ravagerBypassMobGriefing = false; + public boolean ravagerTakeDamageFromWater = false; private void ravagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.ravager.attributes.max-health", ravagerMaxHealth); -@@ -1245,9 +1334,11 @@ public class PurpurWorldConfig { + ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); + ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); +@@ -1542,11 +1631,13 @@ public class PurpurWorldConfig { } ravagerMaxHealth = getDouble("mobs.ravager.attributes.max_health", ravagerMaxHealth); ravagerBypassMobGriefing = getBoolean("mobs.ravager.bypass-mob-griefing", ravagerBypassMobGriefing); + ravagerTakeDamageFromWater = getBoolean("mobs.ravager.takes-damage-from-water", ravagerTakeDamageFromWater); } + public boolean salmonRidable = false; + public boolean salmonControllable = true; public double salmonMaxHealth = 3.0D; + public boolean salmonTakeDamageFromWater = false; private void salmonSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.salmon.attributes.max-health", salmonMaxHealth); -@@ -1255,11 +1346,13 @@ public class PurpurWorldConfig { + salmonRidable = getBoolean("mobs.salmon.ridable", salmonRidable); + salmonControllable = getBoolean("mobs.salmon.controllable", salmonControllable); +@@ -1556,6 +1647,7 @@ public class PurpurWorldConfig { set("mobs.salmon.attributes.max_health", oldValue); } salmonMaxHealth = getDouble("mobs.salmon.attributes.max_health", salmonMaxHealth); + salmonTakeDamageFromWater = getBoolean("mobs.salmon.takes-damage-from-water", salmonTakeDamageFromWater); } + public boolean sheepRidable = false; +@@ -1564,6 +1656,7 @@ public class PurpurWorldConfig { public double sheepMaxHealth = 8.0D; public int sheepBreedingTicks = 6000; public boolean sheepBypassMobGriefing = false; + public boolean sheepTakeDamageFromWater = false; private void sheepSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.sheep.attributes.max-health", sheepMaxHealth); -@@ -1269,9 +1362,11 @@ public class PurpurWorldConfig { + sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); + sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); +@@ -1576,12 +1669,14 @@ public class PurpurWorldConfig { sheepMaxHealth = getDouble("mobs.sheep.attributes.max_health", sheepMaxHealth); sheepBreedingTicks = getInt("mobs.sheep.breeding-delay-ticks", sheepBreedingTicks); sheepBypassMobGriefing = getBoolean("mobs.sheep.bypass-mob-griefing", sheepBypassMobGriefing); + sheepTakeDamageFromWater = getBoolean("mobs.sheep.takes-damage-from-water", sheepTakeDamageFromWater); } + public boolean shulkerRidable = false; + public boolean shulkerRidableInWater = true; + public boolean shulkerControllable = true; public double shulkerMaxHealth = 30.0D; + public boolean shulkerTakeDamageFromWater = false; private void shulkerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.shulker.attributes.max-health", shulkerMaxHealth); -@@ -1279,10 +1374,12 @@ public class PurpurWorldConfig { + shulkerRidable = getBoolean("mobs.shulker.ridable", shulkerRidable); + shulkerRidableInWater = getBoolean("mobs.shulker.ridable-in-water", shulkerRidableInWater); +@@ -1592,6 +1687,7 @@ public class PurpurWorldConfig { set("mobs.shulker.attributes.max_health", oldValue); } shulkerMaxHealth = getDouble("mobs.shulker.attributes.max_health", shulkerMaxHealth); + shulkerTakeDamageFromWater = getBoolean("mobs.shulker.takes-damage-from-water", shulkerTakeDamageFromWater); } + public boolean silverfishRidable = false; +@@ -1599,6 +1695,7 @@ public class PurpurWorldConfig { + public boolean silverfishControllable = true; public double silverfishMaxHealth = 8.0D; public boolean silverfishBypassMobGriefing = false; + public boolean silverfishTakeDamageFromWater = false; private void silverfishSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.silverfish.attributes.max-health", silverfishMaxHealth); -@@ -1291,9 +1388,11 @@ public class PurpurWorldConfig { + silverfishRidable = getBoolean("mobs.silverfish.ridable", silverfishRidable); + silverfishRidableInWater = getBoolean("mobs.silverfish.ridable-in-water", silverfishRidableInWater); +@@ -1610,12 +1707,14 @@ public class PurpurWorldConfig { } silverfishMaxHealth = getDouble("mobs.silverfish.attributes.max_health", silverfishMaxHealth); silverfishBypassMobGriefing = getBoolean("mobs.silverfish.bypass-mob-griefing", silverfishBypassMobGriefing); + silverfishTakeDamageFromWater = getBoolean("mobs.silverfish.takes-damage-from-water", silverfishTakeDamageFromWater); } + public boolean skeletonRidable = false; + public boolean skeletonRidableInWater = true; + public boolean skeletonControllable = true; public double skeletonMaxHealth = 20.0D; + public boolean skeletonTakeDamageFromWater = false; private void skeletonSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.skeleton.attributes.max-health", skeletonMaxHealth); -@@ -1301,6 +1400,7 @@ public class PurpurWorldConfig { + skeletonRidable = getBoolean("mobs.skeleton.ridable", skeletonRidable); + skeletonRidableInWater = getBoolean("mobs.skeleton.ridable-in-water", skeletonRidableInWater); +@@ -1626,6 +1725,7 @@ public class PurpurWorldConfig { set("mobs.skeleton.attributes.max_health", oldValue); } skeletonMaxHealth = getDouble("mobs.skeleton.attributes.max_health", skeletonMaxHealth); + skeletonTakeDamageFromWater = getBoolean("mobs.skeleton.takes-damage-from-water", skeletonTakeDamageFromWater); } - public double skeletonHorseMaxHealthMin = 15.0D; -@@ -1309,6 +1409,7 @@ public class PurpurWorldConfig { + public boolean skeletonHorseRidableInWater = true; +@@ -1636,6 +1736,7 @@ public class PurpurWorldConfig { public double skeletonHorseJumpStrengthMax = 1.0D; public double skeletonHorseMovementSpeedMin = 0.2D; public double skeletonHorseMovementSpeedMax = 0.2D; + public boolean skeletonHorseTakeDamageFromWater = false; private void skeletonHorseSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.skeleton_horse.attributes.max-health", skeletonHorseMaxHealthMin); -@@ -1322,12 +1423,14 @@ public class PurpurWorldConfig { + skeletonHorseRidableInWater = getBoolean("mobs.skeleton_horse.ridable-in-water", skeletonHorseRidableInWater); + skeletonHorseCanSwim = getBoolean("mobs.skeleton_horse.can-swim", skeletonHorseCanSwim); +@@ -1651,6 +1752,7 @@ public class PurpurWorldConfig { skeletonHorseJumpStrengthMax = getDouble("mobs.skeleton_horse.attributes.jump_strength.max", skeletonHorseJumpStrengthMax); skeletonHorseMovementSpeedMin = getDouble("mobs.skeleton_horse.attributes.movement_speed.min", skeletonHorseMovementSpeedMin); skeletonHorseMovementSpeedMax = getDouble("mobs.skeleton_horse.attributes.movement_speed.max", skeletonHorseMovementSpeedMax); + skeletonHorseTakeDamageFromWater = getBoolean("mobs.skeleton_horse.takes-damage-from-water", skeletonHorseTakeDamageFromWater); } - public String slimeMaxHealth = "size * size"; + public boolean slimeRidable = false; +@@ -1660,6 +1762,7 @@ public class PurpurWorldConfig { public String slimeAttackDamage = "size"; public Map slimeMaxHealthCache = new HashMap<>(); public Map slimeAttackDamageCache = new HashMap<>(); + public boolean slimeTakeDamageFromWater = false; private void slimeSettings() { - if (PurpurConfig.version < 10) { - String oldValue = getString("mobs.slime.attributes.max-health", slimeMaxHealth); -@@ -1338,6 +1441,7 @@ public class PurpurWorldConfig { + slimeRidable = getBoolean("mobs.slime.ridable", slimeRidable); + slimeRidableInWater = getBoolean("mobs.slime.ridable-in-water", slimeRidableInWater); +@@ -1673,6 +1776,7 @@ public class PurpurWorldConfig { slimeAttackDamage = getString("mobs.slime.attributes.attack_damage", slimeAttackDamage); slimeMaxHealthCache.clear(); slimeAttackDamageCache.clear(); + slimeTakeDamageFromWater = getBoolean("mobs.slime.takes-damage-from-water", slimeTakeDamageFromWater); } - public boolean snowGolemLeaveTrailWhenRidden = false; -@@ -1349,6 +1453,7 @@ public class PurpurWorldConfig { + public boolean snowGolemRidable = false; +@@ -1687,6 +1791,7 @@ public class PurpurWorldConfig { public float snowGolemSnowBallModifier = 10.0F; public double snowGolemAttackDistance = 1.25D; public boolean snowGolemBypassMobGriefing = false; + public boolean snowGolemTakeDamageFromWater = true; private void snowGolemSettings() { - snowGolemLeaveTrailWhenRidden = getBoolean("mobs.snow_golem.leave-trail-when-ridden", snowGolemLeaveTrailWhenRidden); - if (PurpurConfig.version < 10) { -@@ -1364,6 +1469,7 @@ public class PurpurWorldConfig { + snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); + snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); +@@ -1705,6 +1810,7 @@ public class PurpurWorldConfig { snowGolemSnowBallModifier = (float) getDouble("mobs.snow_golem.snow-ball-modifier", snowGolemSnowBallModifier); snowGolemAttackDistance = getDouble("mobs.snow_golem.attack-distance", snowGolemAttackDistance); snowGolemBypassMobGriefing = getBoolean("mobs.snow_golem.bypass-mob-griefing", snowGolemBypassMobGriefing); + snowGolemTakeDamageFromWater = getBoolean("mobs.snow_golem.takes-damage-from-water", snowGolemTakeDamageFromWater); } - public double snifferMaxHealth = 14.0D; -@@ -1377,6 +1483,7 @@ public class PurpurWorldConfig { + public boolean snifferRidable = false; +@@ -1726,6 +1832,7 @@ public class PurpurWorldConfig { public boolean squidImmuneToEAR = true; public double squidOffsetWaterCheck = 0.0D; public boolean squidsCanFly = false; + public boolean squidTakeDamageFromWater = false; private void squidSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.squid.attributes.max-health", squidMaxHealth); -@@ -1387,9 +1494,11 @@ public class PurpurWorldConfig { + squidRidable = getBoolean("mobs.squid.ridable", squidRidable); + squidControllable = getBoolean("mobs.squid.controllable", squidControllable); +@@ -1738,12 +1845,14 @@ public class PurpurWorldConfig { squidImmuneToEAR = getBoolean("mobs.squid.immune-to-EAR", squidImmuneToEAR); squidOffsetWaterCheck = getDouble("mobs.squid.water-offset-check", squidOffsetWaterCheck); squidsCanFly = getBoolean("mobs.squid.can-fly", squidsCanFly); + squidTakeDamageFromWater = getBoolean("mobs.squid.takes-damage-from-water", squidTakeDamageFromWater); } + public boolean spiderRidable = false; + public boolean spiderRidableInWater = false; + public boolean spiderControllable = true; public double spiderMaxHealth = 16.0D; + public boolean spiderTakeDamageFromWater = false; private void spiderSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.spider.attributes.max-health", spiderMaxHealth); -@@ -1397,9 +1506,11 @@ public class PurpurWorldConfig { + spiderRidable = getBoolean("mobs.spider.ridable", spiderRidable); + spiderRidableInWater = getBoolean("mobs.spider.ridable-in-water", spiderRidableInWater); +@@ -1754,12 +1863,14 @@ public class PurpurWorldConfig { set("mobs.spider.attributes.max_health", oldValue); } spiderMaxHealth = getDouble("mobs.spider.attributes.max_health", spiderMaxHealth); + spiderTakeDamageFromWater = getBoolean("mobs.spider.takes-damage-from-water", spiderTakeDamageFromWater); } + public boolean strayRidable = false; + public boolean strayRidableInWater = true; + public boolean strayControllable = true; public double strayMaxHealth = 20.0D; + public boolean strayTakeDamageFromWater = false; private void straySettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.stray.attributes.max-health", strayMaxHealth); -@@ -1407,11 +1518,13 @@ public class PurpurWorldConfig { + strayRidable = getBoolean("mobs.stray.ridable", strayRidable); + strayRidableInWater = getBoolean("mobs.stray.ridable-in-water", strayRidableInWater); +@@ -1770,6 +1881,7 @@ public class PurpurWorldConfig { set("mobs.stray.attributes.max_health", oldValue); } strayMaxHealth = getDouble("mobs.stray.attributes.max_health", strayMaxHealth); + strayTakeDamageFromWater = getBoolean("mobs.stray.takes-damage-from-water", strayTakeDamageFromWater); } + public boolean striderRidable = false; +@@ -1778,6 +1890,7 @@ public class PurpurWorldConfig { public double striderMaxHealth = 20.0D; public int striderBreedingTicks = 6000; public boolean striderGiveSaddleBack = false; + public boolean striderTakeDamageFromWater = true; private void striderSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.strider.attributes.max-health", striderMaxHealth); -@@ -1421,6 +1534,7 @@ public class PurpurWorldConfig { + striderRidable = getBoolean("mobs.strider.ridable", striderRidable); + striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); +@@ -1790,6 +1903,7 @@ public class PurpurWorldConfig { striderMaxHealth = getDouble("mobs.strider.attributes.max_health", striderMaxHealth); striderBreedingTicks = getInt("mobs.strider.breeding-delay-ticks", striderBreedingTicks); striderGiveSaddleBack = getBoolean("mobs.strider.give-saddle-back", striderGiveSaddleBack); + striderTakeDamageFromWater = getBoolean("mobs.strider.takes-damage-from-water", striderTakeDamageFromWater); } - public double traderLlamaMaxHealthMin = 15.0D; -@@ -1430,6 +1544,7 @@ public class PurpurWorldConfig { + public boolean tadpoleRidable = false; +@@ -1811,6 +1925,7 @@ public class PurpurWorldConfig { public double traderLlamaMovementSpeedMin = 0.175D; public double traderLlamaMovementSpeedMax = 0.175D; public int traderLlamaBreedingTicks = 6000; + public boolean traderLlamaTakeDamageFromWater = false; private void traderLlamaSettings() { - if (PurpurConfig.version < 10) { - double oldMin = getDouble("mobs.trader_llama.attributes.max-health.min", traderLlamaMaxHealthMin); -@@ -1445,9 +1560,11 @@ public class PurpurWorldConfig { + traderLlamaRidable = getBoolean("mobs.trader_llama.ridable", traderLlamaRidable); + traderLlamaRidableInWater = getBoolean("mobs.trader_llama.ridable-in-water", traderLlamaRidableInWater); +@@ -1829,11 +1944,13 @@ public class PurpurWorldConfig { traderLlamaMovementSpeedMin = getDouble("mobs.trader_llama.attributes.movement_speed.min", traderLlamaMovementSpeedMin); traderLlamaMovementSpeedMax = getDouble("mobs.trader_llama.attributes.movement_speed.max", traderLlamaMovementSpeedMax); traderLlamaBreedingTicks = getInt("mobs.trader_llama.breeding-delay-ticks", traderLlamaBreedingTicks); + traderLlamaTakeDamageFromWater = getBoolean("mobs.trader_llama.takes-damage-from-water", traderLlamaTakeDamageFromWater); } + public boolean tropicalFishRidable = false; + public boolean tropicalFishControllable = true; public double tropicalFishMaxHealth = 3.0D; + public boolean tropicalFishTakeDamageFromWater = false; private void tropicalFishSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.tropical_fish.attributes.max-health", tropicalFishMaxHealth); -@@ -1455,10 +1572,12 @@ public class PurpurWorldConfig { + tropicalFishRidable = getBoolean("mobs.tropical_fish.ridable", tropicalFishRidable); + tropicalFishControllable = getBoolean("mobs.tropical_fish.controllable", tropicalFishControllable); +@@ -1843,6 +1960,7 @@ public class PurpurWorldConfig { set("mobs.tropical_fish.attributes.max_health", oldValue); } tropicalFishMaxHealth = getDouble("mobs.tropical_fish.attributes.max_health", tropicalFishMaxHealth); + tropicalFishTakeDamageFromWater = getBoolean("mobs.tropical_fish.takes-damage-from-water", tropicalFishTakeDamageFromWater); } + public boolean turtleRidable = false; +@@ -1850,6 +1968,7 @@ public class PurpurWorldConfig { + public boolean turtleControllable = true; public double turtleMaxHealth = 30.0D; public int turtleBreedingTicks = 6000; + public boolean turtleTakeDamageFromWater = false; private void turtleSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.turtle.attributes.max-health", turtleMaxHealth); -@@ -1467,10 +1586,12 @@ public class PurpurWorldConfig { + turtleRidable = getBoolean("mobs.turtle.ridable", turtleRidable); + turtleRidableInWater = getBoolean("mobs.turtle.ridable-in-water", turtleRidableInWater); +@@ -1861,6 +1980,7 @@ public class PurpurWorldConfig { } turtleMaxHealth = getDouble("mobs.turtle.attributes.max_health", turtleMaxHealth); turtleBreedingTicks = getInt("mobs.turtle.breeding-delay-ticks", turtleBreedingTicks); + turtleTakeDamageFromWater = getBoolean("mobs.turtle.takes-damage-from-water", turtleTakeDamageFromWater); } + public boolean vexRidable = false; +@@ -1868,6 +1988,7 @@ public class PurpurWorldConfig { + public boolean vexControllable = true; public double vexMaxY = 320D; public double vexMaxHealth = 14.0D; + public boolean vexTakeDamageFromWater = false; private void vexSettings() { - vexMaxY = getDouble("mobs.vex.ridable-max-y", vexMaxY); - if (PurpurConfig.version < 10) { -@@ -1479,6 +1600,7 @@ public class PurpurWorldConfig { + vexRidable = getBoolean("mobs.vex.ridable", vexRidable); + vexRidableInWater = getBoolean("mobs.vex.ridable-in-water", vexRidableInWater); +@@ -1879,6 +2000,7 @@ public class PurpurWorldConfig { set("mobs.vex.attributes.max_health", oldValue); } vexMaxHealth = getDouble("mobs.vex.attributes.max_health", vexMaxHealth); + vexTakeDamageFromWater = getBoolean("mobs.vex.takes-damage-from-water", vexTakeDamageFromWater); } - public double villagerMaxHealth = 20.0D; -@@ -1487,6 +1609,7 @@ public class PurpurWorldConfig { + public boolean villagerRidable = false; +@@ -1890,6 +2012,7 @@ public class PurpurWorldConfig { public boolean villagerCanBreed = true; public int villagerBreedingTicks = 6000; public boolean villagerBypassMobGriefing = false; + public boolean villagerTakeDamageFromWater = false; private void villagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.villager.attributes.max-health", villagerMaxHealth); -@@ -1499,10 +1622,12 @@ public class PurpurWorldConfig { + villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); + villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); +@@ -1905,6 +2028,7 @@ public class PurpurWorldConfig { villagerCanBreed = getBoolean("mobs.villager.can-breed", villagerCanBreed); villagerBreedingTicks = getInt("mobs.villager.breeding-delay-ticks", villagerBreedingTicks); villagerBypassMobGriefing = getBoolean("mobs.villager.bypass-mob-griefing", villagerBypassMobGriefing); + villagerTakeDamageFromWater = getBoolean("mobs.villager.takes-damage-from-water", villagerTakeDamageFromWater); } + public boolean vindicatorRidable = false; +@@ -1912,6 +2036,7 @@ public class PurpurWorldConfig { + public boolean vindicatorControllable = true; public double vindicatorMaxHealth = 24.0D; public double vindicatorJohnnySpawnChance = 0D; + public boolean vindicatorTakeDamageFromWater = false; private void vindicatorSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.vindicator.attributes.max-health", vindicatorMaxHealth); -@@ -1511,11 +1636,13 @@ public class PurpurWorldConfig { + vindicatorRidable = getBoolean("mobs.vindicator.ridable", vindicatorRidable); + vindicatorRidableInWater = getBoolean("mobs.vindicator.ridable-in-water", vindicatorRidableInWater); +@@ -1923,6 +2048,7 @@ public class PurpurWorldConfig { } vindicatorMaxHealth = getDouble("mobs.vindicator.attributes.max_health", vindicatorMaxHealth); vindicatorJohnnySpawnChance = getDouble("mobs.vindicator.johnny.spawn-chance", vindicatorJohnnySpawnChance); + vindicatorTakeDamageFromWater = getBoolean("mobs.vindicator.takes-damage-from-water", vindicatorTakeDamageFromWater); } + public boolean wanderingTraderRidable = false; +@@ -1931,6 +2057,7 @@ public class PurpurWorldConfig { public double wanderingTraderMaxHealth = 20.0D; public boolean wanderingTraderFollowEmeraldBlock = false; public boolean wanderingTraderCanBeLeashed = false; + public boolean wanderingTraderTakeDamageFromWater = false; private void wanderingTraderSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.wandering_trader.attributes.max-health", wanderingTraderMaxHealth); -@@ -1525,9 +1652,11 @@ public class PurpurWorldConfig { + wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); + wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); +@@ -1943,6 +2070,7 @@ public class PurpurWorldConfig { wanderingTraderMaxHealth = getDouble("mobs.wandering_trader.attributes.max_health", wanderingTraderMaxHealth); wanderingTraderFollowEmeraldBlock = getBoolean("mobs.wandering_trader.follow-emerald-blocks", wanderingTraderFollowEmeraldBlock); wanderingTraderCanBeLeashed = getBoolean("mobs.wandering_trader.can-be-leashed", wanderingTraderCanBeLeashed); + wanderingTraderTakeDamageFromWater = getBoolean("mobs.wandering_trader.takes-damage-from-water", wanderingTraderTakeDamageFromWater); } + public boolean wardenRidable = false; +@@ -1958,6 +2086,7 @@ public class PurpurWorldConfig { + public boolean witchRidableInWater = true; + public boolean witchControllable = true; public double witchMaxHealth = 26.0D; + public boolean witchTakeDamageFromWater = false; private void witchSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.witch.attributes.max-health", witchMaxHealth); -@@ -1535,12 +1664,14 @@ public class PurpurWorldConfig { + witchRidable = getBoolean("mobs.witch.ridable", witchRidable); + witchRidableInWater = getBoolean("mobs.witch.ridable-in-water", witchRidableInWater); +@@ -1968,6 +2097,7 @@ public class PurpurWorldConfig { set("mobs.witch.attributes.max_health", oldValue); } witchMaxHealth = getDouble("mobs.witch.attributes.max_health", witchMaxHealth); + witchTakeDamageFromWater = getBoolean("mobs.witch.takes-damage-from-water", witchTakeDamageFromWater); } - public double witherMaxHealth = 300.0D; + public boolean witherRidable = false; +@@ -1978,6 +2108,7 @@ public class PurpurWorldConfig { public float witherHealthRegenAmount = 1.0f; public int witherHealthRegenDelay = 20; public boolean witherBypassMobGriefing = false; + public boolean witherTakeDamageFromWater = false; private void witherSettings() { - if (PurpurConfig.version < 8) { - double oldValue = getDouble("mobs.wither.max-health", witherMaxHealth); -@@ -1555,9 +1686,11 @@ public class PurpurWorldConfig { + witherRidable = getBoolean("mobs.wither.ridable", witherRidable); + witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); +@@ -1996,12 +2127,14 @@ public class PurpurWorldConfig { witherHealthRegenAmount = (float) getDouble("mobs.wither.health-regen-amount", witherHealthRegenAmount); witherHealthRegenDelay = getInt("mobs.wither.health-regen-delay", witherHealthRegenDelay); witherBypassMobGriefing = getBoolean("mobs.wither.bypass-mob-griefing", witherBypassMobGriefing); + witherTakeDamageFromWater = getBoolean("mobs.wither.takes-damage-from-water", witherTakeDamageFromWater); } + public boolean witherSkeletonRidable = false; + public boolean witherSkeletonRidableInWater = true; + public boolean witherSkeletonControllable = true; public double witherSkeletonMaxHealth = 20.0D; + public boolean witherSkeletonTakeDamageFromWater = false; private void witherSkeletonSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.wither_skeleton.attributes.max-health", witherSkeletonMaxHealth); -@@ -1565,6 +1698,7 @@ public class PurpurWorldConfig { + witherSkeletonRidable = getBoolean("mobs.wither_skeleton.ridable", witherSkeletonRidable); + witherSkeletonRidableInWater = getBoolean("mobs.wither_skeleton.ridable-in-water", witherSkeletonRidableInWater); +@@ -2012,6 +2145,7 @@ public class PurpurWorldConfig { set("mobs.wither_skeleton.attributes.max_health", oldValue); } witherSkeletonMaxHealth = getDouble("mobs.wither_skeleton.attributes.max_health", witherSkeletonMaxHealth); + witherSkeletonTakeDamageFromWater = getBoolean("mobs.wither_skeleton.takes-damage-from-water", witherSkeletonTakeDamageFromWater); } - public double wolfMaxHealth = 8.0D; -@@ -1572,6 +1706,7 @@ public class PurpurWorldConfig { + public boolean wolfRidable = false; +@@ -2022,6 +2156,7 @@ public class PurpurWorldConfig { public boolean wolfMilkCuresRabies = true; public double wolfNaturalRabid = 0.0D; public int wolfBreedingTicks = 6000; + public boolean wolfTakeDamageFromWater = false; private void wolfSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.wolf.attributes.max-health", wolfMaxHealth); -@@ -1587,9 +1722,11 @@ public class PurpurWorldConfig { + wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); + wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater); +@@ -2040,12 +2175,14 @@ public class PurpurWorldConfig { wolfMilkCuresRabies = getBoolean("mobs.wolf.milk-cures-rabid-wolves", wolfMilkCuresRabies); wolfNaturalRabid = getDouble("mobs.wolf.spawn-rabid-chance", wolfNaturalRabid); wolfBreedingTicks = getInt("mobs.wolf.breeding-delay-ticks", wolfBreedingTicks); + wolfTakeDamageFromWater = getBoolean("mobs.wolf.takes-damage-from-water", wolfTakeDamageFromWater); } + public boolean zoglinRidable = false; + public boolean zoglinRidableInWater = true; + public boolean zoglinControllable = true; public double zoglinMaxHealth = 40.0D; + public boolean zoglinTakeDamageFromWater = false; private void zoglinSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.zoglin.attributes.max-health", zoglinMaxHealth); -@@ -1597,6 +1734,7 @@ public class PurpurWorldConfig { + zoglinRidable = getBoolean("mobs.zoglin.ridable", zoglinRidable); + zoglinRidableInWater = getBoolean("mobs.zoglin.ridable-in-water", zoglinRidableInWater); +@@ -2056,6 +2193,7 @@ public class PurpurWorldConfig { set("mobs.zoglin.attributes.max_health", oldValue); } zoglinMaxHealth = getDouble("mobs.zoglin.attributes.max_health", zoglinMaxHealth); + zoglinTakeDamageFromWater = getBoolean("mobs.zoglin.takes-damage-from-water", zoglinTakeDamageFromWater); } - public double zombieMaxHealth = 20.0D; -@@ -1606,6 +1744,7 @@ public class PurpurWorldConfig { + public boolean zombieRidable = false; +@@ -2068,6 +2206,7 @@ public class PurpurWorldConfig { public boolean zombieJockeyTryExistingChickens = true; public boolean zombieAggressiveTowardsVillagerWhenLagging = true; public boolean zombieBypassMobGriefing = false; + public boolean zombieTakeDamageFromWater = false; private void zombieSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.zombie.attributes.max-health", zombieMaxHealth); -@@ -1619,6 +1758,7 @@ public class PurpurWorldConfig { + zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); + zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); +@@ -2084,6 +2223,7 @@ public class PurpurWorldConfig { zombieJockeyTryExistingChickens = getBoolean("mobs.zombie.jockey.try-existing-chickens", zombieJockeyTryExistingChickens); zombieAggressiveTowardsVillagerWhenLagging = getBoolean("mobs.zombie.aggressive-towards-villager-when-lagging", zombieAggressiveTowardsVillagerWhenLagging); zombieBypassMobGriefing = getBoolean("mobs.zombie.bypass-mob-griefing", zombieBypassMobGriefing); + zombieTakeDamageFromWater = getBoolean("mobs.zombie.takes-damage-from-water", zombieTakeDamageFromWater); } - public double zombieHorseMaxHealthMin = 15.0D; -@@ -1628,6 +1768,7 @@ public class PurpurWorldConfig { + public boolean zombieHorseRidableInWater = false; +@@ -2097,6 +2237,7 @@ public class PurpurWorldConfig { public double zombieHorseMovementSpeedMin = 0.2D; public double zombieHorseMovementSpeedMax = 0.2D; public double zombieHorseSpawnChance = 0.0D; + public boolean zombieHorseTakeDamageFromWater = false; private void zombieHorseSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.zombie_horse.attributes.max-health", zombieHorseMaxHealthMin); -@@ -1642,6 +1783,7 @@ public class PurpurWorldConfig { + zombieHorseRidableInWater = getBoolean("mobs.zombie_horse.ridable-in-water", zombieHorseRidableInWater); + zombieHorseCanSwim = getBoolean("mobs.zombie_horse.can-swim", zombieHorseCanSwim); +@@ -2115,6 +2256,7 @@ public class PurpurWorldConfig { zombieHorseMovementSpeedMin = getDouble("mobs.zombie_horse.attributes.movement_speed.min", zombieHorseMovementSpeedMin); zombieHorseMovementSpeedMax = getDouble("mobs.zombie_horse.attributes.movement_speed.max", zombieHorseMovementSpeedMax); zombieHorseSpawnChance = getDouble("mobs.zombie_horse.spawn-chance", zombieHorseSpawnChance); + zombieHorseTakeDamageFromWater = getBoolean("mobs.zombie_horse.takes-damage-from-water", zombieHorseTakeDamageFromWater); } - public double zombieVillagerMaxHealth = 20.0D; -@@ -1649,6 +1791,7 @@ public class PurpurWorldConfig { + public boolean zombieVillagerRidable = false; +@@ -2123,6 +2265,7 @@ public class PurpurWorldConfig { public boolean zombieVillagerJockeyOnlyBaby = true; public double zombieVillagerJockeyChance = 0.05D; public boolean zombieVillagerJockeyTryExistingChickens = true; + public boolean zombieVillagerTakeDamageFromWater = false; private void zombieVillagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.zombie_villager.attributes.max-health", zombieVillagerMaxHealth); -@@ -1660,6 +1803,7 @@ public class PurpurWorldConfig { + zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); + zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); +@@ -2130,6 +2273,7 @@ public class PurpurWorldConfig { 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); + zombieVillagerTakeDamageFromWater = getBoolean("mobs.zombie_villager.takes-damage-from-water", zombieVillagerTakeDamageFromWater); } - public double zombifiedPiglinMaxHealth = 20.0D; -@@ -1668,6 +1812,7 @@ public class PurpurWorldConfig { + public boolean zombifiedPiglinRidable = false; +@@ -2141,6 +2285,7 @@ public class PurpurWorldConfig { public double zombifiedPiglinJockeyChance = 0.05D; public boolean zombifiedPiglinJockeyTryExistingChickens = true; public boolean zombifiedPiglinCountAsPlayerKillWhenAngry = true; + public boolean zombifiedPiglinTakeDamageFromWater = false; private void zombifiedPiglinSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.zombified_piglin.attributes.max-health", zombifiedPiglinMaxHealth); -@@ -1680,6 +1825,7 @@ public class PurpurWorldConfig { + zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); + zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); +@@ -2156,5 +2301,6 @@ public class PurpurWorldConfig { zombifiedPiglinJockeyChance = getDouble("mobs.zombified_piglin.jockey.chance", zombifiedPiglinJockeyChance); zombifiedPiglinJockeyTryExistingChickens = getBoolean("mobs.zombified_piglin.jockey.try-existing-chickens", zombifiedPiglinJockeyTryExistingChickens); zombifiedPiglinCountAsPlayerKillWhenAngry = getBoolean("mobs.zombified_piglin.count-as-player-kill-when-angry", zombifiedPiglinCountAsPlayerKillWhenAngry); + zombifiedPiglinTakeDamageFromWater = getBoolean("mobs.zombified_piglin.takes-damage-from-water", zombifiedPiglinTakeDamageFromWater); } - - public boolean babiesAreRidable = true; + } diff --git a/patches/server/0127-Config-to-always-tame-in-Creative.patch b/patches/server/0127-Config-to-always-tame-in-Creative.patch index 33810e9d4..c588f9d0b 100644 --- a/patches/server/0127-Config-to-always-tame-in-Creative.patch +++ b/patches/server/0127-Config-to-always-tame-in-Creative.patch @@ -7,7 +7,7 @@ Adds a configuration option that ensures a player in Creative always tames a tam This essentially allows Creative mode players to tame animals on their first try. diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/RunAroundLikeCrazyGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/RunAroundLikeCrazyGoal.java -index b463fdb812f1c402885f1538e1c213aea1374e5c..88cae271386b1502cd80880a5c24995994d6ff45 100644 +index b463fdb812f1c402885f1538e1c213aea1374e5c..952b244a7423d44a0e755764e4b4b5a83ee7f42b 100644 --- a/src/main/java/net/minecraft/world/entity/ai/goal/RunAroundLikeCrazyGoal.java +++ b/src/main/java/net/minecraft/world/entity/ai/goal/RunAroundLikeCrazyGoal.java @@ -63,7 +63,7 @@ public class RunAroundLikeCrazyGoal extends Goal { @@ -15,12 +15,12 @@ index b463fdb812f1c402885f1538e1c213aea1374e5c..88cae271386b1502cd80880a5c249959 // CraftBukkit - fire EntityTameEvent - if (j > 0 && this.horse.getRandom().nextInt(j) < i && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this.horse, ((org.bukkit.craftbukkit.entity.CraftHumanEntity) this.horse.getBukkitEntity().getPassenger()).getHandle()).isCancelled()) { -+ if ((this.horse.level.purpurConfig.alwaysTameInCreative && ((Player) entity).getAbilities().instabuild) || (j > 0 && this.horse.getRandom().nextInt(j) < i && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this.horse, ((org.bukkit.craftbukkit.entity.CraftHumanEntity) this.horse.getBukkitEntity().getPassenger()).getHandle()).isCancelled())) { // Purpur ++ if ((this.horse.level().purpurConfig.alwaysTameInCreative && ((Player) entity).getAbilities().instabuild) || (j > 0 && this.horse.getRandom().nextInt(j) < i && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this.horse, ((org.bukkit.craftbukkit.entity.CraftHumanEntity) this.horse.getBukkitEntity().getPassenger()).getHandle()).isCancelled())) { // Purpur this.horse.tameWithName((Player) entity); return; } diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java -index fa437d0af82292797c1e4432c57a8384c7aacdc4..93a0adaf4ad080439a8df1688d5b5b241ead07c6 100644 +index 1554e4a0e068e06ec121adf56421f8332132f062..7f1763b820a0c5dc69bdf6cdf14a97a283ba5916 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java @@ -470,7 +470,7 @@ public class Cat extends TamableAnimal implements VariantHolder { @@ -28,12 +28,12 @@ index fa437d0af82292797c1e4432c57a8384c7aacdc4..93a0adaf4ad080439a8df1688d5b5b24 } else if (this.isFood(itemstack)) { this.usePlayerItem(player, hand, itemstack); - if (this.random.nextInt(3) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, player).isCancelled()) { // CraftBukkit -+ if ((this.level.purpurConfig.alwaysTameInCreative && player.getAbilities().instabuild) || (this.random.nextInt(3) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, player).isCancelled())) { // CraftBukkit // Purpur ++ if ((this.level().purpurConfig.alwaysTameInCreative && player.getAbilities().instabuild) || (this.random.nextInt(3) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, player).isCancelled())) { // CraftBukkit // Purpur this.tame(player); this.setOrderedToSit(true); this.level().broadcastEntityEvent(this, (byte) 7); diff --git a/src/main/java/net/minecraft/world/entity/animal/Parrot.java b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -index db3607ad07da5ad2c08f4fedbd5d8cfc2c3f4f04..4bbf7b2afa98ed0dae079596cd99606bb20d63fa 100644 +index a2dafa064697219fcfe7824ba3ca81396063ecb2..08935a1f2c4a3f43483719686e5baab5063cdfce 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Parrot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Parrot.java @@ -334,7 +334,7 @@ public class Parrot extends ShoulderRidingEntity implements VariantHolder type, Level world) { super(type, world); @@ -64,6 +65,14 @@ public class Endermite extends Monster { - return this.level.purpurConfig.endermiteTakeDamageFromWater; + return this.level().purpurConfig.endermiteTakeDamageFromWater; } + public boolean isPlayerSpawned() { @@ -47,7 +47,7 @@ index 41c20875b3a92b1271125e087c98be927cd192fe..de69f93dc3e4fea716b540238cdc8712 @Override diff --git a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java -index 33eacb5e839805ec9e6f01116b9047a40e5e857e..560f2c800f89ae75d8695fe9fb47a250d22099ca 100644 +index 5c12355ed8b9eb1367173dd956975db279e2fb73..d7359c675707eade00f9b737fd67ef8d066e813f 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java +++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java @@ -72,6 +72,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { diff --git a/patches/server/0135-Config-Enderman-aggressiveness-towards-Endermites.patch b/patches/server/0135-Config-Enderman-aggressiveness-towards-Endermites.patch index 5f358fc13..153792db0 100644 --- a/patches/server/0135-Config-Enderman-aggressiveness-towards-Endermites.patch +++ b/patches/server/0135-Config-Enderman-aggressiveness-towards-Endermites.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Config Enderman aggressiveness towards Endermites 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 ae2916ed826b28a3737327b3a6b2725225bcaf61..2416f348374afe2a788bd106630e9bf6b60f602c 100644 +index 002ea677568e4d4a13509bb5c880341a742dac83..1e544c8fa21d028f7c3ac66d66c2362c01326a54 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java @@ -128,7 +128,7 @@ public class EnderMan extends Monster implements NeutralMob { @@ -13,23 +13,24 @@ index ae2916ed826b28a3737327b3a6b2725225bcaf61..2416f348374afe2a788bd106630e9bf6 this.targetSelector.addGoal(1, new EnderMan.EndermanLookForPlayerGoal(this, this::isAngryAt)); this.targetSelector.addGoal(2, new HurtByTargetGoal(this, new Class[0])); - this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Endermite.class, true, false)); -+ this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Endermite.class, 10, true, false, (entityliving) -> entityliving.level.purpurConfig.endermanAggroEndermites && entityliving instanceof Endermite endermite && (!entityliving.level.purpurConfig.endermanAggroEndermitesOnlyIfPlayerSpawned || endermite.isPlayerSpawned()))); // Purpur ++ this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Endermite.class, 10, true, false, (entityliving) -> entityliving.level().purpurConfig.endermanAggroEndermites && entityliving instanceof Endermite endermite && (!entityliving.level().purpurConfig.endermanAggroEndermitesOnlyIfPlayerSpawned || endermite.isPlayerSpawned()))); // Purpur this.targetSelector.addGoal(4, new ResetUniversalAngerTargetGoal<>(this, false)); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 0181457ff8743856d08a6505ce32072a20eb420f..5066a371334258808cca67f6f268fca76faf2af2 100644 +index 9e5e3d2b14569d15fc3994494889aea416f252a9..217e5cf9ea0fde511170cd6522ec9605dff9ac78 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -881,17 +881,25 @@ public class PurpurWorldConfig { +@@ -996,6 +996,8 @@ public class PurpurWorldConfig { public boolean endermanDespawnEvenWithBlock = false; public boolean endermanBypassMobGriefing = false; public boolean endermanTakeDamageFromWater = true; + public boolean endermanAggroEndermites = true; + public boolean endermanAggroEndermitesOnlyIfPlayerSpawned = false; private void endermanSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.enderman.attributes.max-health", endermanMaxHealth); + endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); + endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); +@@ -1005,11 +1007,17 @@ public class PurpurWorldConfig { set("mobs.enderman.attributes.max-health", null); set("mobs.enderman.attributes.max_health", oldValue); } @@ -46,4 +47,4 @@ index 0181457ff8743856d08a6505ce32072a20eb420f..5066a371334258808cca67f6f268fca7 + endermanAggroEndermitesOnlyIfPlayerSpawned = getBoolean("mobs.enderman.aggressive-towards-endermites-only-spawned-by-player-thrown-ender-pearls", endermanAggroEndermitesOnlyIfPlayerSpawned); } - public double endermiteMaxHealth = 8.0D; + public boolean endermiteRidable = false; diff --git a/patches/server/0136-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch b/patches/server/0136-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch index 3b3888b69..bf5a9bc43 100644 --- a/patches/server/0136-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch +++ b/patches/server/0136-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch @@ -7,7 +7,7 @@ Prevents Enderman from becoming aggresive towards players that are wearing a Dra Adds functionality to a useless item! 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 2416f348374afe2a788bd106630e9bf6b60f602c..cb0e27962b77a1f62c5d561b361b51cf279e7cce 100644 +index 1e544c8fa21d028f7c3ac66d66c2362c01326a54..6f7dc1f55d52a0957dc0f3b19644e3dce33ccb0f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java @@ -265,7 +265,7 @@ public class EnderMan extends Monster implements NeutralMob { @@ -15,24 +15,24 @@ index 2416f348374afe2a788bd106630e9bf6b60f602c..cb0e27962b77a1f62c5d561b361b51cf ItemStack itemstack = (ItemStack) player.getInventory().armor.get(3); - if (itemstack.is(Blocks.CARVED_PUMPKIN.asItem())) { -+ if (this.level.purpurConfig.endermanDisableStareAggro || itemstack.is(Blocks.CARVED_PUMPKIN.asItem()) || (this.level.purpurConfig.endermanIgnorePlayerDragonHead && itemstack.is(net.minecraft.world.item.Items.DRAGON_HEAD))) { // Purpur ++ if (this.level().purpurConfig.endermanDisableStareAggro || itemstack.is(Blocks.CARVED_PUMPKIN.asItem()) || (this.level().purpurConfig.endermanIgnorePlayerDragonHead && itemstack.is(net.minecraft.world.item.Items.DRAGON_HEAD))) { // Purpur return false; } else if (org.purpurmc.purpur.PurpurConfig.endermanShortHeight && source.is(net.minecraft.world.damagesource.DamageTypes.IN_WALL)) { return false; // Purpur - no suffocation damage if short height } else { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 5066a371334258808cca67f6f268fca76faf2af2..7786ff6e4adb8180090eb17298fa7147d4b1848f 100644 +index 217e5cf9ea0fde511170cd6522ec9605dff9ac78..45cb176b9ab23b9451d68fbb9165cdbcf84ad5b3 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -883,6 +883,8 @@ public class PurpurWorldConfig { +@@ -998,6 +998,8 @@ public class PurpurWorldConfig { public boolean endermanTakeDamageFromWater = true; public boolean endermanAggroEndermites = true; public boolean endermanAggroEndermitesOnlyIfPlayerSpawned = false; + public boolean endermanIgnorePlayerDragonHead = false; + public boolean endermanDisableStareAggro = false; private void endermanSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.enderman.attributes.max-health", endermanMaxHealth); -@@ -900,6 +902,8 @@ public class PurpurWorldConfig { + endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); + endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); +@@ -1018,6 +1020,8 @@ public class PurpurWorldConfig { endermanTakeDamageFromWater = getBoolean("mobs.enderman.takes-damage-from-water", endermanTakeDamageFromWater); endermanAggroEndermites = getBoolean("mobs.enderman.aggressive-towards-endermites", endermanAggroEndermites); endermanAggroEndermitesOnlyIfPlayerSpawned = getBoolean("mobs.enderman.aggressive-towards-endermites-only-spawned-by-player-thrown-ender-pearls", endermanAggroEndermitesOnlyIfPlayerSpawned); @@ -40,4 +40,4 @@ index 5066a371334258808cca67f6f268fca76faf2af2..7786ff6e4adb8180090eb17298fa7147 + endermanDisableStareAggro = getBoolean("mobs.enderman.disable-player-stare-aggression", endermanDisableStareAggro); } - public double endermiteMaxHealth = 8.0D; + public boolean endermiteRidable = false; diff --git a/patches/server/0138-Config-to-disable-Llama-caravans.patch b/patches/server/0138-Config-to-disable-Llama-caravans.patch index 9b6ae45e4..28c9d71b2 100644 --- a/patches/server/0138-Config-to-disable-Llama-caravans.patch +++ b/patches/server/0138-Config-to-disable-Llama-caravans.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Config to disable Llama caravans Disables the mechanic where llamas follow leashed llamas. diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/LlamaFollowCaravanGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/LlamaFollowCaravanGoal.java -index 849f0c7c6d13df00d90211a48d8b56ab156812b8..194dd3a896ed859c23c84ae7cb6147d545cbe8cb 100644 +index 849f0c7c6d13df00d90211a48d8b56ab156812b8..3fc9528201fb96d6a0f905afe0b6a82ec88a7235 100644 --- a/src/main/java/net/minecraft/world/entity/ai/goal/LlamaFollowCaravanGoal.java +++ b/src/main/java/net/minecraft/world/entity/ai/goal/LlamaFollowCaravanGoal.java @@ -22,7 +22,7 @@ public class LlamaFollowCaravanGoal extends Goal { @@ -14,12 +14,12 @@ index 849f0c7c6d13df00d90211a48d8b56ab156812b8..194dd3a896ed859c23c84ae7cb6147d5 @Override public boolean canUse() { - if (!this.llama.shouldJoinCaravan) return false; // Purpur -+ if (!this.llama.level.purpurConfig.llamaJoinCaravans || !this.llama.shouldJoinCaravan) return false; // Purpur ++ if (!this.llama.level().purpurConfig.llamaJoinCaravans || !this.llama.shouldJoinCaravan) return false; // Purpur if (!this.llama.isLeashed() && !this.llama.inCaravan()) { List list = this.llama.level().getEntities(this.llama, this.llama.getBoundingBox().inflate(9.0D, 4.0D, 9.0D), (entity) -> { EntityType entityType = entity.getType(); diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index 9440c55671473e717ad1019019c5edd38898e387..d8eac8a7f5919c8eda5999c1bbc8fab098a69b08 100644 +index 2c5f4ead1141269a029176140c4df848c75b9620..26ed1eef3b38e643dfc6738e4b7880c9d1c9dc20 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java @@ -540,7 +540,7 @@ public class Llama extends AbstractChestedHorse implements VariantHolder ravagerGriefableBlocks = new ArrayList<>(); private void ravagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.ravager.attributes.max-health", ravagerMaxHealth); -@@ -1414,6 +1415,23 @@ public class PurpurWorldConfig { + ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); + ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); +@@ -1711,6 +1712,23 @@ public class PurpurWorldConfig { ravagerMaxHealth = getDouble("mobs.ravager.attributes.max_health", ravagerMaxHealth); ravagerBypassMobGriefing = getBoolean("mobs.ravager.bypass-mob-griefing", ravagerBypassMobGriefing); ravagerTakeDamageFromWater = getBoolean("mobs.ravager.takes-damage-from-water", ravagerTakeDamageFromWater); @@ -65,4 +65,4 @@ index 3e597d7ed6a6dd1c5726e76e0fe76687a3cb4b03..dc2363808b6041ac1e60829e4e9a6a6c + }); } - public double salmonMaxHealth = 3.0D; + public boolean salmonRidable = false; diff --git a/patches/server/0141-Sneak-to-bulk-process-composter.patch b/patches/server/0141-Sneak-to-bulk-process-composter.patch index 85396fe6a..a02f6f5fe 100644 --- a/patches/server/0141-Sneak-to-bulk-process-composter.patch +++ b/patches/server/0141-Sneak-to-bulk-process-composter.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Sneak to bulk process composter diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -index bb7ad618fad7f11a02d7e088e2c05bfffaf0b41d..b9041e46a4fafeac004cf8a0ef9d7daaa9bfb0ff 100644 +index bb7ad618fad7f11a02d7e088e2c05bfffaf0b41d..2a923b575fa2e3393f6f667e2ce8adf38fc03afe 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java @@ -575,7 +575,7 @@ public class ServerPlayerGameMode { @@ -13,7 +13,7 @@ index bb7ad618fad7f11a02d7e088e2c05bfffaf0b41d..b9041e46a4fafeac004cf8a0ef9d7daa ItemStack itemstack1 = stack.copy(); - if (!flag1) { -+ if (!flag1 || (player.level.purpurConfig.composterBulkProcess && iblockdata.is(Blocks.COMPOSTER))) { // Purpur ++ if (!flag1 || (player.level().purpurConfig.composterBulkProcess && iblockdata.is(Blocks.COMPOSTER))) { // Purpur enuminteractionresult = iblockdata.use(world, player, hand, hitResult); if (enuminteractionresult.consumesAction()) { @@ -90,7 +90,7 @@ index 87153b5576fed05103183a9860d804c2c8cfbe1c..e8ee608aa5e352d741694f50cdf77f06 int i = (Integer) state.getValue(ComposterBlock.LEVEL); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index dc2363808b6041ac1e60829e4e9a6a6c459a159b..4531d6d54eab78c87961641a0b023117e685aa5b 100644 +index 339038dcf393653de973b55c090672b2f2f8fa26..167258202d385cce9567c0cc6c0d2ff9d5b226f5 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -485,6 +485,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0143-Add-config-for-villager-trading.patch b/patches/server/0143-Add-config-for-villager-trading.patch index 8d2b62555..538d5ae35 100644 --- a/patches/server/0143-Add-config-for-villager-trading.patch +++ b/patches/server/0143-Add-config-for-villager-trading.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add config for villager trading diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 831254902b21104a8d6376446853a141197278a5..d370ca8d0794c8b2f6fba5e4bc1c25d567e99511 100644 +index 2936b4856c92dcbe6034f9ace2cb8b94887a4dd8..b71013a6dd5a713543c042199273ddae1feda4b9 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java @@ -365,7 +365,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @@ -18,7 +18,7 @@ index 831254902b21104a8d6376446853a141197278a5..d370ca8d0794c8b2f6fba5e4bc1c25d5 } diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index 36e99dc4c37d321608b0781c9c7787986d21307d..547795c81be710267c93d29c75a9b5e139d3eedc 100644 +index e2a9179bb7a5ecbc31d98a2410a09f5e2107234b..8fd8778e918566504666213a102a7ee2d1ed8b14 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java @@ -149,7 +149,7 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill @@ -31,38 +31,38 @@ index 36e99dc4c37d321608b0781c9c7787986d21307d..547795c81be710267c93d29c75a9b5e1 this.openTradingScreen(player, this.getDisplayName(), 1); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 9c35e7cadb723553bd21851d391b0297e5382b61..205ffb12c6ca4e614655b29fedcbc87155606880 100644 +index 1625368c842497a0acd650dfaa0d284edc661548..6632e1e48483b512a7af0f1308116d852ac2a900 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1714,6 +1714,7 @@ public class PurpurWorldConfig { +@@ -2117,6 +2117,7 @@ public class PurpurWorldConfig { public int villagerBreedingTicks = 6000; public boolean villagerBypassMobGriefing = false; public boolean villagerTakeDamageFromWater = false; + public boolean villagerAllowTrading = true; private void villagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.villager.attributes.max-health", villagerMaxHealth); -@@ -1727,6 +1728,7 @@ public class PurpurWorldConfig { + villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); + villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); +@@ -2133,6 +2134,7 @@ public class PurpurWorldConfig { villagerBreedingTicks = getInt("mobs.villager.breeding-delay-ticks", villagerBreedingTicks); villagerBypassMobGriefing = getBoolean("mobs.villager.bypass-mob-griefing", villagerBypassMobGriefing); villagerTakeDamageFromWater = getBoolean("mobs.villager.takes-damage-from-water", villagerTakeDamageFromWater); + villagerAllowTrading = getBoolean("mobs.villager.allow-trading", villagerAllowTrading); } - public double vindicatorMaxHealth = 24.0D; -@@ -1747,6 +1749,7 @@ public class PurpurWorldConfig { + public boolean vindicatorRidable = false; +@@ -2162,6 +2164,7 @@ public class PurpurWorldConfig { public boolean wanderingTraderFollowEmeraldBlock = false; public boolean wanderingTraderCanBeLeashed = false; public boolean wanderingTraderTakeDamageFromWater = false; + public boolean wanderingTraderAllowTrading = true; private void wanderingTraderSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.wandering_trader.attributes.max-health", wanderingTraderMaxHealth); -@@ -1757,6 +1760,7 @@ public class PurpurWorldConfig { + wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); + wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); +@@ -2175,6 +2178,7 @@ public class PurpurWorldConfig { wanderingTraderFollowEmeraldBlock = getBoolean("mobs.wandering_trader.follow-emerald-blocks", wanderingTraderFollowEmeraldBlock); wanderingTraderCanBeLeashed = getBoolean("mobs.wandering_trader.can-be-leashed", wanderingTraderCanBeLeashed); wanderingTraderTakeDamageFromWater = getBoolean("mobs.wandering_trader.takes-damage-from-water", wanderingTraderTakeDamageFromWater); + wanderingTraderAllowTrading = getBoolean("mobs.wandering_trader.allow-trading", wanderingTraderAllowTrading); } - public double witchMaxHealth = 26.0D; + public boolean wardenRidable = false; diff --git a/patches/server/0145-Drowning-Settings.patch b/patches/server/0145-Drowning-Settings.patch index adfae9e34..2c178f2fa 100644 --- a/patches/server/0145-Drowning-Settings.patch +++ b/patches/server/0145-Drowning-Settings.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Drowning Settings diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 4a6c13e2f9835219161b3b83e0b3aecafb4eed73..cb062cfb6f4809fc580108503fe77e579ab954f5 100644 +index 10dca8fdfea6c4c98bd36684598fab425cbd348a..a1aaef67d5f4ee42714638e324f7965f2ad27eb0 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -3241,7 +3241,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -13,12 +13,12 @@ index 4a6c13e2f9835219161b3b83e0b3aecafb4eed73..cb062cfb6f4809fc580108503fe77e57 public int getMaxAirSupply() { - return this.maxAirTicks; // CraftBukkit - SPIGOT-6907: re-implement LivingEntity#setMaximumAir() -+ return this.level == null? this.maxAirTicks : this.level.purpurConfig.drowningAirTicks; // CraftBukkit - SPIGOT-6907: re-implement LivingEntity#setMaximumAir() // Purpur ++ return this.level == null? this.maxAirTicks : this.level().purpurConfig.drowningAirTicks; // CraftBukkit - SPIGOT-6907: re-implement LivingEntity#setMaximumAir() // Purpur } public int getAirSupply() { diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index c7f53783c210f79a70577aa3d4f53b5410f26387..7e9c1dd6ccc6ce9dba8588b8fcd20a5f294cc52e 100644 +index 234b92b189e921768ea83ef4f0c128266735cc6e..2f48ddb7d2731bd05d149d6286ae8292dfbec94b 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -441,7 +441,7 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -26,7 +26,7 @@ index c7f53783c210f79a70577aa3d4f53b5410f26387..7e9c1dd6ccc6ce9dba8588b8fcd20a5f if (flag1) { this.setAirSupply(this.decreaseAirSupply(this.getAirSupply())); - if (this.getAirSupply() == -20) { -+ if (this.getAirSupply() == -this.level.purpurConfig.drowningDamageInterval) { // Purpur ++ if (this.getAirSupply() == -this.level().purpurConfig.drowningDamageInterval) { // Purpur this.setAirSupply(0); Vec3 vec3d = this.getDeltaMovement(); @@ -35,12 +35,12 @@ index c7f53783c210f79a70577aa3d4f53b5410f26387..7e9c1dd6ccc6ce9dba8588b8fcd20a5f } - this.hurt(this.damageSources().drown(), 2.0F); -+ this.hurt(this.damageSources().drown(), (float) this.level.purpurConfig.damageFromDrowning); // Purpur ++ this.hurt(this.damageSources().drown(), (float) this.level().purpurConfig.damageFromDrowning); // Purpur } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 205ffb12c6ca4e614655b29fedcbc87155606880..bc0ce5ee17cc575c4bfb4e74227dd07fc8540366 100644 +index 6632e1e48483b512a7af0f1308116d852ac2a900..60841d2da5b3ad0912fb7931d238afa4a574dfc3 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -166,6 +166,15 @@ public class PurpurWorldConfig { diff --git a/patches/server/0146-Break-individual-slabs-when-sneaking.patch b/patches/server/0146-Break-individual-slabs-when-sneaking.patch index c3587cf86..682145af5 100644 --- a/patches/server/0146-Break-individual-slabs-when-sneaking.patch +++ b/patches/server/0146-Break-individual-slabs-when-sneaking.patch @@ -5,14 +5,14 @@ Subject: [PATCH] Break individual slabs when sneaking diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -index b9041e46a4fafeac004cf8a0ef9d7daaa9bfb0ff..7501e5773acdacca36ba72d71118c264f85d423c 100644 +index 2a923b575fa2e3393f6f667e2ce8adf38fc03afe..2a18d9b7ab5d28458e53ccad29edc6f9c2c3099c 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java @@ -396,6 +396,7 @@ public class ServerPlayerGameMode { } else {capturedBlockEntity = true;} // Paper end return false; } -+ if (this.player.level.purpurConfig.slabHalfBreak && this.player.isShiftKeyDown() && iblockdata.getBlock() instanceof net.minecraft.world.level.block.SlabBlock && ((net.minecraft.world.level.block.SlabBlock) iblockdata.getBlock()).halfBreak(iblockdata, pos, this.player)) return true; // Purpur ++ if (this.player.level().purpurConfig.slabHalfBreak && this.player.isShiftKeyDown() && iblockdata.getBlock() instanceof net.minecraft.world.level.block.SlabBlock && ((net.minecraft.world.level.block.SlabBlock) iblockdata.getBlock()).halfBreak(iblockdata, pos, this.player)) return true; // Purpur } // CraftBukkit end @@ -47,7 +47,7 @@ index 18b603d646081926343dea108b55d641df1c2c34..03ad3e45fc6d48091ac0c0ba5dc3d014 + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index bc0ce5ee17cc575c4bfb4e74227dd07fc8540366..25d224c38469e82957e924125153d8dc4fef1db3 100644 +index 60841d2da5b3ad0912fb7931d238afa4a574dfc3..ddfa196494b8e4d61dcaf064cc1fd97127638dc7 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -606,6 +606,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0149-Option-to-make-doors-require-redstone.patch b/patches/server/0149-Option-to-make-doors-require-redstone.patch index 1c2301ebb..20c7d2d0f 100644 --- a/patches/server/0149-Option-to-make-doors-require-redstone.patch +++ b/patches/server/0149-Option-to-make-doors-require-redstone.patch @@ -36,7 +36,7 @@ index 42ae4d293a420f0b8eb476df6389b2e7a693895f..fa1a2483c24d95ca03c269cde68c335e } else { DoorBlock blockdoor = (DoorBlock) iblockdata.getBlock(); diff --git a/src/main/java/net/minecraft/world/level/block/DoorBlock.java b/src/main/java/net/minecraft/world/level/block/DoorBlock.java -index c028a7158e41a0754abb8e24dcd647633fbf3fe8..cd65d32f4af016d4937e598c71386a3072f4c490 100644 +index c028a7158e41a0754abb8e24dcd647633fbf3fe8..bfd90aa35dce7f8843f7331907a446332db5fade 100644 --- a/src/main/java/net/minecraft/world/level/block/DoorBlock.java +++ b/src/main/java/net/minecraft/world/level/block/DoorBlock.java @@ -167,6 +167,7 @@ public class DoorBlock extends Block { @@ -54,7 +54,7 @@ index c028a7158e41a0754abb8e24dcd647633fbf3fe8..cd65d32f4af016d4937e598c71386a30 + + // Purpur start + public static boolean requiresRedstone(Level level, BlockState state, BlockPos pos) { -+ if (level.purpurConfig.doorRequiresRedstone.contains(state.getBlock())) { ++ if (level().purpurConfig.doorRequiresRedstone.contains(state.getBlock())) { + // force update client + BlockPos otherPos = pos.relative(state.getValue(DoorBlock.HALF) == DoubleBlockHalf.LOWER ? Direction.UP : Direction.DOWN); + BlockState otherState = level.getBlockState(otherPos); @@ -67,7 +67,7 @@ index c028a7158e41a0754abb8e24dcd647633fbf3fe8..cd65d32f4af016d4937e598c71386a30 + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 7fd0f37cfb1abf85adf84f5b7f1ed0769eb49208..65f6616737e8936e71160b71d410b1a177be1405 100644 +index e3ee434dcca8edafcca3c8f9a28349dccad23617..c0485f0fc5ec96ff709d95c0b5981e6d7e8d6c6f 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -510,6 +510,16 @@ public class PurpurWorldConfig { diff --git a/patches/server/0153-Piglin-portal-spawn-modifier.patch b/patches/server/0153-Piglin-portal-spawn-modifier.patch index bb56b091d..1c35a02c6 100644 --- a/patches/server/0153-Piglin-portal-spawn-modifier.patch +++ b/patches/server/0153-Piglin-portal-spawn-modifier.patch @@ -31,22 +31,22 @@ index 2c085c4a154cb0f8a1d38453f43474a764398784..589b437e7c97c846410f293e2f014bdc pos = pos.below(); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 7206fa9f4fff69068015f2b4801f33836a48e035..6e401b55e16cebf56156bf88ecd8d97045721efd 100644 +index 75cea7300dee21af13cf448f75361b69ae9d5517..7833464a3c8e4ec96abf5da8728024b3677a2d38 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1376,6 +1376,7 @@ public class PurpurWorldConfig { +@@ -1636,6 +1636,7 @@ public class PurpurWorldConfig { public double piglinMaxHealth = 16.0D; public boolean piglinBypassMobGriefing = false; public boolean piglinTakeDamageFromWater = false; + public int piglinPortalSpawnModifier = 2000; private void piglinSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.piglin.attributes.max-health", piglinMaxHealth); -@@ -1385,6 +1386,7 @@ public class PurpurWorldConfig { + piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); + piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); +@@ -1648,6 +1649,7 @@ public class PurpurWorldConfig { piglinMaxHealth = getDouble("mobs.piglin.attributes.max_health", piglinMaxHealth); piglinBypassMobGriefing = getBoolean("mobs.piglin.bypass-mob-griefing", piglinBypassMobGriefing); piglinTakeDamageFromWater = getBoolean("mobs.piglin.takes-damage-from-water", piglinTakeDamageFromWater); + piglinPortalSpawnModifier = getInt("mobs.piglin.portal-spawn-modifier", piglinPortalSpawnModifier); } - public double piglinBruteMaxHealth = 50.0D; + public boolean piglinBruteRidable = false; diff --git a/patches/server/0155-Config-for-wither-explosion-radius.patch b/patches/server/0155-Config-for-wither-explosion-radius.patch index cde16dc87..a2731f0d7 100644 --- a/patches/server/0155-Config-for-wither-explosion-radius.patch +++ b/patches/server/0155-Config-for-wither-explosion-radius.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Config for wither explosion radius diff --git a/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java b/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java -index 80b86d5dd68c3d288a1a61ea8aa1cba9d899aa1c..f92e7624f774f883fac7bb51c2e46fdc7c16aea6 100644 +index 80b86d5dd68c3d288a1a61ea8aa1cba9d899aa1c..7847915fb90e45e44ba514957193fa7b747e0c76 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java +++ b/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java @@ -95,7 +95,7 @@ public class WitherSkull extends AbstractHurtingProjectile { @@ -13,27 +13,27 @@ index 80b86d5dd68c3d288a1a61ea8aa1cba9d899aa1c..f92e7624f774f883fac7bb51c2e46fdc // CraftBukkit start // this.level().explode(this, this.getX(), this.getY(), this.getZ(), 1.0F, false, World.a.MOB); - ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 1.0F, false); -+ ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), this.level.purpurConfig.witherExplosionRadius, false); // Purpur ++ ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), this.level().purpurConfig.witherExplosionRadius, false); // Purpur this.level().getCraftServer().getPluginManager().callEvent(event); if (!event.isCancelled()) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 6e401b55e16cebf56156bf88ecd8d97045721efd..e178d0a4ac56d861198d38e3c3c70eef7828c404 100644 +index 7833464a3c8e4ec96abf5da8728024b3677a2d38..dbfe6549a0fcc6acd7b1ffb6385dc228b834ab8b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1838,6 +1838,7 @@ public class PurpurWorldConfig { +@@ -2275,6 +2275,7 @@ public class PurpurWorldConfig { public boolean witherBypassMobGriefing = false; public boolean witherTakeDamageFromWater = false; public boolean witherCanRideVehicles = false; + public float witherExplosionRadius = 1.0F; private void witherSettings() { - if (PurpurConfig.version < 8) { - double oldValue = getDouble("mobs.wither.max-health", witherMaxHealth); -@@ -1854,6 +1855,7 @@ public class PurpurWorldConfig { + witherRidable = getBoolean("mobs.wither.ridable", witherRidable); + witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); +@@ -2295,6 +2296,7 @@ public class PurpurWorldConfig { witherBypassMobGriefing = getBoolean("mobs.wither.bypass-mob-griefing", witherBypassMobGriefing); witherTakeDamageFromWater = getBoolean("mobs.wither.takes-damage-from-water", witherTakeDamageFromWater); witherCanRideVehicles = getBoolean("mobs.wither.can-ride-vehicles", witherCanRideVehicles); + witherExplosionRadius = (float) getDouble("mobs.wither.explosion-radius", witherExplosionRadius); } - public double witherSkeletonMaxHealth = 20.0D; + public boolean witherSkeletonRidable = false; diff --git a/patches/server/0157-Config-for-changing-the-blocks-that-turn-into-dirt-p.patch b/patches/server/0157-Config-for-changing-the-blocks-that-turn-into-dirt-p.patch index 31c85f1e5..c9c5585ad 100644 --- a/patches/server/0157-Config-for-changing-the-blocks-that-turn-into-dirt-p.patch +++ b/patches/server/0157-Config-for-changing-the-blocks-that-turn-into-dirt-p.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Config for changing the blocks that turn into dirt paths diff --git a/src/main/java/net/minecraft/world/item/ShovelItem.java b/src/main/java/net/minecraft/world/item/ShovelItem.java -index c7195f2e12bbd6545f7bffcc2b4ba5cc3d48df20..5e730bc9c8ff94b16ac2bf8567dda8aea2ee4b2a 100644 +index c7195f2e12bbd6545f7bffcc2b4ba5cc3d48df20..0f4ad7d12b2a3beb7f013c64da3ab4f0ef2c535e 100644 --- a/src/main/java/net/minecraft/world/item/ShovelItem.java +++ b/src/main/java/net/minecraft/world/item/ShovelItem.java @@ -34,7 +34,7 @@ public class ShovelItem extends DiggerItem { @@ -13,12 +13,12 @@ index c7195f2e12bbd6545f7bffcc2b4ba5cc3d48df20..5e730bc9c8ff94b16ac2bf8567dda8ae } else { Player player = context.getPlayer(); - BlockState blockState2 = FLATTENABLES.get(blockState.getBlock()); -+ BlockState blockState2 = level.purpurConfig.shovelTurnsBlockToGrassPath.contains(blockState.getBlock()) ? Blocks.DIRT_PATH.defaultBlockState() : null; // Purpur ++ BlockState blockState2 = level().purpurConfig.shovelTurnsBlockToGrassPath.contains(blockState.getBlock()) ? Blocks.DIRT_PATH.defaultBlockState() : null; // Purpur BlockState blockState3 = null; Runnable afterAction = null; // Paper if (blockState2 != null && level.getBlockState(blockPos.above()).isAir()) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e178d0a4ac56d861198d38e3c3c70eef7828c404..1bd6ddb4cd5b77074a6f9fd5d4024db1c8567703 100644 +index dbfe6549a0fcc6acd7b1ffb6385dc228b834ab8b..4d8696198ad30f283e91bec76d392d6a825aaeb0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -450,6 +450,21 @@ public class PurpurWorldConfig { diff --git a/patches/server/0158-Configurable-piston-push-limit.patch b/patches/server/0158-Configurable-piston-push-limit.patch index 065e3537e..de6b14e82 100644 --- a/patches/server/0158-Configurable-piston-push-limit.patch +++ b/patches/server/0158-Configurable-piston-push-limit.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configurable piston push limit diff --git a/src/main/java/net/minecraft/world/level/block/piston/PistonStructureResolver.java b/src/main/java/net/minecraft/world/level/block/piston/PistonStructureResolver.java -index 744d91546d1a810f60a43c15ed74b4158f341a4a..354538daefa603f6df5a139b6bff87dbb4cef178 100644 +index 744d91546d1a810f60a43c15ed74b4158f341a4a..943bb156bfc215fee1e2a4a65c88ff37208f9044 100644 --- a/src/main/java/net/minecraft/world/level/block/piston/PistonStructureResolver.java +++ b/src/main/java/net/minecraft/world/level/block/piston/PistonStructureResolver.java @@ -86,7 +86,7 @@ public class PistonStructureResolver { @@ -13,7 +13,7 @@ index 744d91546d1a810f60a43c15ed74b4158f341a4a..354538daefa603f6df5a139b6bff87db } else { int i = 1; - if (i + this.toPush.size() > 12) { -+ if (i + this.toPush.size() > this.level.purpurConfig.pistonBlockPushLimit) { // Purpur ++ if (i + this.toPush.size() > this.level().purpurConfig.pistonBlockPushLimit) { // Purpur return false; } else { while(isSticky(blockState)) { @@ -22,7 +22,7 @@ index 744d91546d1a810f60a43c15ed74b4158f341a4a..354538daefa603f6df5a139b6bff87db ++i; - if (i + this.toPush.size() > 12) { -+ if (i + this.toPush.size() > this.level.purpurConfig.pistonBlockPushLimit) { // Purpur ++ if (i + this.toPush.size() > this.level().purpurConfig.pistonBlockPushLimit) { // Purpur return false; } } @@ -31,12 +31,12 @@ index 744d91546d1a810f60a43c15ed74b4158f341a4a..354538daefa603f6df5a139b6bff87db } - if (this.toPush.size() >= 12) { -+ if (this.toPush.size() >= this.level.purpurConfig.pistonBlockPushLimit) { // Purpur ++ if (this.toPush.size() >= this.level().purpurConfig.pistonBlockPushLimit) { // Purpur return false; } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 1bd6ddb4cd5b77074a6f9fd5d4024db1c8567703..e19e409b7e69023579db992f2b13359b18fd3dcc 100644 +index 4d8696198ad30f283e91bec76d392d6a825aaeb0..a8f5a3c7a756cb74cf065f1797b4a1e47b595236 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -631,6 +631,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0160-Configurable-mob-blindness.patch b/patches/server/0160-Configurable-mob-blindness.patch index be953631d..29fb8e15c 100644 --- a/patches/server/0160-Configurable-mob-blindness.patch +++ b/patches/server/0160-Configurable-mob-blindness.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Configurable mob blindness Ported from https://github.com/raltsmc/mobblindness diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 7e9c1dd6ccc6ce9dba8588b8fcd20a5f294cc52e..cb8f198801f74a6cd3cc0ae676005d72badff446 100644 +index 2f48ddb7d2731bd05d149d6286ae8292dfbec94b..9cf87d4009e8d71d844cf1583a1457b45a523fff 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -1038,6 +1038,17 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -19,7 +19,7 @@ index 7e9c1dd6ccc6ce9dba8588b8fcd20a5f294cc52e..cb8f198801f74a6cd3cc0ae676005d72 + if (entityliving.hasEffect(MobEffects.BLINDNESS)) { + int amplifier = entityliving.getEffect(MobEffects.BLINDNESS).getAmplifier(); + for (int i = 0; i < amplifier; i++) { -+ d0 *= this.level.purpurConfig.mobsBlindnessMultiplier; ++ d0 *= this.level().purpurConfig.mobsBlindnessMultiplier; + } + } + } @@ -28,7 +28,7 @@ index 7e9c1dd6ccc6ce9dba8588b8fcd20a5f294cc52e..cb8f198801f74a6cd3cc0ae676005d72 return d0; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e19e409b7e69023579db992f2b13359b18fd3dcc..89652648990c50fc4f25318026ee1da925e7364f 100644 +index a8f5a3c7a756cb74cf065f1797b4a1e47b595236..1d30ead160227a6b6b0459c92aaf2134317f5538 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -134,6 +134,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0162-Config-for-health-to-impact-Creeper-explosion-radius.patch b/patches/server/0162-Config-for-health-to-impact-Creeper-explosion-radius.patch index 654eadaea..dd1b89478 100644 --- a/patches/server/0162-Config-for-health-to-impact-Creeper-explosion-radius.patch +++ b/patches/server/0162-Config-for-health-to-impact-Creeper-explosion-radius.patch @@ -5,14 +5,14 @@ Subject: [PATCH] Config for health to impact Creeper explosion radius diff --git a/src/main/java/net/minecraft/world/entity/monster/Creeper.java b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -index 13a1ede4fc72ef2811250ac4991ecd2bc10dbe95..a2c21c9c3ec6883661c63359e3c63ea090fcc07f 100644 +index 56aaf99a94944de42f437e18806381e3978c305a..e2fba88438835f63605b81eeeff5345b4bcc071a 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java @@ -370,9 +370,10 @@ public class Creeper extends Monster implements PowerableMob { this.exploding = true; // Purpur if (!this.level().isClientSide) { float f = this.isPowered() ? 2.0F : 1.0F; -+ float multiplier = this.level.purpurConfig.creeperHealthRadius ? this.getHealth() / this.getMaxHealth() : 1; // Purpur ++ float multiplier = this.level().purpurConfig.creeperHealthRadius ? this.getHealth() / this.getMaxHealth() : 1; // Purpur // CraftBukkit start - ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), this.explosionRadius * f, false); @@ -21,22 +21,22 @@ index 13a1ede4fc72ef2811250ac4991ecd2bc10dbe95..a2c21c9c3ec6883661c63359e3c63ea0 if (!event.isCancelled()) { this.dead = true; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 89652648990c50fc4f25318026ee1da925e7364f..582fffb4caca2cd260fd24dab2ea7529eb2b74c3 100644 +index 1d30ead160227a6b6b0459c92aaf2134317f5538..a2cceab5518a48d87a6bbeb5bc9b87c96611c336 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -856,6 +856,7 @@ public class PurpurWorldConfig { +@@ -918,6 +918,7 @@ public class PurpurWorldConfig { public boolean creeperBypassMobGriefing = false; public boolean creeperTakeDamageFromWater = false; public boolean creeperExplodeWhenKilled = false; + public boolean creeperHealthRadius = false; private void creeperSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.creeper.attributes.max-health", creeperMaxHealth); -@@ -868,6 +869,7 @@ public class PurpurWorldConfig { + creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); + creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); +@@ -933,6 +934,7 @@ public class PurpurWorldConfig { creeperBypassMobGriefing = getBoolean("mobs.creeper.bypass-mob-griefing", creeperBypassMobGriefing); creeperTakeDamageFromWater = getBoolean("mobs.creeper.takes-damage-from-water", creeperTakeDamageFromWater); creeperExplodeWhenKilled = getBoolean("mobs.creeper.explode-when-killed", creeperExplodeWhenKilled); + creeperHealthRadius = getBoolean("mobs.creeper.health-impacts-explosion", creeperHealthRadius); } - public double dolphinMaxHealth = 10.0D; + public boolean dolphinRidable = false; diff --git a/patches/server/0163-Iron-golem-calm-anger-options.patch b/patches/server/0163-Iron-golem-calm-anger-options.patch index fe8f4fb67..f01a97fbe 100644 --- a/patches/server/0163-Iron-golem-calm-anger-options.patch +++ b/patches/server/0163-Iron-golem-calm-anger-options.patch @@ -5,13 +5,13 @@ Subject: [PATCH] Iron golem calm anger options diff --git a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -index b89f01408c9ebaeeee93f1924010be6db89f1c66..39dfe26b37fc980080e7e0e7bdc82a94f00b0c33 100644 +index 58539d29b8e2a8c0676cc574f64e7d61613e1451..1ffb8e1c386fc85796432281ac407a935169b186 100644 --- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java @@ -96,6 +96,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { @Override protected void registerGoals() { - if (level.purpurConfig.ironGolemCanSwim) this.goalSelector.addGoal(0, new net.minecraft.world.entity.ai.goal.FloatGoal(this)); // Purpur + if (level().purpurConfig.ironGolemCanSwim) this.goalSelector.addGoal(0, new net.minecraft.world.entity.ai.goal.FloatGoal(this)); // Purpur + if (this.level().purpurConfig.ironGolemPoppyCalm) this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.ReceiveFlower(this)); // Purpur this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0D, true)); @@ -25,19 +25,19 @@ index b89f01408c9ebaeeee93f1924010be6db89f1c66..39dfe26b37fc980080e7e0e7bdc82a94 } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 582fffb4caca2cd260fd24dab2ea7529eb2b74c3..693f8bea8ec84e357734bc495dbea13dca62fc12 100644 +index a2cceab5518a48d87a6bbeb5bc9b87c96611c336..14a1150bb860af3e99ab67f5bbb44c791c80f0df 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1197,6 +1197,8 @@ public class PurpurWorldConfig { - +@@ -1393,6 +1393,8 @@ public class PurpurWorldConfig { + public boolean ironGolemCanSwim = false; public double ironGolemMaxHealth = 100.0D; public boolean ironGolemTakeDamageFromWater = false; + public boolean ironGolemPoppyCalm = false; + public boolean ironGolemHealCalm = false; private void ironGolemSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.iron_golem.attributes.max-health", ironGolemMaxHealth); -@@ -1205,6 +1207,8 @@ public class PurpurWorldConfig { + ironGolemRidable = getBoolean("mobs.iron_golem.ridable", ironGolemRidable); + ironGolemRidableInWater = getBoolean("mobs.iron_golem.ridable-in-water", ironGolemRidableInWater); +@@ -1405,6 +1407,8 @@ public class PurpurWorldConfig { } ironGolemMaxHealth = getDouble("mobs.iron_golem.attributes.max_health", ironGolemMaxHealth); ironGolemTakeDamageFromWater = getBoolean("mobs.iron_golem.takes-damage-from-water", ironGolemTakeDamageFromWater); diff --git a/patches/server/0164-Breedable-parrots.patch b/patches/server/0164-Breedable-parrots.patch index d65bd1c2e..5a3b248b3 100644 --- a/patches/server/0164-Breedable-parrots.patch +++ b/patches/server/0164-Breedable-parrots.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Breedable parrots diff --git a/src/main/java/net/minecraft/world/entity/animal/Parrot.java b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -index 4bbf7b2afa98ed0dae079596cd99606bb20d63fa..44f3269e0b17b3932b6a184e3f8512bc416f6376 100644 +index 08935a1f2c4a3f43483719686e5baab5063cdfce..bfae3b94ab035e1c27c988cfcc3b449c7266efd3 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Parrot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Parrot.java @@ -226,6 +226,7 @@ public class Parrot extends ShoulderRidingEntity implements VariantHolder diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index cb062cfb6f4809fc580108503fe77e579ab954f5..c8df18120e1d8de44df7b0636ea697c0951fb38c 100644 +index a1aaef67d5f4ee42714638e324f7965f2ad27eb0..776cef835e2512bde83842e72b1bd00250374eb6 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -477,6 +477,21 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -32,7 +32,7 @@ index cb062cfb6f4809fc580108503fe77e579ab954f5..c8df18120e1d8de44df7b0636ea697c0 return this.hardCollides; } diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index cb8f198801f74a6cd3cc0ae676005d72badff446..84a967b39e737d00b388b5ae743b157388e8b6db 100644 +index 9cf87d4009e8d71d844cf1583a1457b45a523fff..75e994b0da981190083c8cda27a253116221aadb 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -265,6 +265,7 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -92,7 +92,7 @@ index cb8f198801f74a6cd3cc0ae676005d72badff446..84a967b39e737d00b388b5ae743b1573 public boolean isSensitiveToWater() { diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 1f1c7a8668dcdf7850720b46b395322601dbf9a0..f2ae40878dbc3d7c05e986933767f7bf2f6e0e0a 100644 +index b0ce2885a304cb15964a1d3bf047c49f95ab594d..6810c5af5c27acadb28b8a1e88c7c1cdf773835f 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java @@ -1733,17 +1733,7 @@ public abstract class Mob extends LivingEntity implements Targeting { @@ -191,7 +191,7 @@ index 93443238b77c04f6a9da3c25427d200ccf4699f8..892ae3a9ac2395896ff7881c49eaece8 // Paper end diff --git a/src/main/java/net/minecraft/world/entity/monster/Husk.java b/src/main/java/net/minecraft/world/entity/monster/Husk.java -index bf0d201f0211a3d4d61fdf0fbea7bdf4ea220458..e36e029759b5dbc9c3641a1a3c1f28a538bd79c8 100644 +index 31706620960f5f153565f3cf64e32d0f4d10feb8..1df39e11d4fe3146fba9a0605c623384513311ac 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Husk.java +++ b/src/main/java/net/minecraft/world/entity/monster/Husk.java @@ -20,6 +20,7 @@ public class Husk extends Zombie { @@ -201,7 +201,7 @@ index bf0d201f0211a3d4d61fdf0fbea7bdf4ea220458..e36e029759b5dbc9c3641a1a3c1f28a5 + this.setShouldBurnInDay(false); // Purpur } - @Override + // Purpur start @@ -75,7 +76,7 @@ public class Husk extends Zombie { @Override @@ -212,7 +212,7 @@ index bf0d201f0211a3d4d61fdf0fbea7bdf4ea220458..e36e029759b5dbc9c3641a1a3c1f28a5 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -index 33e2f87c38fdbd79c3dcccc0c0dada5e05f78871..7cf3014eb0c658dd2e9d8ee369549eb17a93c9d3 100644 +index 6ae67916366ebdc5eed859c4c821e852781c5441..7897d72dacc787b027306911eea4d59e31d06142 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java @@ -59,6 +59,7 @@ public class Phantom extends FlyingMob implements Enemy { @@ -228,8 +228,8 @@ index 33e2f87c38fdbd79c3dcccc0c0dada5e05f78871..7cf3014eb0c658dd2e9d8ee369549eb1 @Override public void aiStep() { - // Purpur start -- boolean burnFromDaylight = this.shouldBurnInDay && this.level.purpurConfig.phantomBurnInDaylight; -- boolean burnFromLightSource = this.level.purpurConfig.phantomBurnInLight > 0 && this.level.getMaxLocalRawBrightness(blockPosition()) >= this.level.purpurConfig.phantomBurnInLight; +- boolean burnFromDaylight = this.shouldBurnInDay && this.level().purpurConfig.phantomBurnInDaylight; +- boolean burnFromLightSource = this.level().purpurConfig.phantomBurnInLight > 0 && this.level.getMaxLocalRawBrightness(blockPosition()) >= this.level().purpurConfig.phantomBurnInLight; - if (this.isAlive() && (burnFromDaylight || burnFromLightSource)) { // Paper - Configurable Burning - if (getRider() == null || !this.isControllable()) - // Purpur end @@ -268,8 +268,8 @@ index 33e2f87c38fdbd79c3dcccc0c0dada5e05f78871..7cf3014eb0c658dd2e9d8ee369549eb1 + // private boolean shouldBurnInDay = true; // Purpur - moved to LivingEntity - keep methods for ABI compatibility + // Purpur start + public boolean shouldBurnInDay() { -+ boolean burnFromDaylight = this.shouldBurnInDay && this.level.purpurConfig.phantomBurnInDaylight; -+ boolean burnFromLightSource = this.level.purpurConfig.phantomBurnInLight > 0 && this.level.getMaxLocalRawBrightness(blockPosition()) >= this.level.purpurConfig.phantomBurnInLight; ++ boolean burnFromDaylight = this.shouldBurnInDay && this.level().purpurConfig.phantomBurnInDaylight; ++ boolean burnFromLightSource = this.level().purpurConfig.phantomBurnInLight > 0 && this.level.getMaxLocalRawBrightness(blockPosition()) >= this.level().purpurConfig.phantomBurnInLight; + return burnFromDaylight || burnFromLightSource; + } + // Purpur End @@ -277,7 +277,7 @@ index 33e2f87c38fdbd79c3dcccc0c0dada5e05f78871..7cf3014eb0c658dd2e9d8ee369549eb1 // Paper end private static enum AttackPhase { diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index 54ee2eafe257fe8ac16ded66a8c49ba68d433450..2a50dcb60b062cff5b8bb2fcc42100c2e799fd5d 100644 +index a676d66dcb5ee72e6d8ffef4e210a3d2c8d605f2..0bc90b6d5c5a3cb3477d41336a9bb1130ff32fa1 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java @@ -95,11 +95,12 @@ public class Zombie extends Monster { diff --git a/patches/server/0173-Config-MobEffect-by-world.patch b/patches/server/0173-Config-MobEffect-by-world.patch index 17a325f5a..c5de36312 100644 --- a/patches/server/0173-Config-MobEffect-by-world.patch +++ b/patches/server/0173-Config-MobEffect-by-world.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Config MobEffect by world diff --git a/src/main/java/net/minecraft/world/effect/MobEffect.java b/src/main/java/net/minecraft/world/effect/MobEffect.java -index bcce17f884b57e619749351b7b2047f0a5f9be71..350ad84b02ec85566dc360b3d760913507426519 100644 +index bcce17f884b57e619749351b7b2047f0a5f9be71..878f3da0067f89f47141f41c733bef67f0987929 100644 --- a/src/main/java/net/minecraft/world/effect/MobEffect.java +++ b/src/main/java/net/minecraft/world/effect/MobEffect.java @@ -60,16 +60,16 @@ public class MobEffect { @@ -13,20 +13,20 @@ index bcce17f884b57e619749351b7b2047f0a5f9be71..350ad84b02ec85566dc360b3d7609135 if (this == MobEffects.REGENERATION) { if (entity.getHealth() < entity.getMaxHealth()) { - entity.heal(1.0F, RegainReason.MAGIC_REGEN); // CraftBukkit -+ entity.heal(entity.level.purpurConfig.entityHealthRegenAmount, RegainReason.MAGIC_REGEN); // CraftBukkit // Purpur ++ entity.heal(entity.level().purpurConfig.entityHealthRegenAmount, RegainReason.MAGIC_REGEN); // CraftBukkit // Purpur } } else if (this == MobEffects.POISON) { - if (entity.getHealth() > 1.0F) { - entity.hurt(entity.damageSources().poison, 1.0F); // CraftBukkit - DamageSource.MAGIC -> CraftEventFactory.POISON -+ if (entity.getHealth() > entity.level.purpurConfig.entityMinimalHealthPoison) { // Purpur -+ entity.hurt(entity.damageSources().poison, entity.level.purpurConfig.entityPoisonDegenerationAmount); // CraftBukkit - DamageSource.MAGIC -> CraftEventFactory.POISON // Purpur ++ if (entity.getHealth() > entity.level().purpurConfig.entityMinimalHealthPoison) { // Purpur ++ entity.hurt(entity.damageSources().poison, entity.level().purpurConfig.entityPoisonDegenerationAmount); // CraftBukkit - DamageSource.MAGIC -> CraftEventFactory.POISON // Purpur } } else if (this == MobEffects.WITHER) { - entity.hurt(entity.damageSources().wither(), 1.0F); -+ entity.hurt(entity.damageSources().wither(), entity.level.purpurConfig.entityWitherDegenerationAmount); // Purpur ++ entity.hurt(entity.damageSources().wither(), entity.level().purpurConfig.entityWitherDegenerationAmount); // Purpur } else if (this == MobEffects.HUNGER && entity instanceof Player) { - ((Player) entity).causeFoodExhaustion(0.005F * (float) (amplifier + 1), org.bukkit.event.entity.EntityExhaustionEvent.ExhaustionReason.HUNGER_EFFECT); // CraftBukkit - EntityExhaustionEvent -+ ((Player) entity).causeFoodExhaustion(entity.level.purpurConfig.humanHungerExhaustionAmount * (float) (amplifier + 1), org.bukkit.event.entity.EntityExhaustionEvent.ExhaustionReason.HUNGER_EFFECT); // CraftBukkit - EntityExhaustionEvent // Purpur ++ ((Player) entity).causeFoodExhaustion(entity.level().purpurConfig.humanHungerExhaustionAmount * (float) (amplifier + 1), org.bukkit.event.entity.EntityExhaustionEvent.ExhaustionReason.HUNGER_EFFECT); // CraftBukkit - EntityExhaustionEvent // Purpur } else if (this == MobEffects.SATURATION && entity instanceof Player) { if (!entity.level().isClientSide) { // CraftBukkit start @@ -35,12 +35,12 @@ index bcce17f884b57e619749351b7b2047f0a5f9be71..350ad84b02ec85566dc360b3d7609135 if (!event.isCancelled()) { - entityhuman.getFoodData().eat(event.getFoodLevel() - oldFoodLevel, 1.0F); -+ entityhuman.getFoodData().eat(event.getFoodLevel() - oldFoodLevel, entity.level.purpurConfig.humanSaturationRegenAmount); // Purpur ++ entityhuman.getFoodData().eat(event.getFoodLevel() - oldFoodLevel, entity.level().purpurConfig.humanSaturationRegenAmount); // Purpur } ((ServerPlayer) entityhuman).connection.send(new ClientboundSetHealthPacket(((ServerPlayer) entityhuman).getBukkitEntity().getScaledHealth(), entityhuman.getFoodData().foodLevel, entityhuman.getFoodData().saturationLevel)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 6bf8059ab05652d604103f8421c35b79b1dcfcb6..6445b71428260809b476ccd0a21a0180715b436e 100644 +index fdd0a35b722a9056840edbac3bcb391bc062e499..9102c90bbc52bd5323cce4cfb5eb40e7e8b086ed 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -333,6 +333,21 @@ public class PurpurWorldConfig { diff --git a/patches/server/0174-Beacon-Activation-Range-Configurable.patch b/patches/server/0174-Beacon-Activation-Range-Configurable.patch index 29f70863b..5fa28b96f 100644 --- a/patches/server/0174-Beacon-Activation-Range-Configurable.patch +++ b/patches/server/0174-Beacon-Activation-Range-Configurable.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Beacon Activation Range Configurable diff --git a/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java -index 59246e24558569f7f50b4d4d508616798091c888..cc03c02f290ee8d58a2fea54b1f977f49a2cec6e 100644 +index 59246e24558569f7f50b4d4d508616798091c888..69e28b65a4a47dc61bae17b65f3f34a8cc3ef6f6 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java @@ -84,6 +84,16 @@ public class BeaconBlockEntity extends BlockEntity implements MenuProvider, Name @@ -15,10 +15,10 @@ index 59246e24558569f7f50b4d4d508616798091c888..cc03c02f290ee8d58a2fea54b1f977f4 + // Purpur Start + if (this.level != null) { + switch (this.levels) { -+ case 1: return this.level.purpurConfig.beaconLevelOne; -+ case 2: return this.level.purpurConfig.beaconLevelTwo; -+ case 3: return this.level.purpurConfig.beaconLevelThree; -+ case 4: return this.level.purpurConfig.beaconLevelFour; ++ case 1: return this.level().purpurConfig.beaconLevelOne; ++ case 2: return this.level().purpurConfig.beaconLevelTwo; ++ case 3: return this.level().purpurConfig.beaconLevelThree; ++ case 4: return this.level().purpurConfig.beaconLevelFour; + } + } + // Purpur End @@ -26,7 +26,7 @@ index 59246e24558569f7f50b4d4d508616798091c888..cc03c02f290ee8d58a2fea54b1f977f4 } else { return effectRange; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 6445b71428260809b476ccd0a21a0180715b436e..f381566fa0712a183c3af7fff1043c99a855efbb 100644 +index 9102c90bbc52bd5323cce4cfb5eb40e7e8b086ed..1a2474db319cd9b2a1ecc3cd87d48aed156a773f 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -525,6 +525,17 @@ public class PurpurWorldConfig { diff --git a/patches/server/0175-Add-toggle-for-sand-duping-fix.patch b/patches/server/0175-Add-toggle-for-sand-duping-fix.patch index 6302c9f2c..7e488c088 100644 --- a/patches/server/0175-Add-toggle-for-sand-duping-fix.patch +++ b/patches/server/0175-Add-toggle-for-sand-duping-fix.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add toggle for sand duping fix diff --git a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java -index eff81e846f696349b3bd3d26c02442f157b169f0..98cad555493376374fa2a19c365834895659f018 100644 +index eff81e846f696349b3bd3d26c02442f157b169f0..bdadc6bb8c0ddcbf4ec1a9d2b4267c9e7308c016 100644 --- a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java +++ b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java @@ -131,7 +131,7 @@ public class FallingBlockEntity extends Entity { @@ -13,7 +13,7 @@ index eff81e846f696349b3bd3d26c02442f157b169f0..98cad555493376374fa2a19c36583489 public void tick() { // Paper start - fix sand duping - if (this.isRemoved()) { -+ if (this.level.purpurConfig.fixSandDuping && this.isRemoved()) { // Purpur ++ if (this.level().purpurConfig.fixSandDuping && this.isRemoved()) { // Purpur return; } // Paper end - fix sand duping @@ -22,12 +22,12 @@ index eff81e846f696349b3bd3d26c02442f157b169f0..98cad555493376374fa2a19c36583489 // Paper start - fix sand duping - if (this.isRemoved()) { -+ if (this.level.purpurConfig.fixSandDuping && this.isRemoved()) { // Purpur ++ if (this.level().purpurConfig.fixSandDuping && this.isRemoved()) { // Purpur return; } // Paper end - fix sand duping diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f381566fa0712a183c3af7fff1043c99a855efbb..f8d0003d1412d087ae367b42b428eb5763392855 100644 +index 1a2474db319cd9b2a1ecc3cd87d48aed156a773f..1b9ac5dd28472b4726afc34c4ecbd1cf8478c817 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -714,6 +714,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0176-Add-toggle-for-end-portal-safe-teleporting.patch b/patches/server/0176-Add-toggle-for-end-portal-safe-teleporting.patch index 2c5850cb4..907a77b0c 100644 --- a/patches/server/0176-Add-toggle-for-end-portal-safe-teleporting.patch +++ b/patches/server/0176-Add-toggle-for-end-portal-safe-teleporting.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add toggle for end portal safe teleporting diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index c8df18120e1d8de44df7b0636ea697c0951fb38c..c897bb42c708bb1f899469b56a3545d02cd24ca9 100644 +index 776cef835e2512bde83842e72b1bd00250374eb6..23280c8183285e3570d0d08b6af7fa1d03a57d35 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -3070,7 +3070,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -13,7 +13,7 @@ index c8df18120e1d8de44df7b0636ea697c0951fb38c..c897bb42c708bb1f899469b56a3545d0 this.processPortalCooldown(); - this.tickEndPortal(); // Paper - make end portalling safe -+ if (this.level.purpurConfig.endPortalSafeTeleporting) this.tickEndPortal(); // Paper - make end portalling safe // Purpur ++ if (this.level().purpurConfig.endPortalSafeTeleporting) this.tickEndPortal(); // Paper - make end portalling safe // Purpur } } @@ -45,7 +45,7 @@ index f80f6da484f4144e743079e5104bf503419074b2..2deddc746e43896584bd65ba8e7971a8 entity.portalWorld = ((ServerLevel)world); entity.portalBlock = pos.immutable(); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f8d0003d1412d087ae367b42b428eb5763392855..f3ff6f0e42d2b124578e3b89c57b7ef3e51d742c 100644 +index 1b9ac5dd28472b4726afc34c4ecbd1cf8478c817..08e4e58a8633ff420db668b6e735afc15b6bca5c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -652,6 +652,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0178-Burp-delay-burp-after-eating-food-fills-hunger-bar-c.patch b/patches/server/0178-Burp-delay-burp-after-eating-food-fills-hunger-bar-c.patch index 5a25b0f6c..a3863a1b8 100644 --- a/patches/server/0178-Burp-delay-burp-after-eating-food-fills-hunger-bar-c.patch +++ b/patches/server/0178-Burp-delay-burp-after-eating-food-fills-hunger-bar-c.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Burp delay, burp after eating food fills hunger bar diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index 6ffd1b70722f34cb06f472f2340597c4778a5bb8..1a409a4df5feacb24f5a46255ffd7226baf09ade 100644 +index bb1cda93ae9e754acf20193100ce0de56bf47843..c4270c9c188137e634064386363c19811422d5bb 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java @@ -188,6 +188,7 @@ public abstract class Player extends LivingEntity { @@ -40,7 +40,7 @@ index 6ffd1b70722f34cb06f472f2340597c4778a5bb8..1a409a4df5feacb24f5a46255ffd7226 CriteriaTriggers.CONSUME_ITEM.trigger((ServerPlayer) this, stack); } diff --git a/src/main/java/net/minecraft/world/food/FoodData.java b/src/main/java/net/minecraft/world/food/FoodData.java -index 2038df72f8d7d33d4105de8129628daf21de6f0f..3f7193bebdfd914df2efeb57d77fd86af68d4041 100644 +index 2038df72f8d7d33d4105de8129628daf21de6f0f..31ec6022b305df0ae02364c916ecf18425a0bc36 100644 --- a/src/main/java/net/minecraft/world/food/FoodData.java +++ b/src/main/java/net/minecraft/world/food/FoodData.java @@ -33,8 +33,10 @@ public class FoodData { @@ -50,12 +50,12 @@ index 2038df72f8d7d33d4105de8129628daf21de6f0f..3f7193bebdfd914df2efeb57d77fd86a + int oldValue = this.foodLevel; // Purpur this.foodLevel = Math.min(food + this.foodLevel, 20); this.saturationLevel = Math.min(this.saturationLevel + (float) food * saturationModifier * 2.0F, (float) this.foodLevel); -+ if (this.entityhuman.level.purpurConfig.playerBurpWhenFull && this.foodLevel == 20 && oldValue < 20) this.entityhuman.burpDelay = this.entityhuman.level.purpurConfig.playerBurpDelay; // Purpur ++ if (this.entityhuman.level().purpurConfig.playerBurpWhenFull && this.foodLevel == 20 && oldValue < 20) this.entityhuman.burpDelay = this.entityhuman.level().purpurConfig.playerBurpDelay; // Purpur } public void eat(Item item, ItemStack stack) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f3ff6f0e42d2b124578e3b89c57b7ef3e51d742c..3b085bc3cf1aac1da85a0042a1f24345e00c3779 100644 +index 08e4e58a8633ff420db668b6e735afc15b6bca5c..da263ecf74c2da4d7b75bf612987289724c82968 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -392,6 +392,8 @@ public class PurpurWorldConfig { diff --git a/patches/server/0181-Shulker-spawn-from-bullet-options.patch b/patches/server/0181-Shulker-spawn-from-bullet-options.patch index 2b63b0972..07a6e9679 100644 --- a/patches/server/0181-Shulker-spawn-from-bullet-options.patch +++ b/patches/server/0181-Shulker-spawn-from-bullet-options.patch @@ -13,7 +13,7 @@ Subject: [PATCH] Shulker spawn from bullet options (7 - 1) / 5.0 = 1.2 1.0 - 1.2 = -0.2 0% (6 other shulkers) diff --git a/src/main/java/net/minecraft/world/entity/monster/Shulker.java b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -index f328cac216a0f2a3e4956ab65d083caf072351d0..c31f7a4def4d56520b73fcfd99fcf4bd0d548e04 100644 +index 8680668d97cbb737a72315ff5d3a68b30d14ffa6..48fcfef45ab149328573f4e80c8f0289f9eebbe8 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java @@ -513,12 +513,21 @@ public class Shulker extends AbstractGolem implements VariantHolder= this.starvationRate) { // CraftBukkit - add regen rate manipulation if (player.getHealth() > 10.0F || enumdifficulty == Difficulty.HARD || player.getHealth() > 1.0F && enumdifficulty == Difficulty.NORMAL) { - player.hurt(player.damageSources().starve(), 1.0F); -+ player.hurt(player.damageSources().starve(), player.level.purpurConfig.hungerStarvationDamage); // Purpur ++ player.hurt(player.damageSources().starve(), player.level().purpurConfig.hungerStarvationDamage); // Purpur } this.tickTimer = 0; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 1cf617de7dde251a297574b2b0a745ceb57bda4b..165783077b3b918be9f724edb205ab09ed8376bc 100644 +index 97c8b4c4ede3edf04319d3b9d4f5ebc36dc1f80e..6683a4fc4746b28d9b3d898258265874ed3e54e1 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2103,6 +2103,11 @@ public class PurpurWorldConfig { - zombifiedPiglinTakeDamageFromWater = getBoolean("mobs.zombified_piglin.takes-damage-from-water", zombifiedPiglinTakeDamageFromWater); +@@ -750,6 +750,11 @@ public class PurpurWorldConfig { + turtleEggsBypassMobGriefing = getBoolean("blocks.turtle_egg.bypass-mob-griefing", turtleEggsBypassMobGriefing); } + public float hungerStarvationDamage = 1.0F; diff --git a/patches/server/0187-Tool-actionable-options.patch b/patches/server/0187-Tool-actionable-options.patch index 4c9cb9e3e..ad6d68cde 100644 --- a/patches/server/0187-Tool-actionable-options.patch +++ b/patches/server/0187-Tool-actionable-options.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Tool actionable options diff --git a/src/main/java/net/minecraft/world/item/AxeItem.java b/src/main/java/net/minecraft/world/item/AxeItem.java -index 9c7d0b9cc2fa98d5785c914c0183f7d4b5b1c1ea..89a4ab17ca8d2aa1f52b041c610d7de19bf55e66 100644 +index 9c7d0b9cc2fa98d5785c914c0183f7d4b5b1c1ea..9f0ccd3f44a095940a9eba8d4de44db0593fae39 100644 --- a/src/main/java/net/minecraft/world/item/AxeItem.java +++ b/src/main/java/net/minecraft/world/item/AxeItem.java @@ -33,29 +33,32 @@ public class AxeItem extends DiggerItem { @@ -19,9 +19,9 @@ index 9c7d0b9cc2fa98d5785c914c0183f7d4b5b1c1ea..89a4ab17ca8d2aa1f52b041c610d7de1 - }); + // Purpur start + Block clickedBlock = level.getBlockState(blockPos).getBlock(); -+ Optional optional = Optional.ofNullable(level.purpurConfig.axeStrippables.get(blockState.getBlock())); -+ Optional optional2 = Optional.ofNullable(level.purpurConfig.axeWeatherables.get(blockState.getBlock())); -+ Optional optional3 = Optional.ofNullable(level.purpurConfig.axeWaxables.get(blockState.getBlock())); ++ Optional optional = Optional.ofNullable(level().purpurConfig.axeStrippables.get(blockState.getBlock())); ++ Optional optional2 = Optional.ofNullable(level().purpurConfig.axeWeatherables.get(blockState.getBlock())); ++ Optional optional3 = Optional.ofNullable(level().purpurConfig.axeWaxables.get(blockState.getBlock())); + // Purpur end ItemStack itemStack = context.getItemInHand(); - Optional optional4 = Optional.empty(); @@ -78,7 +78,7 @@ index 9c7d0b9cc2fa98d5785c914c0183f7d4b5b1c1ea..89a4ab17ca8d2aa1f52b041c610d7de1 return InteractionResult.PASS; } diff --git a/src/main/java/net/minecraft/world/item/HoeItem.java b/src/main/java/net/minecraft/world/item/HoeItem.java -index 180aec596110309aade13d2080f8824d152b07cb..c4aec1e5135a79837918b692e75a7b55d5cffeb0 100644 +index 180aec596110309aade13d2080f8824d152b07cb..23ecfc9937e21f391b51ea8f4545241a797f6439 100644 --- a/src/main/java/net/minecraft/world/item/HoeItem.java +++ b/src/main/java/net/minecraft/world/item/HoeItem.java @@ -34,15 +34,23 @@ public class HoeItem extends DiggerItem { @@ -93,7 +93,7 @@ index 180aec596110309aade13d2080f8824d152b07cb..c4aec1e5135a79837918b692e75a7b55 - Consumer consumer = pair.getSecond(); + // Purpur start + Block clickedBlock = level.getBlockState(blockPos).getBlock(); -+ var tillable = level.purpurConfig.hoeTillables.get(level.getBlockState(blockPos).getBlock()); ++ var tillable = level().purpurConfig.hoeTillables.get(level.getBlockState(blockPos).getBlock()); + if (tillable == null) { return InteractionResult.PASS; } else { + Predicate predicate = tillable.condition().predicate(); + Consumer consumer = (ctx) -> { @@ -122,7 +122,7 @@ index 180aec596110309aade13d2080f8824d152b07cb..c4aec1e5135a79837918b692e75a7b55 return InteractionResult.PASS; } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 165783077b3b918be9f724edb205ab09ed8376bc..5fe915ca0e43c809e7884b983755c7953e20e695 100644 +index 6683a4fc4746b28d9b3d898258265874ed3e54e1..2905ac9c8ee0555e5aeaeed480454e8463c753b1 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -528,6 +528,167 @@ public class PurpurWorldConfig { diff --git a/patches/server/0189-Summoner-API.patch b/patches/server/0189-Summoner-API.patch index 37108bd47..4e98fddf3 100644 --- a/patches/server/0189-Summoner-API.patch +++ b/patches/server/0189-Summoner-API.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Summoner API diff --git a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -index 39dfe26b37fc980080e7e0e7bdc82a94f00b0c33..b4e41bdca75fad328fe2936860e832f5221a6c31 100644 +index 1ffb8e1c386fc85796432281ac407a935169b186..c2817324ff57860ea2628dc4ac8e78b76cf67a5a 100644 --- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java @@ -60,6 +60,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { @@ -17,7 +17,7 @@ index 39dfe26b37fc980080e7e0e7bdc82a94f00b0c33..b4e41bdca75fad328fe2936860e832f5 public IronGolem(EntityType type, Level world) { super(type, world); @@ -93,6 +94,15 @@ public class IronGolem extends AbstractGolem implements NeutralMob { - return this.level.purpurConfig.ironGolemTakeDamageFromWater; + return this.level().purpurConfig.ironGolemTakeDamageFromWater; } + @Nullable @@ -31,7 +31,7 @@ index 39dfe26b37fc980080e7e0e7bdc82a94f00b0c33..b4e41bdca75fad328fe2936860e832f5 + @Override protected void registerGoals() { - if (level.purpurConfig.ironGolemCanSwim) this.goalSelector.addGoal(0, new net.minecraft.world.entity.ai.goal.FloatGoal(this)); // Purpur + if (level().purpurConfig.ironGolemCanSwim) this.goalSelector.addGoal(0, new net.minecraft.world.entity.ai.goal.FloatGoal(this)); // Purpur @@ -170,6 +180,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { public void addAdditionalSaveData(CompoundTag nbt) { super.addAdditionalSaveData(nbt); @@ -49,7 +49,7 @@ index 39dfe26b37fc980080e7e0e7bdc82a94f00b0c33..b4e41bdca75fad328fe2936860e832f5 } diff --git a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -index cfdc9b1341bafc9c92a520b1793add877336a8a3..6fee0d553c837addd3f6b15cb960b93fdb216dfd 100644 +index 2acd9fdd1b311f00cc5fae7d879427ededdeecec..e33364beff36e255989520d5d076729c9c8ed1fe 100644 --- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java @@ -49,6 +49,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM @@ -61,7 +61,7 @@ index cfdc9b1341bafc9c92a520b1793add877336a8a3..6fee0d553c837addd3f6b15cb960b93f public SnowGolem(EntityType type, Level world) { super(type, world); @@ -76,6 +77,15 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.snowGolemMaxHealth); + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.snowGolemMaxHealth); } + @Nullable @@ -93,7 +93,7 @@ index cfdc9b1341bafc9c92a520b1793add877336a8a3..6fee0d553c837addd3f6b15cb960b93f } 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 c9b27c1479e09c65533f173546d6692e77df46da..06166210a162e5a40610910c320b391551301bf6 100644 +index faa77256f116d2b9c9ad931238d10a994c63c484..7fc5562ef55809d864392f05599c2380b32f1fdd 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,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob @@ -105,7 +105,7 @@ index c9b27c1479e09c65533f173546d6692e77df46da..06166210a162e5a40610910c320b3915 // Paper start private boolean canPortal = false; @@ -122,6 +123,15 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob - return this.level.purpurConfig.witherTakeDamageFromWater; + return this.level().purpurConfig.witherTakeDamageFromWater; } + @Nullable diff --git a/patches/server/0191-option-to-disable-shulker-box-items-from-dropping-co.patch b/patches/server/0191-option-to-disable-shulker-box-items-from-dropping-co.patch index 3c7a559e4..515e9d8ed 100644 --- a/patches/server/0191-option-to-disable-shulker-box-items-from-dropping-co.patch +++ b/patches/server/0191-option-to-disable-shulker-box-items-from-dropping-co.patch @@ -6,7 +6,7 @@ Subject: [PATCH] option to disable shulker box items from dropping contents diff --git a/src/main/java/net/minecraft/world/item/BlockItem.java b/src/main/java/net/minecraft/world/item/BlockItem.java -index ebee8de2ed831755b6fd154f6cc77ac993839bb9..ff236d3ad8838b14e5a20c70b2a2ce56d441dc7f 100644 +index ebee8de2ed831755b6fd154f6cc77ac993839bb9..df88c6a0f3211ec9bcdbd7c023534da518d287e8 100644 --- a/src/main/java/net/minecraft/world/item/BlockItem.java +++ b/src/main/java/net/minecraft/world/item/BlockItem.java @@ -288,7 +288,7 @@ public class BlockItem extends Item { @@ -14,12 +14,12 @@ index ebee8de2ed831755b6fd154f6cc77ac993839bb9..ff236d3ad8838b14e5a20c70b2a2ce56 @Override public void onDestroyed(ItemEntity entity) { - if (this.block instanceof ShulkerBoxBlock) { -+ if (this.block instanceof ShulkerBoxBlock && entity.level.purpurConfig.shulkerBoxItemDropContentsWhenDestroyed) { ++ if (this.block instanceof ShulkerBoxBlock && entity.level().purpurConfig.shulkerBoxItemDropContentsWhenDestroyed) { ItemStack itemstack = entity.getItem(); CompoundTag nbttagcompound = BlockItem.getBlockEntityData(itemstack); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 5fe915ca0e43c809e7884b983755c7953e20e695..45084379891c56f43a52b718483a18a4e36804aa 100644 +index 2905ac9c8ee0555e5aeaeed480454e8463c753b1..177678b320e79eef9ec2c3b77935ef59ffa1b63d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -223,6 +223,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0192-Silk-touchable-budding-amethyst.patch b/patches/server/0192-Silk-touchable-budding-amethyst.patch index 7268b430f..2d9594b34 100644 --- a/patches/server/0192-Silk-touchable-budding-amethyst.patch +++ b/patches/server/0192-Silk-touchable-budding-amethyst.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Silk touchable budding amethyst diff --git a/src/main/java/net/minecraft/world/level/block/BuddingAmethystBlock.java b/src/main/java/net/minecraft/world/level/block/BuddingAmethystBlock.java -index 4dae2a98070affd84bc4523a927dc9cbfe7379c6..51faa4cfda3d36f2e3bc7cbc47cacf57d3ca716e 100644 +index 4dae2a98070affd84bc4523a927dc9cbfe7379c6..c16781ec765c234468b13a0b0cb478c6082b62a7 100644 --- a/src/main/java/net/minecraft/world/level/block/BuddingAmethystBlock.java +++ b/src/main/java/net/minecraft/world/level/block/BuddingAmethystBlock.java @@ -47,4 +47,14 @@ public class BuddingAmethystBlock extends AmethystBlock { @@ -16,7 +16,7 @@ index 4dae2a98070affd84bc4523a927dc9cbfe7379c6..51faa4cfda3d36f2e3bc7cbc47cacf57 + // Purpur start + @Override + public void playerDestroy(net.minecraft.world.level.Level level, net.minecraft.world.entity.player.Player player, BlockPos pos, BlockState state, net.minecraft.world.level.block.entity.BlockEntity blockEntity, net.minecraft.world.item.ItemStack stack) { -+ if (level.purpurConfig.buddingAmethystSilkTouch && net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.SILK_TOUCH, stack) > 0) { ++ if (level().purpurConfig.buddingAmethystSilkTouch && net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.SILK_TOUCH, stack) > 0) { + popResource(level, pos, net.minecraft.world.item.Items.BUDDING_AMETHYST.getDefaultInstance()); + } + super.playerDestroy(level, player, pos, state, blockEntity, stack); @@ -24,7 +24,7 @@ index 4dae2a98070affd84bc4523a927dc9cbfe7379c6..51faa4cfda3d36f2e3bc7cbc47cacf57 + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 45084379891c56f43a52b718483a18a4e36804aa..b2f5d8d517e35c319ddb08f3229ac760784eea3f 100644 +index 177678b320e79eef9ec2c3b77935ef59ffa1b63d..2c6743485c22fc914006ba1ed1aede61f845be0f 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -730,6 +730,11 @@ public class PurpurWorldConfig { @@ -39,8 +39,8 @@ index 45084379891c56f43a52b718483a18a4e36804aa..b2f5d8d517e35c319ddb08f3229ac760 public boolean chestOpenWithBlockOnTop = false; private void chestSettings() { chestOpenWithBlockOnTop = getBoolean("blocks.chest.open-with-solid-block-on-top", chestOpenWithBlockOnTop); -@@ -2984,3 +2989,4 @@ public class PurpurWorldConfig { - zombifiedPiglinControllable = getBoolean("mobs.zombified_piglin.controllable", zombifiedPiglinControllable); +@@ -2747,3 +2752,4 @@ public class PurpurWorldConfig { + zombifiedPiglinTakeDamageFromWater = getBoolean("mobs.zombified_piglin.takes-damage-from-water", zombifiedPiglinTakeDamageFromWater); } } + diff --git a/patches/server/0194-Player-ridable-in-water-option.patch b/patches/server/0194-Player-ridable-in-water-option.patch index 64a852857..c3ef25fd4 100644 --- a/patches/server/0194-Player-ridable-in-water-option.patch +++ b/patches/server/0194-Player-ridable-in-water-option.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Player ridable in water option diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index 398b1a33ac3be17136a7d38bc35190db1364d10d..ddb36e630c1f1b71c44c31e940c0845ecae14c0b 100644 +index a8656e55383739cd694cdf94654ad90890b61095..3661f60cf1be5ecbd5a8a3f07553f2b42b52a4f0 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java @@ -2104,6 +2104,11 @@ public abstract class Player extends LivingEntity { @@ -14,14 +14,14 @@ index 398b1a33ac3be17136a7d38bc35190db1364d10d..ddb36e630c1f1b71c44c31e940c0845e + @Override + public boolean dismountsUnderwater() { -+ return !level.purpurConfig.playerRidableInWater; ++ return !level().purpurConfig.playerRidableInWater; + } + public boolean setEntityOnShoulder(CompoundTag entityNbt) { if (!this.isPassenger() && this.onGround() && !this.isInWater() && !this.isInPowderSnow) { if (this.getShoulderEntityLeft().isEmpty()) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a399db2a142d7bf4de29ca41610f7f02c1f0d2eb..404d45788c3cc84b5ddb99901887286114c17ece 100644 +index 62225e7978e9f2982ccba4245c47df53f625043b..b3b08dcacdff3b055345ff5a5056510904488f9a 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -400,6 +400,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0195-Config-to-disable-Enderman-teleport-on-projectile-hi.patch b/patches/server/0195-Config-to-disable-Enderman-teleport-on-projectile-hi.patch index ca7b56dbe..650cbad08 100644 --- a/patches/server/0195-Config-to-disable-Enderman-teleport-on-projectile-hi.patch +++ b/patches/server/0195-Config-to-disable-Enderman-teleport-on-projectile-hi.patch @@ -5,34 +5,34 @@ Subject: [PATCH] Config to disable Enderman teleport on projectile hit 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 cb0e27962b77a1f62c5d561b361b51cf279e7cce..aeab1cb886eb62149b79c2f899a329c561591397 100644 +index 6f7dc1f55d52a0957dc0f3b19644e3dce33ccb0f..f9bc9e2d57111b6260b5303fa2dbc405ef9835a2 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java @@ -438,6 +438,7 @@ public class EnderMan extends Monster implements NeutralMob { } else { flag1 = flag && this.hurtWithCleanWater(source, (ThrownPotion) source.getDirectEntity(), amount); -+ if (!flag1 && this.level.purpurConfig.endermanIgnoreProjectiles) return super.hurt(source, amount); // Purpur ++ if (!flag1 && this.level().purpurConfig.endermanIgnoreProjectiles) return super.hurt(source, amount); // Purpur if (this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.INDIRECT)) { // Paper start for (int i = 0; i < 64; ++i) { if (this.teleport()) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 404d45788c3cc84b5ddb99901887286114c17ece..15507525d05ad0884009fe980655c3d5ee2655a3 100644 +index b3b08dcacdff3b055345ff5a5056510904488f9a..24082e76ec60384e7d9782137021e1e3ceb179bd 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1227,6 +1227,7 @@ public class PurpurWorldConfig { +@@ -1347,6 +1347,7 @@ public class PurpurWorldConfig { public boolean endermanAggroEndermitesOnlyIfPlayerSpawned = false; public boolean endermanIgnorePlayerDragonHead = false; public boolean endermanDisableStareAggro = false; + public boolean endermanIgnoreProjectiles = false; private void endermanSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.enderman.attributes.max-health", endermanMaxHealth); -@@ -1246,6 +1247,7 @@ public class PurpurWorldConfig { + endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); + endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); +@@ -1369,6 +1370,7 @@ public class PurpurWorldConfig { endermanAggroEndermitesOnlyIfPlayerSpawned = getBoolean("mobs.enderman.aggressive-towards-endermites-only-spawned-by-player-thrown-ender-pearls", endermanAggroEndermitesOnlyIfPlayerSpawned); endermanIgnorePlayerDragonHead = getBoolean("mobs.enderman.ignore-players-wearing-dragon-head", endermanIgnorePlayerDragonHead); endermanDisableStareAggro = getBoolean("mobs.enderman.disable-player-stare-aggression", endermanDisableStareAggro); + endermanIgnoreProjectiles = getBoolean("mobs.enderman.ignore-projectiles", endermanIgnoreProjectiles); } - public double endermiteMaxHealth = 8.0D; + public boolean endermiteRidable = false; diff --git a/patches/server/0196-Add-compass-command.patch b/patches/server/0196-Add-compass-command.patch index 7012107b1..f4fb12506 100644 --- a/patches/server/0196-Add-compass-command.patch +++ b/patches/server/0196-Add-compass-command.patch @@ -17,7 +17,7 @@ index 7aae9e3c60ba15b8dcd8174a4d70866edebb6cca..5f6cc8b16af6dce3b74f0c2c662b0ecf if (environment.includeIntegrated) { diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 6da83551f77354bd40a4fe8ace331eb24208f057..1192920ec3461aee0c992284567d80edc1cb90c5 100644 +index 4d8be2af1116a44422e714450b451687b8033ba3..953ff44e0443bc6d28ee1ddaa0f446954898e078 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -280,6 +280,7 @@ public class ServerPlayer extends Player { @@ -89,7 +89,7 @@ index 714acff3f53ef463d1de1d5f301b9a2f89711acc..351fc72f0d1450114285b0577e8d5e53 hideHiddenPlayersFromEntitySelector = getBoolean("settings.command.hide-hidden-players-from-entity-selector", hideHiddenPlayersFromEntitySelector); uptimeFormat = getString("settings.command.uptime.format", uptimeFormat); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 15507525d05ad0884009fe980655c3d5ee2655a3..ab51afbb7de91cfbe75221445af69ba95a720e37 100644 +index 24082e76ec60384e7d9782137021e1e3ceb179bd..5af63fe7d4a6be325f10030c56038be60d1c0081 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -224,6 +224,7 @@ public class PurpurWorldConfig { @@ -174,7 +174,7 @@ index d38b3c4a722396cc3b61a9a8ed7e39cea4ae65cb..d333334f323049ca97e756324cff0b23 } diff --git a/src/main/java/org/purpurmc/purpur/task/CompassTask.java b/src/main/java/org/purpurmc/purpur/task/CompassTask.java new file mode 100644 -index 0000000000000000000000000000000000000000..bece7eefc8ba8822b433835526251d2fb916c025 +index 0000000000000000000000000000000000000000..d7bc40f8f678c75c964d26ac98689c7866a2ef9d --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/task/CompassTask.java @@ -0,0 +1,68 @@ @@ -207,7 +207,7 @@ index 0000000000000000000000000000000000000000..bece7eefc8ba8822b433835526251d2f + tick = 0; + + MinecraftServer.getServer().getAllLevels().forEach((level) -> { -+ if (level.purpurConfig.compassItemShowsBossBar) { ++ if (level().purpurConfig.compassItemShowsBossBar) { + level.players().forEach(player -> { + if (!player.compassBar()) { + if (player.getMainHandItem().getItem() != Items.COMPASS && player.getOffhandItem().getItem() != Items.COMPASS) { diff --git a/patches/server/0197-Toggle-for-kinetic-damage.patch b/patches/server/0197-Toggle-for-kinetic-damage.patch index bfda2df3f..1d3c329b9 100644 --- a/patches/server/0197-Toggle-for-kinetic-damage.patch +++ b/patches/server/0197-Toggle-for-kinetic-damage.patch @@ -5,19 +5,19 @@ Subject: [PATCH] Toggle for kinetic damage diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 84a967b39e737d00b388b5ae743b157388e8b6db..1bb1be688326d79c34b589bd859f21c2d43c53b8 100644 +index 75e994b0da981190083c8cda27a253116221aadb..7a35d45f8449a8399cb417357f0f0a6419bfbe3a 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -2875,6 +2875,7 @@ public abstract class LivingEntity extends Entity implements Attackable { if (f3 > 0.0F) { this.playSound(this.getFallDamageSound((int) f3), 1.0F, 1.0F); -+ if (level.purpurConfig.elytraKineticDamage) // Purpur ++ if (level().purpurConfig.elytraKineticDamage) // Purpur this.hurt(this.damageSources().flyIntoWall(), f3); } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index ab51afbb7de91cfbe75221445af69ba95a720e37..d35936264ed4bd666f4b50191b95bea1ccbfb158 100644 +index 5af63fe7d4a6be325f10030c56038be60d1c0081..863cface2df95bc8a3d0d22643d74825ea850eea 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -184,12 +184,14 @@ public class PurpurWorldConfig { diff --git a/patches/server/0199-Customizeable-Zombie-Villager-curing-times.patch b/patches/server/0199-Customizeable-Zombie-Villager-curing-times.patch index 785f83def..bd9dac27c 100644 --- a/patches/server/0199-Customizeable-Zombie-Villager-curing-times.patch +++ b/patches/server/0199-Customizeable-Zombie-Villager-curing-times.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Customizeable Zombie Villager curing times 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 0f8b9ceca20e43b5010bb54e5b94a8598995115f..76534e3b2414e5db82bb01ca8c6b4f6d53e733ab 100644 +index c3f220a85b91a25662c943b5ee4508cd7a18c75d..40b3498c57c62f8bdaac50546ca47f4927db7bfa 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java @@ -218,7 +218,7 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { @@ -13,24 +13,24 @@ index 0f8b9ceca20e43b5010bb54e5b94a8598995115f..76534e3b2414e5db82bb01ca8c6b4f6d if (!this.level().isClientSide) { - this.startConverting(player.getUUID(), this.random.nextInt(2401) + 3600); -+ this.startConverting(player.getUUID(), this.random.nextInt(level.purpurConfig.zombieVillagerCuringTimeMax - level.purpurConfig.zombieVillagerCuringTimeMin + 1) + level.purpurConfig.zombieVillagerCuringTimeMin); // Purpur ++ this.startConverting(player.getUUID(), this.random.nextInt(level().purpurConfig.zombieVillagerCuringTimeMax - level().purpurConfig.zombieVillagerCuringTimeMin + 1) + level().purpurConfig.zombieVillagerCuringTimeMin); // Purpur } return InteractionResult.SUCCESS; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 13c961c06fcf2625a11dfd8b55b97df5f35a532f..d29245262a9b2e9c6c85d2e32fd780a539c2b1f0 100644 +index 5ed88d88e3809c24749e1735ecd24a7dec644ab3..63a1ea43093133d059164fba722c79a954166bcd 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2264,6 +2264,8 @@ public class PurpurWorldConfig { +@@ -2743,6 +2743,8 @@ public class PurpurWorldConfig { public double zombieVillagerJockeyChance = 0.05D; public boolean zombieVillagerJockeyTryExistingChickens = true; public boolean zombieVillagerTakeDamageFromWater = false; + public int zombieVillagerCuringTimeMin = 3600; + public int zombieVillagerCuringTimeMax = 6000; private void zombieVillagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.zombie_villager.attributes.max-health", zombieVillagerMaxHealth); -@@ -2276,6 +2278,8 @@ public class PurpurWorldConfig { + zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); + zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); +@@ -2751,6 +2753,8 @@ public class PurpurWorldConfig { zombieVillagerJockeyChance = getDouble("mobs.zombie_villager.jockey.chance", zombieVillagerJockeyChance); zombieVillagerJockeyTryExistingChickens = getBoolean("mobs.zombie_villager.jockey.try-existing-chickens", zombieVillagerJockeyTryExistingChickens); zombieVillagerTakeDamageFromWater = getBoolean("mobs.zombie_villager.takes-damage-from-water", zombieVillagerTakeDamageFromWater); @@ -38,4 +38,4 @@ index 13c961c06fcf2625a11dfd8b55b97df5f35a532f..d29245262a9b2e9c6c85d2e32fd780a5 + zombieVillagerCuringTimeMax = getInt("mobs.zombie_villager.curing_time.max", zombieVillagerCuringTimeMax); } - public double zombifiedPiglinMaxHealth = 20.0D; + public boolean zombifiedPiglinRidable = false; diff --git a/patches/server/0201-Toggle-for-Wither-s-spawn-sound.patch b/patches/server/0201-Toggle-for-Wither-s-spawn-sound.patch index 644cf9e31..ed936ba61 100644 --- a/patches/server/0201-Toggle-for-Wither-s-spawn-sound.patch +++ b/patches/server/0201-Toggle-for-Wither-s-spawn-sound.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Toggle for Wither's spawn sound 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 06166210a162e5a40610910c320b391551301bf6..2dcede02f79e1a99adec3364cd0c71fb42832280 100644 +index 7fc5562ef55809d864392f05599c2380b32f1fdd..98945bc8d2fee8d491bf04d2c488775a09117ca4 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 @@ -429,7 +429,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob @@ -13,27 +13,27 @@ index 06166210a162e5a40610910c320b391551301bf6..2dcede02f79e1a99adec3364cd0c71fb // CraftBukkit end - if (!this.isSilent()) { -+ if (!this.isSilent() && level.purpurConfig.witherPlaySpawnSound) { ++ if (!this.isSilent() && level().purpurConfig.witherPlaySpawnSound) { // CraftBukkit start - Use relative location for far away sounds // this.level().globalLevelEvent(1023, new BlockPosition(this), 0); int viewDistance = ((ServerLevel) this.level()).getCraftServer().getViewDistance() * 16; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 320733cde5ab13e7b1303f114f230a90edbdc88e..536ea5dad8b7a654c7d9b93262a41e4677e049a3 100644 +index 0957dd465e3c23ec54bb266464a5737acb84d67f..5916f8769becd92efa23311ba20993c57eac7750 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2147,6 +2147,7 @@ public class PurpurWorldConfig { +@@ -2589,6 +2589,7 @@ public class PurpurWorldConfig { public boolean witherTakeDamageFromWater = false; public boolean witherCanRideVehicles = false; public float witherExplosionRadius = 1.0F; + public boolean witherPlaySpawnSound = true; private void witherSettings() { - if (PurpurConfig.version < 8) { - double oldValue = getDouble("mobs.wither.max-health", witherMaxHealth); -@@ -2164,6 +2165,7 @@ public class PurpurWorldConfig { + witherRidable = getBoolean("mobs.wither.ridable", witherRidable); + witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); +@@ -2610,6 +2611,7 @@ public class PurpurWorldConfig { witherTakeDamageFromWater = getBoolean("mobs.wither.takes-damage-from-water", witherTakeDamageFromWater); witherCanRideVehicles = getBoolean("mobs.wither.can-ride-vehicles", witherCanRideVehicles); witherExplosionRadius = (float) getDouble("mobs.wither.explosion-radius", witherExplosionRadius); + witherPlaySpawnSound = getBoolean("mobs.wither.play-spawn-sound", witherPlaySpawnSound); } - public double witherSkeletonMaxHealth = 20.0D; + public boolean witherSkeletonRidable = false; diff --git a/patches/server/0203-Config-to-remove-curse-of-binding-with-weakness.patch b/patches/server/0203-Config-to-remove-curse-of-binding-with-weakness.patch index efbdfc230..44194e3b8 100644 --- a/patches/server/0203-Config-to-remove-curse-of-binding-with-weakness.patch +++ b/patches/server/0203-Config-to-remove-curse-of-binding-with-weakness.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Config to remove curse of binding with weakness diff --git a/src/main/java/net/minecraft/world/inventory/InventoryMenu.java b/src/main/java/net/minecraft/world/inventory/InventoryMenu.java -index c549618421c5d077c3d977d8d2064eca2acc438a..3cf62a2343deb1096eba5f7fe7b26b66380b921f 100644 +index c549618421c5d077c3d977d8d2064eca2acc438a..5972fa434847d24fa98b7895fd8386d20a636885 100644 --- a/src/main/java/net/minecraft/world/inventory/InventoryMenu.java +++ b/src/main/java/net/minecraft/world/inventory/InventoryMenu.java @@ -4,6 +4,7 @@ import com.mojang.datafixers.util.Pair; @@ -21,12 +21,12 @@ index c549618421c5d077c3d977d8d2064eca2acc438a..3cf62a2343deb1096eba5f7fe7b26b66 ItemStack itemstack = this.getItem(); - return !itemstack.isEmpty() && !playerEntity.isCreative() && EnchantmentHelper.hasBindingCurse(itemstack) ? false : super.mayPickup(playerEntity); -+ return !itemstack.isEmpty() && !playerEntity.isCreative() && EnchantmentHelper.hasBindingCurse(itemstack) ? playerEntity.level.purpurConfig.playerRemoveBindingWithWeakness && playerEntity.hasEffect(MobEffects.WEAKNESS) : super.mayPickup(playerEntity); // Purpur ++ return !itemstack.isEmpty() && !playerEntity.isCreative() && EnchantmentHelper.hasBindingCurse(itemstack) ? playerEntity.level().purpurConfig.playerRemoveBindingWithWeakness && playerEntity.hasEffect(MobEffects.WEAKNESS) : super.mayPickup(playerEntity); // Purpur } @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index bf1cfffc03190d8e16d5c0ab3ff4f6067c8c31ca..82e6cab7d12810e16084bf2965dc93386c882dd7 100644 +index 1eda22b43f5c6b5ef2e19f686731ca1eae35180f..0b3c58cfc0cf13aa7d0ba6541a581113b4c01691 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -410,6 +410,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0204-Conduit-behavior-configuration.patch b/patches/server/0204-Conduit-behavior-configuration.patch index e1e7d1b1e..d04698198 100644 --- a/patches/server/0204-Conduit-behavior-configuration.patch +++ b/patches/server/0204-Conduit-behavior-configuration.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Conduit behavior configuration diff --git a/src/main/java/net/minecraft/world/level/block/entity/ConduitBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/ConduitBlockEntity.java -index 963a596154091b79ca139af6274aa323518ad1ad..4dcac3899a500d8586580bcfd5b4516e1dcdcd4a 100644 +index 963a596154091b79ca139af6274aa323518ad1ad..e93f96d0ba193cceae2f2140fb8f678dc47de40b 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/ConduitBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/ConduitBlockEntity.java @@ -171,7 +171,7 @@ public class ConduitBlockEntity extends BlockEntity { @@ -66,7 +66,7 @@ index 963a596154091b79ca139af6274aa323518ad1ad..4dcac3899a500d8586580bcfd5b4516e int k = pos.getZ(); - return (new AABB((double) i, (double) j, (double) k, (double) (i + 1), (double) (j + 1), (double) (k + 1))).inflate(8.0D); -+ return (new AABB((double) i, (double) j, (double) k, (double) (i + 1), (double) (j + 1), (double) (k + 1))).inflate(level == null ? 8.0D : level.purpurConfig.conduitDamageDistance); // Purpur ++ return (new AABB((double) i, (double) j, (double) k, (double) (i + 1), (double) (j + 1), (double) (k + 1))).inflate(level == null ? 8.0D : level().purpurConfig.conduitDamageDistance); // Purpur } @Nullable @@ -77,10 +77,10 @@ index 963a596154091b79ca139af6274aa323518ad1ad..4dcac3899a500d8586580bcfd5b4516e }); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 82e6cab7d12810e16084bf2965dc93386c882dd7..b7c5966521750b388606886e58c66997f108f719 100644 +index 0b3c58cfc0cf13aa7d0ba6541a581113b4c01691..1715b39e35b578f8bf554dcd9ee6af1d829f63d1 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2323,6 +2323,29 @@ public class PurpurWorldConfig { +@@ -962,6 +962,29 @@ public class PurpurWorldConfig { hungerStarvationDamage = (float) getDouble("hunger.starvation-damage", hungerStarvationDamage); } diff --git a/patches/server/0205-Cauldron-fill-chances.patch b/patches/server/0205-Cauldron-fill-chances.patch index 015b860b5..d38b1d8f1 100644 --- a/patches/server/0205-Cauldron-fill-chances.patch +++ b/patches/server/0205-Cauldron-fill-chances.patch @@ -47,10 +47,10 @@ index e978132e51cde52f7ff1ba31ad521fc2cb4f0dce..60a95c42a333d68d9fd14539e0051c08 if (dripChance < f1) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b7c5966521750b388606886e58c66997f108f719..f6f587e3e9586db09b8b7d6ef04d7f511ecf1867 100644 +index 1715b39e35b578f8bf554dcd9ee6af1d829f63d1..5fc42dfd00412f695dfc0b9420867b2f31bf7093 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2346,6 +2346,17 @@ public class PurpurWorldConfig { +@@ -985,6 +985,17 @@ public class PurpurWorldConfig { conduitBlocks = conduitBlockList.toArray(Block[]::new); } diff --git a/patches/server/0206-Config-to-allow-mobs-to-pathfind-over-rails.patch b/patches/server/0206-Config-to-allow-mobs-to-pathfind-over-rails.patch index f3fa776da..34069c42f 100644 --- a/patches/server/0206-Config-to-allow-mobs-to-pathfind-over-rails.patch +++ b/patches/server/0206-Config-to-allow-mobs-to-pathfind-over-rails.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Config to allow mobs to pathfind over rails diff --git a/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java b/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java -index 3583fcf5284bc5883308876dbd9886664b391e28..0e6923e6d440e846b3db47c6b8357f7e0e85ad65 100644 +index 3583fcf5284bc5883308876dbd9886664b391e28..d976a6df54c1e817def2d588692abe25a03ee0fa 100644 --- a/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java +++ b/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java @@ -241,7 +241,7 @@ public class WalkNodeEvaluator extends NodeEvaluator { @@ -13,12 +13,12 @@ index 3583fcf5284bc5883308876dbd9886664b391e28..0e6923e6d440e846b3db47c6b8357f7e if (blockPathTypes != BlockPathTypes.WALKABLE && (!this.isAmphibious() || blockPathTypes != BlockPathTypes.WATER)) { - if ((node == null || node.costMalus < 0.0F) && maxYStep > 0 && (blockPathTypes != BlockPathTypes.FENCE || this.canWalkOverFences()) && blockPathTypes != BlockPathTypes.UNPASSABLE_RAIL && blockPathTypes != BlockPathTypes.TRAPDOOR && blockPathTypes != BlockPathTypes.POWDER_SNOW) { -+ if ((node == null || node.costMalus < 0.0F) && maxYStep > 0 && (blockPathTypes != BlockPathTypes.FENCE || this.canWalkOverFences()) && (this.mob.level.purpurConfig.mobsIgnoreRails || blockPathTypes != BlockPathTypes.UNPASSABLE_RAIL) && blockPathTypes != BlockPathTypes.TRAPDOOR && blockPathTypes != BlockPathTypes.POWDER_SNOW) { // Purpur ++ if ((node == null || node.costMalus < 0.0F) && maxYStep > 0 && (blockPathTypes != BlockPathTypes.FENCE || this.canWalkOverFences()) && (this.mob.level().purpurConfig.mobsIgnoreRails || blockPathTypes != BlockPathTypes.UNPASSABLE_RAIL) && blockPathTypes != BlockPathTypes.TRAPDOOR && blockPathTypes != BlockPathTypes.POWDER_SNOW) { // Purpur node = this.findAcceptedNode(x, y + 1, z, maxYStep - 1, prevFeetY, direction, nodeType); if (node != null && (node.type == BlockPathTypes.OPEN || node.type == BlockPathTypes.WALKABLE) && this.mob.getBbWidth() < 1.0F) { double g = (double)(x - direction.getStepX()) + 0.5D; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f6f587e3e9586db09b8b7d6ef04d7f511ecf1867..7a3697c86e525496542e821646973e3b6fdaaf9d 100644 +index 5fc42dfd00412f695dfc0b9420867b2f31bf7093..80ae069e0d5157d2d87baac9f3ca8d5f4f3abf0a 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -140,6 +140,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0207-Shulker-change-color-with-dye.patch b/patches/server/0207-Shulker-change-color-with-dye.patch index b0d6276b8..c1c9e13d1 100644 --- a/patches/server/0207-Shulker-change-color-with-dye.patch +++ b/patches/server/0207-Shulker-change-color-with-dye.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Shulker change color with dye diff --git a/src/main/java/net/minecraft/world/entity/monster/Shulker.java b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -index c31f7a4def4d56520b73fcfd99fcf4bd0d548e04..24f7aec811d2b04804311bd9b2d00206cccfa9f4 100644 +index 48fcfef45ab149328573f4e80c8f0289f9eebbe8..fbafb9e2ea9dfd237560d34f9cd6f29533e31f16 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java @@ -22,6 +22,8 @@ import net.minecraft.tags.DamageTypeTags; @@ -27,13 +27,13 @@ index c31f7a4def4d56520b73fcfd99fcf4bd0d548e04..24f7aec811d2b04804311bd9b2d00206 import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.block.Blocks; @@ -125,6 +129,19 @@ public class Shulker extends AbstractGolem implements VariantHolder 0 && this.player.isShiftKeyDown() && this.player.getBukkitEntity().hasPermission("purpur.mending_shift_click")) { -+ int points = Math.min(this.player.totalExperience, this.player.level.purpurConfig.shiftRightClickRepairsMendingPoints); ++ if (this.player.level().purpurConfig.shiftRightClickRepairsMendingPoints > 0 && this.player.isShiftKeyDown() && this.player.getBukkitEntity().hasPermission("purpur.mending_shift_click")) { ++ int points = Math.min(this.player.totalExperience, this.player.level().purpurConfig.shiftRightClickRepairsMendingPoints); + if (points > 0 && itemstack.isDamaged() && net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.MENDING, itemstack) > 0) { + this.player.giveExperiencePoints(-points); + this.player.level.addFreshEntity(new net.minecraft.world.entity.ExperienceOrb(this.player.level, this.player.getX(), this.player.getY(), this.player.getZ(), points, org.bukkit.entity.ExperienceOrb.SpawnReason.UNKNOWN, this.player, this.player)); @@ -36,7 +36,7 @@ index 1249a776b4b2d97fc51aecddeda8151fa0646dc1..ad46dd38caccfe7d87f26bd51a7864a4 + // Purpur end } diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 4e093e54c3feec6a46a97c24e68c1ee49dac29ca..cc0736e7eb1f5227093507fdb3586ae0bb58d738 100644 +index 4ac0941974e6e8aeaea88ce0fc589381f3c0eaad..f3210aa312af48a77129962fe483e65eec36a342 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -2084,6 +2084,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -48,7 +48,7 @@ index 4e093e54c3feec6a46a97c24e68c1ee49dac29ca..cc0736e7eb1f5227093507fdb3586ae0 cancelled = event.useItemInHand() == Event.Result.DENY; } else { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 2ee451e21e8ebedb1ecac9ebfc51ab091859aa58..44753a19cc45d1ce7f65aa53800dfc6b01038afc 100644 +index 224857d1ae9657d11cc646218f8480e5a24e34f7..c8a4056779c86cab41e6d0ac5e24254d256abafe 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -417,6 +417,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0213-Dolphins-naturally-aggressive-to-players-chance.patch b/patches/server/0213-Dolphins-naturally-aggressive-to-players-chance.patch index 44aa0b1a5..ca6853428 100644 --- a/patches/server/0213-Dolphins-naturally-aggressive-to-players-chance.patch +++ b/patches/server/0213-Dolphins-naturally-aggressive-to-players-chance.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Dolphins naturally aggressive to players chance diff --git a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java -index 6371c835989dda0ed5048667875ac1ae34ba0cf7..0fcb6b45df160c33c6f4e29e643f76af3252a925 100644 +index d7f1a0ddad919fe87be29c16d6ef442cb5692fde..a3585d3c4331138bdd029c6fd8723c5c5dc23a16 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java +++ b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java @@ -78,6 +78,7 @@ public class Dolphin extends WaterAnimal { @@ -48,22 +48,22 @@ index 6371c835989dda0ed5048667875ac1ae34ba0cf7..0fcb6b45df160c33c6f4e29e643f76af public static AttributeSupplier.Builder createAttributes() { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 44753a19cc45d1ce7f65aa53800dfc6b01038afc..8b9822ce8d292cc81317ebb7d98e1be87ec8a826 100644 +index c8a4056779c86cab41e6d0ac5e24254d256abafe..6b3e04296efda6f1bd4d93ccc3df0222ebb3aa31 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1164,6 +1164,7 @@ public class PurpurWorldConfig { +@@ -1273,6 +1273,7 @@ public class PurpurWorldConfig { public double dolphinMaxHealth = 10.0D; public boolean dolphinDisableTreasureSearching = false; public boolean dolphinTakeDamageFromWater = false; + public double dolphinNaturallyAggressiveToPlayersChance = 0.0D; private void dolphinSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.dolphin.attributes.max-health", dolphinMaxHealth); -@@ -1173,6 +1174,7 @@ public class PurpurWorldConfig { + dolphinRidable = getBoolean("mobs.dolphin.ridable", dolphinRidable); + dolphinControllable = getBoolean("mobs.dolphin.controllable", dolphinControllable); +@@ -1287,6 +1288,7 @@ public class PurpurWorldConfig { dolphinMaxHealth = getDouble("mobs.dolphin.attributes.max_health", dolphinMaxHealth); dolphinDisableTreasureSearching = getBoolean("mobs.dolphin.disable-treasure-searching", dolphinDisableTreasureSearching); dolphinTakeDamageFromWater = getBoolean("mobs.dolphin.takes-damage-from-water", dolphinTakeDamageFromWater); + dolphinNaturallyAggressiveToPlayersChance = getDouble("mobs.dolphin.naturally-aggressive-to-players-chance", dolphinNaturallyAggressiveToPlayersChance); } - public double donkeyMaxHealthMin = 15.0D; + public boolean donkeyRidableInWater = false; diff --git a/patches/server/0214-Cows-naturally-aggressive-to-players-chance.patch b/patches/server/0214-Cows-naturally-aggressive-to-players-chance.patch index f09fd3480..54977bf47 100644 --- a/patches/server/0214-Cows-naturally-aggressive-to-players-chance.patch +++ b/patches/server/0214-Cows-naturally-aggressive-to-players-chance.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Cows naturally aggressive to players chance diff --git a/src/main/java/net/minecraft/world/entity/animal/Cow.java b/src/main/java/net/minecraft/world/entity/animal/Cow.java -index 3f67e626b66cf64034dcc9ebf35244631b081516..5dc426430033d526e379a94232a7e8c17ad52704 100644 +index 008ce5fed911484b6207eb711f5d1dfcc6348984..5c99065d8f097920e440980313fd75a040c2cc66 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java @@ -38,6 +38,7 @@ import org.bukkit.craftbukkit.inventory.CraftItemStack; @@ -16,16 +16,16 @@ index 3f67e626b66cf64034dcc9ebf35244631b081516..5dc426430033d526e379a94232a7e8c1 public Cow(EntityType type, Level world) { super(type, world); -@@ -46,6 +47,7 @@ public class Cow extends Animal { +@@ -63,6 +64,7 @@ public class Cow extends Animal { @Override public void initAttributes() { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.cowMaxHealth); -+ this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(this.level.purpurConfig.cowNaturallyAggressiveToPlayersDamage); // Purpur + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.cowMaxHealth); ++ this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(this.level().purpurConfig.cowNaturallyAggressiveToPlayersDamage); // Purpur } - // Purpur start + @Override @@ -75,11 +77,18 @@ public class Cow extends Animal { - return this.level.purpurConfig.cowTakeDamageFromWater; + return this.level().purpurConfig.cowTakeDamageFromWater; } + @Override @@ -41,7 +41,7 @@ index 3f67e626b66cf64034dcc9ebf35244631b081516..5dc426430033d526e379a94232a7e8c1 this.goalSelector.addGoal(1, new PanicGoal(this, 2.0D)); + this.goalSelector.addGoal(1, new net.minecraft.world.entity.ai.goal.MeleeAttackGoal(this, 1.2000000476837158D, true)); // Purpur this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); - if (level.purpurConfig.cowFeedMushrooms > 0) this.goalSelector.addGoal(3, new TemptGoal(this, 1.25D, Ingredient.of(Items.WHEAT, Blocks.RED_MUSHROOM.asItem(), Blocks.BROWN_MUSHROOM.asItem()), false)); else // Purpur + if (level().purpurConfig.cowFeedMushrooms > 0) this.goalSelector.addGoal(3, new TemptGoal(this, 1.25D, Ingredient.of(Items.WHEAT, Blocks.RED_MUSHROOM.asItem(), Blocks.BROWN_MUSHROOM.asItem()), false)); else // Purpur this.goalSelector.addGoal(3, new TemptGoal(this, 1.25D, Ingredient.of(Items.WHEAT), false)); @@ -87,10 +96,11 @@ public class Cow extends Animal { this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0D)); @@ -57,18 +57,19 @@ index 3f67e626b66cf64034dcc9ebf35244631b081516..5dc426430033d526e379a94232a7e8c1 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8b9822ce8d292cc81317ebb7d98e1be87ec8a826..a01628c3165608a93ad0bd3ff2aa1da3e4307adc 100644 +index 6b3e04296efda6f1bd4d93ccc3df0222ebb3aa31..5dc7d311fde305a8a5b3860d6d7e1f1cd02dffb1 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1127,16 +1127,25 @@ public class PurpurWorldConfig { +@@ -1222,6 +1222,8 @@ public class PurpurWorldConfig { public int cowFeedMushrooms = 0; public int cowBreedingTicks = 6000; public boolean cowTakeDamageFromWater = false; + public double cowNaturallyAggressiveToPlayersChance = 0.0D; + public double cowNaturallyAggressiveToPlayersDamage = 2.0D; private void cowSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.cow.attributes.max-health", cowMaxHealth); + cowRidable = getBoolean("mobs.cow.ridable", cowRidable); + cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); +@@ -1231,10 +1233,17 @@ public class PurpurWorldConfig { set("mobs.cow.attributes.max-health", null); set("mobs.cow.attributes.max_health", oldValue); } @@ -85,4 +86,4 @@ index 8b9822ce8d292cc81317ebb7d98e1be87ec8a826..a01628c3165608a93ad0bd3ff2aa1da3 + cowNaturallyAggressiveToPlayersDamage = getDouble("mobs.cow.naturally-aggressive-to-players.damage", cowNaturallyAggressiveToPlayersDamage); } - public double creeperMaxHealth = 20.0D; + public boolean creeperRidable = false; diff --git a/patches/server/0215-Option-for-beds-to-explode-on-villager-sleep.patch b/patches/server/0215-Option-for-beds-to-explode-on-villager-sleep.patch index 241b775c8..19eee377e 100644 --- a/patches/server/0215-Option-for-beds-to-explode-on-villager-sleep.patch +++ b/patches/server/0215-Option-for-beds-to-explode-on-villager-sleep.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Option for beds to explode on villager sleep diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index d370ca8d0794c8b2f6fba5e4bc1c25d567e99511..e27c63bc845495385f1034fa6246058642f07941 100644 +index b71013a6dd5a713543c042199273ddae1feda4b9..87fa0181e6e9c819c3b5abd95f75231dfeb12be2 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java @@ -1099,6 +1099,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @@ -13,8 +13,8 @@ index d370ca8d0794c8b2f6fba5e4bc1c25d567e99511..e27c63bc845495385f1034fa62460586 @Override public void startSleeping(BlockPos pos) { + // Purpur start -+ if (level.purpurConfig.bedExplodeOnVillagerSleep && this.level.getBlockState(pos).getBlock() instanceof net.minecraft.world.level.block.BedBlock) { -+ this.level.explode(null, (double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, (float) this.level.purpurConfig.bedExplosionPower, this.level.purpurConfig.bedExplosionFire, this.level.purpurConfig.bedExplosionEffect); ++ if (level().purpurConfig.bedExplodeOnVillagerSleep && this.level.getBlockState(pos).getBlock() instanceof net.minecraft.world.level.block.BedBlock) { ++ this.level.explode(null, (double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, (float) this.level().purpurConfig.bedExplosionPower, this.level().purpurConfig.bedExplosionFire, this.level().purpurConfig.bedExplosionEffect); + return; + } + // Purpur end @@ -22,7 +22,7 @@ index d370ca8d0794c8b2f6fba5e4bc1c25d567e99511..e27c63bc845495385f1034fa62460586 this.brain.setMemory(MemoryModuleType.LAST_SLEPT, this.level().getGameTime()); // CraftBukkit - decompile error this.brain.eraseMemory(MemoryModuleType.WALK_TARGET); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a01628c3165608a93ad0bd3ff2aa1da3e4307adc..2f1912a5bd3873cffc745672d0cfde0fa1d6488e 100644 +index 5dc7d311fde305a8a5b3860d6d7e1f1cd02dffb1..3d05d4e5d8e934a07d7957df3dfdf45bb8e22d5e 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -736,6 +736,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0216-Halloween-options-and-optimizations.patch b/patches/server/0216-Halloween-options-and-optimizations.patch index 3d02a4ca9..d59c33fd5 100644 --- a/patches/server/0216-Halloween-options-and-optimizations.patch +++ b/patches/server/0216-Halloween-options-and-optimizations.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Halloween options and optimizations diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -index b4c0f7b8841c536e700c80248d12ca2f0a507e6f..8413fcf8b5d23726c0b2030c1c8c813278a2cf72 100644 +index 81bf59b7b41835dc034f2880c8eac89ff396b695..a38b90e1d306a4926f473cdd38b6f719b4ce4252 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java @@ -314,7 +314,7 @@ public class Bat extends AmbientCreature { @@ -21,12 +21,12 @@ index b4c0f7b8841c536e700c80248d12ca2f0a507e6f..8413fcf8b5d23726c0b2030c1c8c8132 } } -+ public static boolean isHalloweenSeason(Level level) { return level.purpurConfig.forceHalloweenSeason || isHalloween(); } // Purpur ++ public static boolean isHalloweenSeason(Level level) { return level().purpurConfig.forceHalloweenSeason || isHalloween(); } // Purpur private static boolean isHalloween() { LocalDate localdate = LocalDate.now(); int i = localdate.get(ChronoField.DAY_OF_MONTH); diff --git a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java -index 892ae3a9ac2395896ff7881c49eaece8d46e831e..27c001b35441e82b2b4292c0d4ddf54486d7c3cb 100644 +index 892ae3a9ac2395896ff7881c49eaece8d46e831e..41376b705748e14c1c4174e07732ce09ad8e581f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java +++ b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java @@ -143,11 +143,7 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo @@ -38,12 +38,12 @@ index 892ae3a9ac2395896ff7881c49eaece8d46e831e..27c001b35441e82b2b4292c0d4ddf544 - int j = localdate.get(ChronoField.MONTH_OF_YEAR); - - if (j == 10 && i == 31 && randomsource.nextFloat() < 0.25F) { -+ if (net.minecraft.world.entity.ambient.Bat.isHalloweenSeason(world.getMinecraftWorld()) && this.random.nextFloat() < this.level.purpurConfig.chanceHeadHalloweenOnEntity) { // Purpur ++ if (net.minecraft.world.entity.ambient.Bat.isHalloweenSeason(world.getMinecraftWorld()) && this.random.nextFloat() < this.level().purpurConfig.chanceHeadHalloweenOnEntity) { // Purpur this.setItemSlot(EquipmentSlot.HEAD, new ItemStack(randomsource.nextFloat() < 0.1F ? Blocks.JACK_O_LANTERN : Blocks.CARVED_PUMPKIN)); this.armorDropChances[EquipmentSlot.HEAD.getIndex()] = 0.0F; } diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index 2a50dcb60b062cff5b8bb2fcc42100c2e799fd5d..1cbd73bd55435f049a1a0e3a9d242ab8f6be7de2 100644 +index 0bc90b6d5c5a3cb3477d41336a9bb1130ff32fa1..a8d2f8654ee370e98bb1c4e7e1111debd62a7429 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java @@ -593,11 +593,7 @@ public class Zombie extends Monster { @@ -55,12 +55,12 @@ index 2a50dcb60b062cff5b8bb2fcc42100c2e799fd5d..1cbd73bd55435f049a1a0e3a9d242ab8 - int j = localdate.get(ChronoField.MONTH_OF_YEAR); - - if (j == 10 && i == 31 && randomsource.nextFloat() < 0.25F) { -+ if (net.minecraft.world.entity.ambient.Bat.isHalloweenSeason(world.getMinecraftWorld()) && this.random.nextFloat() < this.level.purpurConfig.chanceHeadHalloweenOnEntity) { // Purpur ++ if (net.minecraft.world.entity.ambient.Bat.isHalloweenSeason(world.getMinecraftWorld()) && this.random.nextFloat() < this.level().purpurConfig.chanceHeadHalloweenOnEntity) { // Purpur this.setItemSlot(EquipmentSlot.HEAD, new ItemStack(randomsource.nextFloat() < 0.1F ? Blocks.JACK_O_LANTERN : Blocks.CARVED_PUMPKIN)); this.armorDropChances[EquipmentSlot.HEAD.getIndex()] = 0.0F; } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 2f1912a5bd3873cffc745672d0cfde0fa1d6488e..9d28380a1eb8b881d099fc097acd9763fea5e141 100644 +index 3d05d4e5d8e934a07d7957df3dfdf45bb8e22d5e..30e150a4d6580c86e5118467c2c43e2b2538deeb 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -143,6 +143,8 @@ public class PurpurWorldConfig { diff --git a/patches/server/0220-options-to-extinguish-fire-blocks-with-snowballs.patch b/patches/server/0220-options-to-extinguish-fire-blocks-with-snowballs.patch index a852f2e9e..1e95bb314 100644 --- a/patches/server/0220-options-to-extinguish-fire-blocks-with-snowballs.patch +++ b/patches/server/0220-options-to-extinguish-fire-blocks-with-snowballs.patch @@ -5,7 +5,7 @@ Subject: [PATCH] options to extinguish fire blocks with snowballs diff --git a/src/main/java/net/minecraft/world/entity/projectile/Snowball.java b/src/main/java/net/minecraft/world/entity/projectile/Snowball.java -index e1e19a360be99b189dee1652e5289292f4996d92..d34b78584ae428388dd82e6eb207650bb0bd8a56 100644 +index b90cedad282e95a067aca176fafa9f72a726f520..c29c849d6b61d23e86e8af949561c00e889d2e9d 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/Snowball.java +++ b/src/main/java/net/minecraft/world/entity/projectile/Snowball.java @@ -57,6 +57,36 @@ public class Snowball extends ThrowableItemProjectile { @@ -23,15 +23,15 @@ index e1e19a360be99b189dee1652e5289292f4996d92..d34b78584ae428388dd82e6eb207650b + + net.minecraft.world.level.block.state.BlockState iblockdata = this.level.getBlockState(blockposition); + -+ if (this.level.purpurConfig.snowballExtinguishesFire && this.level.getBlockState(blockposition1).is(net.minecraft.world.level.block.Blocks.FIRE)) { ++ if (this.level().purpurConfig.snowballExtinguishesFire && this.level.getBlockState(blockposition1).is(net.minecraft.world.level.block.Blocks.FIRE)) { + if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this, blockposition1, net.minecraft.world.level.block.Blocks.AIR.defaultBlockState()).isCancelled()) { + this.level.removeBlock(blockposition1, false); + } -+ } else if (this.level.purpurConfig.snowballExtinguishesCandles && net.minecraft.world.level.block.AbstractCandleBlock.isLit(iblockdata)) { ++ } else if (this.level().purpurConfig.snowballExtinguishesCandles && net.minecraft.world.level.block.AbstractCandleBlock.isLit(iblockdata)) { + if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, iblockdata.setValue(net.minecraft.world.level.block.AbstractCandleBlock.LIT, false)).isCancelled()) { + net.minecraft.world.level.block.AbstractCandleBlock.extinguish(null, iblockdata, this.level, blockposition); + } -+ } else if (this.level.purpurConfig.snowballExtinguishesCampfires && net.minecraft.world.level.block.CampfireBlock.isLitCampfire(iblockdata)) { ++ } else if (this.level().purpurConfig.snowballExtinguishesCampfires && net.minecraft.world.level.block.CampfireBlock.isLitCampfire(iblockdata)) { + if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, iblockdata.setValue(net.minecraft.world.level.block.CampfireBlock.LIT, false)).isCancelled()) { + this.level.levelEvent(null, 1009, blockposition, 0); + net.minecraft.world.level.block.CampfireBlock.dowse(this.getOwner(), this.level, blockposition, iblockdata); @@ -46,7 +46,7 @@ index e1e19a360be99b189dee1652e5289292f4996d92..d34b78584ae428388dd82e6eb207650b protected void onHit(HitResult hitResult) { super.onHit(hitResult); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 9f291a28e55d834f9d9dc3a52fc77917530c8f24..bc34e28f199b8760efe146d43190754b90bd206a 100644 +index a1151c789644d992fa1ee7ddd967a45b5426c1dd..3d73b18ca2c06250839982ccda9d30c5350a14eb 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -237,6 +237,9 @@ public class PurpurWorldConfig { diff --git a/patches/server/0221-Add-option-to-disable-zombie-villagers-cure.patch b/patches/server/0221-Add-option-to-disable-zombie-villagers-cure.patch index 207ba6032..8267a14a7 100644 --- a/patches/server/0221-Add-option-to-disable-zombie-villagers-cure.patch +++ b/patches/server/0221-Add-option-to-disable-zombie-villagers-cure.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add option to disable zombie villagers cure 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 76534e3b2414e5db82bb01ca8c6b4f6d53e733ab..45476b22e44442c1ec04494fe50b3de9ca147137 100644 +index 40b3498c57c62f8bdaac50546ca47f4927db7bfa..b8e0ae0714fd2b77831fb714b1bad901e7081cf4 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java @@ -212,7 +212,7 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { @@ -13,27 +13,27 @@ index 76534e3b2414e5db82bb01ca8c6b4f6d53e733ab..45476b22e44442c1ec04494fe50b3de9 if (itemstack.is(Items.GOLDEN_APPLE)) { - if (this.hasEffect(MobEffects.WEAKNESS)) { -+ if (this.hasEffect(MobEffects.WEAKNESS) && level.purpurConfig.zombieVillagerCureEnabled) { // Purpur ++ if (this.hasEffect(MobEffects.WEAKNESS) && level().purpurConfig.zombieVillagerCureEnabled) { // Purpur if (!player.getAbilities().instabuild) { itemstack.shrink(1); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index bc34e28f199b8760efe146d43190754b90bd206a..6baa9632c862726fc4cdd3fc0addf33a72bbc365 100644 +index 3d73b18ca2c06250839982ccda9d30c5350a14eb..a329d044571d6e0ed995770f79050892586f859b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2328,6 +2328,7 @@ public class PurpurWorldConfig { +@@ -2841,6 +2841,7 @@ public class PurpurWorldConfig { public boolean zombieVillagerTakeDamageFromWater = false; public int zombieVillagerCuringTimeMin = 3600; public int zombieVillagerCuringTimeMax = 6000; + public boolean zombieVillagerCureEnabled = true; private void zombieVillagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.zombie_villager.attributes.max-health", zombieVillagerMaxHealth); -@@ -2342,6 +2343,7 @@ public class PurpurWorldConfig { + zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); + zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); +@@ -2851,6 +2852,7 @@ public class PurpurWorldConfig { zombieVillagerTakeDamageFromWater = getBoolean("mobs.zombie_villager.takes-damage-from-water", zombieVillagerTakeDamageFromWater); zombieVillagerCuringTimeMin = getInt("mobs.zombie_villager.curing_time.min", zombieVillagerCuringTimeMin); zombieVillagerCuringTimeMax = getInt("mobs.zombie_villager.curing_time.max", zombieVillagerCuringTimeMax); + zombieVillagerCureEnabled = getBoolean("mobs.zombie_villager.cure.enabled", zombieVillagerCureEnabled); } - public double zombifiedPiglinMaxHealth = 20.0D; + public boolean zombifiedPiglinRidable = false; diff --git a/patches/server/0224-Mobs-always-drop-experience.patch b/patches/server/0224-Mobs-always-drop-experience.patch index 98048be6f..0ba1ad6a9 100644 --- a/patches/server/0224-Mobs-always-drop-experience.patch +++ b/patches/server/0224-Mobs-always-drop-experience.patch @@ -5,103 +5,103 @@ Subject: [PATCH] Mobs always drop experience diff --git a/src/main/java/net/minecraft/world/entity/GlowSquid.java b/src/main/java/net/minecraft/world/entity/GlowSquid.java -index 4570f2859ed4251a2e9cf79ecbc7255523cbbc79..678cff629d4de6fbe060dbbebbb669c93164f59b 100644 +index 1a67f46b57e398d23fbc495ee81ae62e0d84d3dc..43cdda0cb26c5d5cc9025199eb71673d71c2abea 100644 --- a/src/main/java/net/minecraft/world/entity/GlowSquid.java +++ b/src/main/java/net/minecraft/world/entity/GlowSquid.java @@ -51,6 +51,11 @@ public class GlowSquid extends Squid { - return this.level.purpurConfig.glowSquidTakeDamageFromWater; + return this.level().purpurConfig.glowSquidTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.glowSquidAlwaysDropExp; ++ return this.level().purpurConfig.glowSquidAlwaysDropExp; + } + @Override protected ParticleOptions getInkParticle() { return ParticleTypes.GLOW_SQUID_INK; diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -index 8413fcf8b5d23726c0b2030c1c8c813278a2cf72..1c4222aac4cd4fecddb793d6aff75ea5aec8efd9 100644 +index a38b90e1d306a4926f473cdd38b6f719b4ce4252..2b24f9015a6ae9693ce844fc78d635de45199832 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java @@ -295,6 +295,11 @@ public class Bat extends AmbientCreature { - return this.level.purpurConfig.batTakeDamageFromWater; + return this.level().purpurConfig.batTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.batAlwaysDropExp; ++ return this.level().purpurConfig.batAlwaysDropExp; + } + @Override public void readAdditionalSaveData(CompoundTag nbt) { super.readAdditionalSaveData(nbt); 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 2ce665cb02520803bf55362d1703f416ea9078fa..521cad59e394901e16d178c46e10d186eb3fdefd 100644 +index 318e51509338a7cf22dfeb1a923638d8df2b5c2f..fad2da0ba194d349de73777a7ab43bb6447298e7 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java @@ -481,6 +481,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { - return this.level.purpurConfig.beeTakeDamageFromWater; + return this.level().purpurConfig.beeTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.beeAlwaysDropExp; ++ return this.level().purpurConfig.beeAlwaysDropExp; + } + @Override public int getRemainingPersistentAngerTime() { return (Integer) this.entityData.get(Bee.DATA_REMAINING_ANGER_TIME); diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java -index 93a0adaf4ad080439a8df1688d5b5b241ead07c6..44539b6f8857ef86c9454296cf09b9cf203126ad 100644 +index 7f1763b820a0c5dc69bdf6cdf14a97a283ba5916..3347b39fa1bc3308aa3b70b4169523885b91a047 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java @@ -137,6 +137,11 @@ public class Cat extends TamableAnimal implements VariantHolder { - return this.level.purpurConfig.catTakeDamageFromWater; + return this.level().purpurConfig.catTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.catAlwaysDropExp; ++ return this.level().purpurConfig.catAlwaysDropExp; + } + public ResourceLocation getResourceLocation() { return this.getVariant().texture(); } diff --git a/src/main/java/net/minecraft/world/entity/animal/Chicken.java b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -index 970e4274edf409fbf61c267e32075426d00480d1..21df4bac457295482958c29f55c855316c2b45a1 100644 +index 6fe3e62ba4534e821937baa14d728186f8c6439e..00bdb2b75221349cb40da2b5fc1563393fd17ef6 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Chicken.java +++ b/src/main/java/net/minecraft/world/entity/animal/Chicken.java @@ -89,6 +89,11 @@ public class Chicken extends Animal { - return this.level.purpurConfig.chickenTakeDamageFromWater; + return this.level().purpurConfig.chickenTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.chickenAlwaysDropExp; ++ return this.level().purpurConfig.chickenAlwaysDropExp; + } + @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); diff --git a/src/main/java/net/minecraft/world/entity/animal/Cod.java b/src/main/java/net/minecraft/world/entity/animal/Cod.java -index dd4a116dfe471eaca9a7915db430d39ea8a81915..a5808b3222f69b6853f6dabdc5d5e3561746afd2 100644 +index 2343325fa9a771de7b9445cda24a2bcd7a7c1761..f0b6118a9995bb41836685bbf94d2e7fb15761eb 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cod.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cod.java @@ -35,6 +35,11 @@ public class Cod extends AbstractSchoolingFish { - return this.level.purpurConfig.codTakeDamageFromWater; + return this.level().purpurConfig.codTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.codAlwaysDropExp; ++ return this.level().purpurConfig.codAlwaysDropExp; + } + @Override public ItemStack getBucketItemStack() { return new ItemStack(Items.COD_BUCKET); diff --git a/src/main/java/net/minecraft/world/entity/animal/Cow.java b/src/main/java/net/minecraft/world/entity/animal/Cow.java -index 5dc426430033d526e379a94232a7e8c17ad52704..d4057ade705e6d5b418535da8a71aaadd5e55306 100644 +index 5c99065d8f097920e440980313fd75a040c2cc66..3147c51a76f70a732fdc0fc53b8376821c4e2034 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java @@ -83,6 +83,11 @@ public class Cow extends Animal { @@ -110,46 +110,46 @@ index 5dc426430033d526e379a94232a7e8c17ad52704..d4057ade705e6d5b418535da8a71aaad + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.cowAlwaysDropExp; ++ return this.level().purpurConfig.cowAlwaysDropExp; + } + @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); diff --git a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java -index 0fcb6b45df160c33c6f4e29e643f76af3252a925..4ff6f8bac4742ae6a2129c7268720c91e37386b6 100644 +index a3585d3c4331138bdd029c6fd8723c5c5dc23a16..7f71ba27e6794d592e74686b9d404340b1bd9d5b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java +++ b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java @@ -165,6 +165,11 @@ public class Dolphin extends WaterAnimal { - return this.level.purpurConfig.dolphinTakeDamageFromWater; + return this.level().purpurConfig.dolphinTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.dolphinAlwaysDropExp; ++ return this.level().purpurConfig.dolphinAlwaysDropExp; + } + @Nullable @Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, @Nullable SpawnGroupData entityData, @Nullable CompoundTag entityNbt) { diff --git a/src/main/java/net/minecraft/world/entity/animal/Fox.java b/src/main/java/net/minecraft/world/entity/animal/Fox.java -index 35491e36fbab850110ae4fd255cc0acd1e9d8792..1a422a88c7b9bb48312de471a6f32cabd70f4501 100644 +index 1cc0f08a1b63a6786d62fb1ee120e47f1b622d52..d9d4341c4511f4982f691eeea80ef17de759291a 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java @@ -196,6 +196,11 @@ public class Fox extends Animal implements VariantHolder { - return this.level.purpurConfig.foxTakeDamageFromWater; + return this.level().purpurConfig.foxTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.foxAlwaysDropExp; ++ return this.level().purpurConfig.foxAlwaysDropExp; + } + @Override protected void defineSynchedData() { super.defineSynchedData(); diff --git a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -index b4e41bdca75fad328fe2936860e832f5221a6c31..347b61faf0f93e863b27a672b54a85318ab168c1 100644 +index c2817324ff57860ea2628dc4ac8e78b76cf67a5a..64aba511e615983988cdb6a0fd45b7d9d4f2f16d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java @@ -103,6 +103,11 @@ public class IronGolem extends AbstractGolem implements NeutralMob { @@ -158,174 +158,174 @@ index b4e41bdca75fad328fe2936860e832f5221a6c31..347b61faf0f93e863b27a672b54a8531 + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.ironGolemAlwaysDropExp; ++ return this.level().purpurConfig.ironGolemAlwaysDropExp; + } + @Override protected void registerGoals() { - if (level.purpurConfig.ironGolemCanSwim) this.goalSelector.addGoal(0, new net.minecraft.world.entity.ai.goal.FloatGoal(this)); // Purpur + if (level().purpurConfig.ironGolemCanSwim) this.goalSelector.addGoal(0, new net.minecraft.world.entity.ai.goal.FloatGoal(this)); // Purpur diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index d7705035b80f92b9053b16ae413f82b85624ab76..7c36938ba56b1fd3381db00ef862f9b7488b2b80 100644 +index 56fb35206af7e04a78eba489d444135176188a20..1b0a0e36baa0f664f06b2d166aa907b320066b6e 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java @@ -95,6 +95,11 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder { - return this.level.purpurConfig.rabbitTakeDamageFromWater; + return this.level().purpurConfig.rabbitTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.rabbitAlwaysDropExp; ++ return this.level().purpurConfig.rabbitAlwaysDropExp; + } + // CraftBukkit start - code from constructor public void initializePathFinderGoals(){ this.setSpeedModifier(0.0D); diff --git a/src/main/java/net/minecraft/world/entity/animal/Salmon.java b/src/main/java/net/minecraft/world/entity/animal/Salmon.java -index e28290c96da8e27fa6d61cf0ad1684e6787cb19b..4132cad9870493ce839eb2601b281b167f546fed 100644 +index e101c3bf425902908c43ffa18867fb83a5e1f16e..382e47f26ee94506cb76463a677351b9bdcf8040 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Salmon.java +++ b/src/main/java/net/minecraft/world/entity/animal/Salmon.java @@ -35,6 +35,11 @@ public class Salmon extends AbstractSchoolingFish { - return this.level.purpurConfig.salmonTakeDamageFromWater; + return this.level().purpurConfig.salmonTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.salmonAlwaysDropExp; ++ return this.level().purpurConfig.salmonAlwaysDropExp; + } + @Override public int getMaxSchoolSize() { return 5; diff --git a/src/main/java/net/minecraft/world/entity/animal/Sheep.java b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -index c5f4e9d3774eefc43b5b5b4bf895efbb06ae2a9e..8c6aa82746720f6cc404531a94a02b52bc42278b 100644 +index 35decea07efa8ca9f7ed896be9b8f3eb5afbf082..a1b323ecba25910e97f154e487acc94943117e0c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java +++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java @@ -149,6 +149,11 @@ public class Sheep extends Animal implements Shearable { - return this.level.purpurConfig.sheepTakeDamageFromWater; + return this.level().purpurConfig.sheepTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.sheepAlwaysDropExp; ++ return this.level().purpurConfig.sheepAlwaysDropExp; + } + @Override protected void registerGoals() { this.eatBlockGoal = new EatBlockGoal(this); diff --git a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -index 6fee0d553c837addd3f6b15cb960b93fdb216dfd..292e3522dd2da89e31b3ae16f30a7a7444845d4e 100644 +index e33364beff36e255989520d5d076729c9c8ed1fe..dd4d3dbda72a3bf0aabce0f999121f401f85b8a4 100644 --- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java @@ -86,6 +86,11 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM @@ -334,222 +334,222 @@ index 6fee0d553c837addd3f6b15cb960b93fdb216dfd..292e3522dd2da89e31b3ae16f30a7a74 + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.snowGolemAlwaysDropExp; ++ return this.level().purpurConfig.snowGolemAlwaysDropExp; + } + @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur diff --git a/src/main/java/net/minecraft/world/entity/animal/Squid.java b/src/main/java/net/minecraft/world/entity/animal/Squid.java -index 6e52d61dae3956ae165c4e1b7a1992e57419edc8..0e63a011dfcbdec6e6880175f6f1e96c0d45f724 100644 +index 80192e663bf8998d38fb3933894608327e50c46c..beef2f6a42eebeaf5761bac841300f780bfdf4f2 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Squid.java +++ b/src/main/java/net/minecraft/world/entity/animal/Squid.java @@ -97,6 +97,11 @@ public class Squid extends WaterAnimal { - return this.level.purpurConfig.squidTakeDamageFromWater; + return this.level().purpurConfig.squidTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.squidAlwaysDropExp; ++ return this.level().purpurConfig.squidAlwaysDropExp; + } + @Override protected void registerGoals() { this.goalSelector.addGoal(0, new Squid.SquidRandomMovementGoal(this)); diff --git a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -index edf1092f32e24abcefc73b173bde56224121f97a..d41d5cb4ab7623a483a8ebd5e539b0e03e24acd4 100644 +index b16d075581a352714f86f1b87805f24c9e336aa3..87b6f6b10ba6e3d9c6a42298a2019a526a183d90 100644 --- a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java +++ b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java @@ -64,6 +64,11 @@ public class TropicalFish extends AbstractSchoolingFish implements VariantHolder - return this.level.purpurConfig.tropicalFishTakeDamageFromWater; + return this.level().purpurConfig.tropicalFishTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.tropicalFishAlwaysDropExp; ++ return this.level().purpurConfig.tropicalFishAlwaysDropExp; + } + public static String getPredefinedName(int variant) { return "entity.minecraft.tropical_fish.predefined." + variant; } diff --git a/src/main/java/net/minecraft/world/entity/animal/Turtle.java b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -index 4505783c91992085bfc2965f4a78a0b5df21de77..3b70c7f55167eea949861730502c7befd373f1be 100644 +index 5c2fc833dac13dd8b959f035abb74432ec6c82c9..bcc6d50aed60d1255fbdbfb7b9494b52300a7e3a 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java +++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java @@ -115,6 +115,11 @@ public class Turtle extends Animal { - return this.level.purpurConfig.turtleTakeDamageFromWater; + return this.level().purpurConfig.turtleTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.turtleAlwaysDropExp; ++ return this.level().purpurConfig.turtleAlwaysDropExp; + } + public void setHomePos(BlockPos pos) { this.entityData.set(Turtle.HOME_POS, pos.immutable()); // Paper - called with mutablepos... } diff --git a/src/main/java/net/minecraft/world/entity/animal/Wolf.java b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -index 70d122820f214cd60854d7fbb7ecc8e1223cab7b..f9bc1d5e03e615613c7958c4a5b341c48e858842 100644 +index 79e67987f8077133f447ba5c7e1d5edb676e18e8..179d6131a8bac2fa031c33810227d9bc036c241d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java @@ -214,6 +214,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { - return this.level.purpurConfig.wolfTakeDamageFromWater; + return this.level().purpurConfig.wolfTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.wolfAlwaysDropExp; ++ return this.level().purpurConfig.wolfAlwaysDropExp; + } + @Override protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index 1f3618fc9679ad3938c2939b192132125b0e2201..0e590ffc45f443f678a46ad21bbb9c199fecb79c 100644 +index b0b0176ce1660d71fbbb96e60bba43f8deff3cd8..ec49c2af2fb09b8ead5529d0ec5cf59d2ab70e6b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java @@ -130,6 +130,11 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder getModelRotationValues() { return this.modelRotationValues; diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -index fde16c2060bcf1af102ce8fa5cbcacc58dbd5b1e..6fa5737295f23d90c2aa6d6a235f31aac8944eae 100644 +index fad539b4804204b9d5730962e6a7de114dda3f1a..0ebb9ac9d951741eb9dea8475380cfcc68becae3 100644 --- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java +++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java @@ -116,6 +116,11 @@ public class Goat extends Animal { - return this.level.purpurConfig.goatTakeDamageFromWater; + return this.level().purpurConfig.goatTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.goatAlwaysDropExp; ++ return this.level().purpurConfig.goatAlwaysDropExp; + } + @Override protected Brain.Provider brainProvider() { return Brain.provider(Goat.MEMORY_TYPES, Goat.SENSOR_TYPES); diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java b/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java -index 21f17176d1e10aa036fbc470d4864611855f79ce..ede05210f8341bbec56e49944569938143bcab21 100644 +index af4bac165cbc39fb6959983a1116a6fb65af0ecb..72ad12175325091397459e06743875cce6df8d94 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java @@ -47,6 +47,11 @@ public class Donkey extends AbstractChestedHorse { - return this.level.purpurConfig.donkeyTakeDamageFromWater; + return this.level().purpurConfig.donkeyTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.donkeyAlwaysDropExp; ++ return this.level().purpurConfig.donkeyAlwaysDropExp; + } + @Override protected SoundEvent getAmbientSound() { return SoundEvents.DONKEY_AMBIENT; diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java b/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java -index b47d9039bc4a7cfd4fa5f31aeb02f72283aaf64b..4e7bf6f563febe9e63147d3e2f8f7b58cac8c37e 100644 +index f8dbea402f723bf38d7ab3f2468d1b02b7124560..3b1faa63e46a48e83ea672cf6da444a1d7e13270 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java @@ -72,6 +72,11 @@ public class Horse extends AbstractHorse implements VariantHolder { - return this.level.purpurConfig.horseTakeDamageFromWater; + return this.level().purpurConfig.horseTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.horseAlwaysDropExp; ++ return this.level().purpurConfig.horseAlwaysDropExp; + } + @Override protected void randomizeAttributes(RandomSource random) { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue((double)generateMaxHealth(random::nextInt)); diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index d8eac8a7f5919c8eda5999c1bbc8fab098a69b08..5b0f1d18ebf5f9938d21a0912e3066a83d1a114f 100644 +index 26ed1eef3b38e643dfc6738e4b7880c9d1c9dc20..70ac8c2fef15587d57f37c72db7913fd89f05d31 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java @@ -148,6 +148,11 @@ public class Llama extends AbstractChestedHorse implements VariantHolder type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { return checkMonsterSpawnRules(type, world, spawnReason, pos, random) && (spawnReason == MobSpawnType.SPAWNER || world.canSeeSky(pos)); } diff --git a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java -index 18edadaaddc68ee6aafaf35bd4b38f1c15d41493..8dda0bf984df0c49e199c7b8a54e39259a1a27f4 100644 +index 91294d87521c884c402485b923691f9fd8985353..f9cddf46d1dbcabc738842ba039daa76bb6f3eb5 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java +++ b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java @@ -88,6 +88,11 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { - return this.level.purpurConfig.illusionerTakeDamageFromWater; + return this.level().purpurConfig.illusionerTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.illusionerAlwaysDropExp; ++ return this.level().purpurConfig.illusionerAlwaysDropExp; + } + @Override protected void registerGoals() { super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java -index 9e84790e77802a23fbbf7df24cc302958d5304b1..8d900affbc5ac802ea957fb5204dc3480605d05f 100644 +index e0ebc4c2d8dd718ce78d981a1d099e7482221f1f..1ad97267394d3717b1871336193cdc91f3ffb276 100644 --- a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java +++ b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java @@ -72,6 +72,11 @@ public class MagmaCube extends Slime { - return this.level.purpurConfig.magmaCubeTakeDamageFromWater; + return this.level().purpurConfig.magmaCubeTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.magmaCubeAlwaysDropExp; ++ return this.level().purpurConfig.magmaCubeAlwaysDropExp; + } + public static AttributeSupplier.Builder createAttributes() { return Monster.createMonsterAttributes().add(Attributes.MOVEMENT_SPEED, (double)0.2F); } diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -index 7cf3014eb0c658dd2e9d8ee369549eb17a93c9d3..4c4b8b3f656cfb5cb084a456076f1b0061711970 100644 +index 7897d72dacc787b027306911eea4d59e31d06142..d6eda14f1735a8d8a6b7aa1afb6afeff4397fb1b 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java @@ -125,6 +125,11 @@ public class Phantom extends FlyingMob implements Enemy { - return this.level.purpurConfig.phantomTakeDamageFromWater; + return this.level().purpurConfig.phantomTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.phantomAlwaysDropExp; ++ return this.level().purpurConfig.phantomAlwaysDropExp; + } + @Override public boolean isFlapping() { return (this.getUniqueFlapTickOffset() + this.tickCount) % Phantom.TICKS_PER_FLAP == 0; diff --git a/src/main/java/net/minecraft/world/entity/monster/Pillager.java b/src/main/java/net/minecraft/world/entity/monster/Pillager.java -index 0e5c2437419518d95186ff2c067bead47b60ef2b..095dfb863a190be71d33eee62e44d777b19eaa56 100644 +index 1f64dc8442de75447c17ae4fd5483345d4b7fd3e..06d52d8b61abc4dbbdc953bfed2e688be377b3cc 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Pillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Pillager.java @@ -89,6 +89,11 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve - return this.level.purpurConfig.pillagerTakeDamageFromWater; + return this.level().purpurConfig.pillagerTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.pillagerAlwaysDropExp; ++ return this.level().purpurConfig.pillagerAlwaysDropExp; + } + @Override protected void registerGoals() { super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Ravager.java b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -index 6a0674fd0b7920bae5ba08a6f9919fbd838962e5..e231235334972f7de81a93e32e72654f9e080697 100644 +index 9083bc138d322cbb0b060c73dadc427aaa574bd9..dc55bf60f6e37971525214c1e872119e8fc92fe8 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java @@ -98,6 +98,11 @@ public class Ravager extends Raider { - return this.level.purpurConfig.ravagerTakeDamageFromWater; + return this.level().purpurConfig.ravagerTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.ravagerAlwaysDropExp; ++ return this.level().purpurConfig.ravagerAlwaysDropExp; + } + @Override protected void registerGoals() { super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Shulker.java b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -index 24f7aec811d2b04804311bd9b2d00206cccfa9f4..c7ece8f868b5ea049b545c3d143ba5f8f84884b7 100644 +index fbafb9e2ea9dfd237560d34f9cd6f29533e31f16..d1a80dfb51b86f92b37bbb4c235e38d2b8713541 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java @@ -142,6 +142,11 @@ public class Shulker extends AbstractGolem implements VariantHolder type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { BlockPos blockPos = pos; diff --git a/src/main/java/net/minecraft/world/entity/monster/Strider.java b/src/main/java/net/minecraft/world/entity/monster/Strider.java -index c942f7f5df032b32a51e1f60a90af54385327e1c..a92509bb1b47dd94746cecdcb51d1b41c44c9e04 100644 +index 88fc9317aeac79f3352fc8955f8c4f6b3f87eddc..cfa603c7ccaaf1940aa89fa7cd8fafba29529075 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Strider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java @@ -127,6 +127,11 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { - return this.level.purpurConfig.striderBreedingTicks; + return this.level().purpurConfig.striderBreedingTicks; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.striderAlwaysDropExp; ++ return this.level().purpurConfig.striderAlwaysDropExp; + } + public static boolean checkStriderSpawnRules(EntityType type, LevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { BlockPos.MutableBlockPos blockposition_mutableblockposition = pos.mutable(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Vex.java b/src/main/java/net/minecraft/world/entity/monster/Vex.java -index c2464a01feeb470db88c25c95011ad0175a90917..1c94b4cb6178df9dda219503708509f9a5bff9d7 100644 +index 3d79723a6b1d5e099d70bb82917ee551d9f2df7e..5db70031c8c9ba901a360c758d51222efe911fcc 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vex.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vex.java @@ -117,6 +117,11 @@ public class Vex extends Monster implements TraceableEntity { - return this.level.purpurConfig.vexTakeDamageFromWater; + return this.level().purpurConfig.vexTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.vexAlwaysDropExp; ++ return this.level().purpurConfig.vexAlwaysDropExp; + } + @Override protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) { return dimensions.height - 0.28125F; diff --git a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java -index 1c9a54e6b67f9e688130f1cb9c1e5411c6e75e37..a2fb375afea155961f4dc61837bc30c22130ebf6 100644 +index 34a6105c04d107278c18f3b2829282b227c5c5c5..f1e410b602bf0d5520f8e9340f7b8b9e25ca4d39 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java @@ -85,6 +85,11 @@ public class Vindicator extends AbstractIllager { - return this.level.purpurConfig.vindicatorTakeDamageFromWater; + return this.level().purpurConfig.vindicatorTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.vindicatorAlwaysDropExp; ++ return this.level().purpurConfig.vindicatorAlwaysDropExp; + } + @Override protected void registerGoals() { super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Witch.java b/src/main/java/net/minecraft/world/entity/monster/Witch.java -index 53a2999a84e68938b5e976ccd8a61cad1c5a397a..39f71afd5ba8cfc37a34f42a6ea80641e37737a8 100644 +index d49813eeaf417806a16ff7d9b7ef8a9c30cfe8d6..80e90202eae1e12d5261d0bb77ecfadcc9ac4599 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Witch.java +++ b/src/main/java/net/minecraft/world/entity/monster/Witch.java @@ -84,6 +84,11 @@ public class Witch extends Raider implements RangedAttackMob { - return this.level.purpurConfig.witchTakeDamageFromWater; + return this.level().purpurConfig.witchTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.witchAlwaysDropExp; ++ return this.level().purpurConfig.witchAlwaysDropExp; + } + @Override protected void registerGoals() { super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java -index d24fa628d76029b04daa7971aa9f39a262f89844..6b16ab057a31a013d6d870569ce77f6479fb19f3 100644 +index c6f36715de37c8694860fc3834f203664c264138..2b3decb90aeb99bef42b36f3b8df06cb1172b413 100644 --- a/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java +++ b/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java @@ -62,6 +62,11 @@ public class WitherSkeleton extends AbstractSkeleton { - return this.level.purpurConfig.witherSkeletonTakeDamageFromWater; + return this.level().purpurConfig.witherSkeletonTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.witherSkeletonAlwaysDropExp; ++ return this.level().purpurConfig.witherSkeletonAlwaysDropExp; + } + @Override protected void registerGoals() { this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractPiglin.class, true)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -index df8cd4f58cc75df2d9c6822e1675f9cf2f8a2936..0e96fbb526fa21dd0c64453270bfd8b87ea39c01 100644 +index 651c4f4b3d9349b8e9d6601a37ca5da192898a61..fc5272e8671ff4bda3bd17abe5c31cc0ff4114f8 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java @@ -94,6 +94,11 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { - return this.level.purpurConfig.zoglinTakeDamageFromWater; + return this.level().purpurConfig.zoglinTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.zoglinAlwaysDropExp; ++ return this.level().purpurConfig.zoglinAlwaysDropExp; + } + @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index 1cbd73bd55435f049a1a0e3a9d242ab8f6be7de2..ef5dda3b8094e81e31cade8807a1b65d6c4111e2 100644 +index a8d2f8654ee370e98bb1c4e7e1111debd62a7429..7c5efb5582f43d9f333f926ad7dba1ed9920333a 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java @@ -146,6 +146,11 @@ public class Zombie extends Monster { - return this.level.purpurConfig.zombieTakeDamageFromWater; + return this.level().purpurConfig.zombieTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.zombieAlwaysDropExp; ++ return this.level().purpurConfig.zombieAlwaysDropExp; + } + @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur 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 45476b22e44442c1ec04494fe50b3de9ca147137..a5ba2d6e940abdfe3273b7085707f1c8c9b76b67 100644 +index b8e0ae0714fd2b77831fb714b1bad901e7081cf4..be2a35f703310f699ee31bd2ec1c938af281a577 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java @@ -126,6 +126,11 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { - return level.purpurConfig.zombieVillagerJockeyTryExistingChickens; + return level().purpurConfig.zombieVillagerJockeyTryExistingChickens; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.zombieVillagerAlwaysDropExp; ++ return this.level().purpurConfig.zombieVillagerAlwaysDropExp; + } + @Override protected void defineSynchedData() { super.defineSynchedData(); diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index 4e6495f6cde80d1fe8c8902012ab63738d444e26..cdee256cd8b2a99a2bb3f9a10ccd33bd1f59ca11 100644 +index 21ba6ea58dfbfd9a7c0bf7d518d7f12730841a08..7bb99d7fd8e05805e0cac7bec0b2771990057f58 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java @@ -105,6 +105,11 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { - return level.purpurConfig.zombifiedPiglinJockeyTryExistingChickens; + return level().purpurConfig.zombifiedPiglinJockeyTryExistingChickens; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.zombifiedPiglinAlwaysDropExp; ++ return this.level().purpurConfig.zombifiedPiglinAlwaysDropExp; + } + @Override public void setPersistentAngerTarget(@Nullable UUID angryAt) { this.persistentAngerTarget = angryAt; diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index 17a7623466e55ff967a4c54ed0d674f16e0a23ca..5d595101672419aec8ed49d65f8a394a3c6a846a 100644 +index 3b99761fabc02255a66ec84f5c6cf199848455dc..5bc0bf6486b146ecefe747f029f79ab504dc6423 100644 --- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java @@ -99,6 +99,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { - return this.level.purpurConfig.hoglinTakeDamageFromWater; + return this.level().purpurConfig.hoglinTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.hoglinAlwaysDropExp; ++ return this.level().purpurConfig.hoglinAlwaysDropExp; + } + @Override public boolean canBeLeashed(Player player) { return !this.isLeashed(); diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -index f9ca274c7d273f7c56bbc2ffb8e78b6f51880bbd..b19055382e18e9eddfdcd6ac2acc3023203db905 100644 +index e2d04fc258e093b0b2b5d11ae061a81f286d55ce..18879b75aeedf8df321c2cf93ee8b94e0d321333 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java @@ -123,6 +123,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento - return this.level.purpurConfig.piglinTakeDamageFromWater; + return this.level().purpurConfig.piglinTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.piglinAlwaysDropExp; ++ return this.level().purpurConfig.piglinAlwaysDropExp; + } + @Override public void addAdditionalSaveData(CompoundTag nbt) { super.addAdditionalSaveData(nbt); diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -index 54bb2392a71dffaaa73b00ada833291dd0a86ab7..05582a59fc53d914d2cd8206b361df496b9ca65f 100644 +index b63d87df0f48dd63c89118f91b31dc4e3622e3b8..61e8f2d030fc50840c3f80dfb6fc810797ec440f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java @@ -68,6 +68,11 @@ public class PiglinBrute extends AbstractPiglin { - return this.level.purpurConfig.piglinBruteTakeDamageFromWater; + return this.level().purpurConfig.piglinBruteTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.piglinBruteAlwaysDropExp; ++ return this.level().purpurConfig.piglinBruteAlwaysDropExp; + } + public static AttributeSupplier.Builder createAttributes() { return Monster.createMonsterAttributes().add(Attributes.MAX_HEALTH, 50.0D).add(Attributes.MOVEMENT_SPEED, (double)0.35F).add(Attributes.ATTACK_DAMAGE, 7.0D); } diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index e27c63bc845495385f1034fa6246058642f07941..21f50d2216399837fb144608950adbfdc00a498b 100644 +index 87fa0181e6e9c819c3b5abd95f75231dfeb12be2..00a62f48961f6909488b040d75457633d47809ec 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java @@ -192,6 +192,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler - return this.level.purpurConfig.villagerTakeDamageFromWater; + return this.level().purpurConfig.villagerTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.villagerAlwaysDropExp; ++ return this.level().purpurConfig.villagerAlwaysDropExp; + } + @Override public Brain getBrain() { return (Brain) super.getBrain(); // CraftBukkit - decompile error diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index 547795c81be710267c93d29c75a9b5e139d3eedc..fd93eebe94f0ed4d26633292b7c711519a12d6b1 100644 +index 8fd8778e918566504666213a102a7ee2d1ed8b14..7fa248b2d1b73e20085f0d3cdfead38547e4e924 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java @@ -98,6 +98,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill - return this.level.purpurConfig.wanderingTraderTakeDamageFromWater; + return this.level().purpurConfig.wanderingTraderTakeDamageFromWater; } + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level.purpurConfig.wanderingTraderAlwaysDropExp; ++ return this.level().purpurConfig.wanderingTraderAlwaysDropExp; + } + @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 9af4765b04263ee79e95f07aabf91a55a7e760bf..b2693eaaca09da316fa06a4a901f1b16ecbb5f89 100644 +index b7f89a97abf9d5d7c01ba300299b919a4b7b4a7c..ef620d81a4e58ad7fa3c3184b216799ccf127ffd 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -997,10 +997,12 @@ public class PurpurWorldConfig { +@@ -1058,12 +1058,14 @@ public class PurpurWorldConfig { public double axolotlMaxHealth = 14.0D; public int axolotlBreedingTicks = 6000; public boolean axolotlTakeDamageFromWater = false; + public boolean axolotlAlwaysDropExp = false; private void axolotlSettings() { + axolotlRidable = getBoolean("mobs.axolotl.ridable", axolotlRidable); + axolotlControllable = getBoolean("mobs.axolotl.controllable", axolotlControllable); axolotlMaxHealth = getDouble("mobs.axolotl.attributes.max_health", axolotlMaxHealth); axolotlBreedingTicks = getInt("mobs.axolotl.breeding-delay-ticks", axolotlBreedingTicks); axolotlTakeDamageFromWater = getBoolean("mobs.axolotl.takes-damage-from-water", axolotlTakeDamageFromWater); + axolotlAlwaysDropExp = getBoolean("mobs.axolotl.always-drop-exp", axolotlAlwaysDropExp); } - public double batMaxHealth = 6.0D; -@@ -1012,6 +1014,7 @@ public class PurpurWorldConfig { + public boolean batRidable = false; +@@ -1079,6 +1081,7 @@ public class PurpurWorldConfig { public double batArmorToughness = 0.0D; public double batAttackKnockback = 0.0D; public boolean batTakeDamageFromWater = false; + public boolean batAlwaysDropExp = false; private void batSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.bat.attributes.max-health", batMaxHealth); -@@ -1027,6 +1030,7 @@ public class PurpurWorldConfig { + batRidable = getBoolean("mobs.bat.ridable", batRidable); + batRidableInWater = getBoolean("mobs.bat.ridable-in-water", batRidableInWater); +@@ -1098,6 +1101,7 @@ public class PurpurWorldConfig { batArmorToughness = getDouble("mobs.bat.attributes.armor_toughness", batArmorToughness); batAttackKnockback = getDouble("mobs.bat.attributes.attack_knockback", batAttackKnockback); batTakeDamageFromWater = getBoolean("mobs.bat.takes-damage-from-water", batTakeDamageFromWater); + batAlwaysDropExp = getBoolean("mobs.bat.always-drop-exp", batAlwaysDropExp); } - public double beeMaxHealth = 10.0D; -@@ -1034,6 +1038,7 @@ public class PurpurWorldConfig { + public boolean beeRidable = false; +@@ -1109,6 +1113,7 @@ public class PurpurWorldConfig { public boolean beeTakeDamageFromWater = false; public boolean beeCanWorkAtNight = false; public boolean beeCanWorkInRain = false; + public boolean beeAlwaysDropExp = false; private void beeSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.bee.attributes.max-health", beeMaxHealth); -@@ -1045,10 +1050,12 @@ public class PurpurWorldConfig { + beeRidable = getBoolean("mobs.bee.ridable", beeRidable); + beeRidableInWater = getBoolean("mobs.bee.ridable-in-water", beeRidableInWater); +@@ -1124,6 +1129,7 @@ public class PurpurWorldConfig { beeTakeDamageFromWater = getBoolean("mobs.bee.takes-damage-from-water", beeTakeDamageFromWater); beeCanWorkAtNight = getBoolean("mobs.bee.can-work-at-night", beeCanWorkAtNight); beeCanWorkInRain = getBoolean("mobs.bee.can-work-in-rain", beeCanWorkInRain); + beeAlwaysDropExp = getBoolean("mobs.bee.always-drop-exp", beeAlwaysDropExp); } + public boolean blazeRidable = false; +@@ -1132,6 +1138,7 @@ public class PurpurWorldConfig { + public double blazeMaxY = 320D; public double blazeMaxHealth = 20.0D; public boolean blazeTakeDamageFromWater = true; + public boolean blazeAlwaysDropExp = false; private void blazeSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.blaze.attributes.max-health", blazeMaxHealth); -@@ -1057,6 +1064,7 @@ public class PurpurWorldConfig { + blazeRidable = getBoolean("mobs.blaze.ridable", blazeRidable); + blazeRidableInWater = getBoolean("mobs.blaze.ridable-in-water", blazeRidableInWater); +@@ -1144,6 +1151,7 @@ public class PurpurWorldConfig { } blazeMaxHealth = getDouble("mobs.blaze.attributes.max_health", blazeMaxHealth); blazeTakeDamageFromWater = getBoolean("mobs.blaze.takes-damage-from-water", blazeTakeDamageFromWater); + blazeAlwaysDropExp = getBoolean("mobs.blaze.always-drop-exp", blazeAlwaysDropExp); } - public int camelBreedingTicks = 6000; -@@ -1083,6 +1091,7 @@ public class PurpurWorldConfig { + public boolean catRidable = false; +@@ -1156,6 +1164,7 @@ public class PurpurWorldConfig { public int catBreedingTicks = 6000; public DyeColor catDefaultCollarColor = DyeColor.RED; public boolean catTakeDamageFromWater = false; + public boolean catAlwaysDropExp = false; private void catSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.cat.attributes.max-health", catMaxHealth); -@@ -1100,10 +1109,12 @@ public class PurpurWorldConfig { + catRidable = getBoolean("mobs.cat.ridable", catRidable); + catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); +@@ -1176,6 +1185,7 @@ public class PurpurWorldConfig { catDefaultCollarColor = DyeColor.RED; } catTakeDamageFromWater = getBoolean("mobs.cat.takes-damage-from-water", catTakeDamageFromWater); + catAlwaysDropExp = getBoolean("mobs.cat.always-drop-exp", catAlwaysDropExp); } + public boolean caveSpiderRidable = false; +@@ -1183,6 +1193,7 @@ public class PurpurWorldConfig { + public boolean caveSpiderControllable = true; public double caveSpiderMaxHealth = 12.0D; public boolean caveSpiderTakeDamageFromWater = false; + public boolean caveSpiderAlwaysDropExp = false; private void caveSpiderSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.cave_spider.attributes.max-health", caveSpiderMaxHealth); -@@ -1112,12 +1123,14 @@ public class PurpurWorldConfig { + caveSpiderRidable = getBoolean("mobs.cave_spider.ridable", caveSpiderRidable); + caveSpiderRidableInWater = getBoolean("mobs.cave_spider.ridable-in-water", caveSpiderRidableInWater); +@@ -1194,6 +1205,7 @@ public class PurpurWorldConfig { } caveSpiderMaxHealth = getDouble("mobs.cave_spider.attributes.max_health", caveSpiderMaxHealth); caveSpiderTakeDamageFromWater = getBoolean("mobs.cave_spider.takes-damage-from-water", caveSpiderTakeDamageFromWater); + caveSpiderAlwaysDropExp = getBoolean("mobs.cave_spider.always-drop-exp", caveSpiderAlwaysDropExp); } - public double chickenMaxHealth = 4.0D; + public boolean chickenRidable = false; +@@ -1203,6 +1215,7 @@ public class PurpurWorldConfig { public boolean chickenRetaliate = false; public int chickenBreedingTicks = 6000; public boolean chickenTakeDamageFromWater = false; + public boolean chickenAlwaysDropExp = false; private void chickenSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.chicken.attributes.max-health", chickenMaxHealth); -@@ -1128,10 +1141,12 @@ public class PurpurWorldConfig { + chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); + chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); +@@ -1216,12 +1229,14 @@ public class PurpurWorldConfig { chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate); chickenBreedingTicks = getInt("mobs.chicken.breeding-delay-ticks", chickenBreedingTicks); chickenTakeDamageFromWater = getBoolean("mobs.chicken.takes-damage-from-water", chickenTakeDamageFromWater); + chickenAlwaysDropExp = getBoolean("mobs.chicken.always-drop-exp", chickenAlwaysDropExp); } + public boolean codRidable = false; + public boolean codControllable = true; public double codMaxHealth = 3.0D; public boolean codTakeDamageFromWater = false; + public boolean codAlwaysDropExp = false; private void codSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.cod.attributes.max-health", codMaxHealth); -@@ -1140,6 +1155,7 @@ public class PurpurWorldConfig { + codRidable = getBoolean("mobs.cod.ridable", codRidable); + codControllable = getBoolean("mobs.cod.controllable", codControllable); +@@ -1232,6 +1247,7 @@ public class PurpurWorldConfig { } codMaxHealth = getDouble("mobs.cod.attributes.max_health", codMaxHealth); codTakeDamageFromWater = getBoolean("mobs.cod.takes-damage-from-water", codTakeDamageFromWater); + codAlwaysDropExp = getBoolean("mobs.cod.always-drop-exp", codAlwaysDropExp); } - public double cowMaxHealth = 10.0D; -@@ -1148,6 +1164,7 @@ public class PurpurWorldConfig { + public boolean cowRidable = false; +@@ -1243,6 +1259,7 @@ public class PurpurWorldConfig { public boolean cowTakeDamageFromWater = false; public double cowNaturallyAggressiveToPlayersChance = 0.0D; public double cowNaturallyAggressiveToPlayersDamage = 2.0D; + public boolean cowAlwaysDropExp = false; private void cowSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.cow.attributes.max-health", cowMaxHealth); -@@ -1165,6 +1182,7 @@ public class PurpurWorldConfig { + cowRidable = getBoolean("mobs.cow.ridable", cowRidable); + cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); +@@ -1263,6 +1280,7 @@ public class PurpurWorldConfig { cowTakeDamageFromWater = getBoolean("mobs.cow.takes-damage-from-water", cowTakeDamageFromWater); cowNaturallyAggressiveToPlayersChance = getDouble("mobs.cow.naturally-aggressive-to-players.chance", cowNaturallyAggressiveToPlayersChance); cowNaturallyAggressiveToPlayersDamage = getDouble("mobs.cow.naturally-aggressive-to-players.damage", cowNaturallyAggressiveToPlayersDamage); + cowAlwaysDropExp = getBoolean("mobs.cow.always-drop-exp", cowAlwaysDropExp); } - public double creeperMaxHealth = 20.0D; -@@ -1174,6 +1192,7 @@ public class PurpurWorldConfig { + public boolean creeperRidable = false; +@@ -1275,6 +1293,7 @@ public class PurpurWorldConfig { public boolean creeperTakeDamageFromWater = false; public boolean creeperExplodeWhenKilled = false; public boolean creeperHealthRadius = false; + public boolean creeperAlwaysDropExp = false; private void creeperSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.creeper.attributes.max-health", creeperMaxHealth); -@@ -1187,12 +1206,14 @@ public class PurpurWorldConfig { + creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); + creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); +@@ -1291,6 +1310,7 @@ public class PurpurWorldConfig { creeperTakeDamageFromWater = getBoolean("mobs.creeper.takes-damage-from-water", creeperTakeDamageFromWater); creeperExplodeWhenKilled = getBoolean("mobs.creeper.explode-when-killed", creeperExplodeWhenKilled); creeperHealthRadius = getBoolean("mobs.creeper.health-impacts-explosion", creeperHealthRadius); + creeperAlwaysDropExp = getBoolean("mobs.creeper.always-drop-exp", creeperAlwaysDropExp); } - public double dolphinMaxHealth = 10.0D; + public boolean dolphinRidable = false; +@@ -1302,6 +1322,7 @@ public class PurpurWorldConfig { public boolean dolphinDisableTreasureSearching = false; public boolean dolphinTakeDamageFromWater = false; public double dolphinNaturallyAggressiveToPlayersChance = 0.0D; + public boolean dolphinAlwaysDropExp = false; private void dolphinSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.dolphin.attributes.max-health", dolphinMaxHealth); -@@ -1203,6 +1224,7 @@ public class PurpurWorldConfig { + dolphinRidable = getBoolean("mobs.dolphin.ridable", dolphinRidable); + dolphinControllable = getBoolean("mobs.dolphin.controllable", dolphinControllable); +@@ -1317,6 +1338,7 @@ public class PurpurWorldConfig { dolphinDisableTreasureSearching = getBoolean("mobs.dolphin.disable-treasure-searching", dolphinDisableTreasureSearching); dolphinTakeDamageFromWater = getBoolean("mobs.dolphin.takes-damage-from-water", dolphinTakeDamageFromWater); dolphinNaturallyAggressiveToPlayersChance = getDouble("mobs.dolphin.naturally-aggressive-to-players-chance", dolphinNaturallyAggressiveToPlayersChance); + dolphinAlwaysDropExp = getBoolean("mobs.dolphin.always-drop-exp", dolphinAlwaysDropExp); } - public double donkeyMaxHealthMin = 15.0D; -@@ -1213,6 +1235,7 @@ public class PurpurWorldConfig { + public boolean donkeyRidableInWater = false; +@@ -1328,6 +1350,7 @@ public class PurpurWorldConfig { public double donkeyMovementSpeedMax = 0.175D; public int donkeyBreedingTicks = 6000; public boolean donkeyTakeDamageFromWater = false; + public boolean donkeyAlwaysDropExp = false; private void donkeySettings() { + donkeyRidableInWater = getBoolean("mobs.donkey.ridable-in-water", donkeyRidableInWater); if (PurpurConfig.version < 10) { - double oldMin = getDouble("mobs.donkey.attributes.max-health.min", donkeyMaxHealthMin); -@@ -1229,6 +1252,7 @@ public class PurpurWorldConfig { +@@ -1345,6 +1368,7 @@ public class PurpurWorldConfig { donkeyMovementSpeedMax = getDouble("mobs.donkey.attributes.movement_speed.max", donkeyMovementSpeedMax); donkeyBreedingTicks = getInt("mobs.donkey.breeding-delay-ticks", donkeyBreedingTicks); donkeyTakeDamageFromWater = getBoolean("mobs.donkey.takes-damage-from-water", donkeyTakeDamageFromWater); + donkeyAlwaysDropExp = getBoolean("mobs.donkey.always-drop-exp", donkeyAlwaysDropExp); } - public double drownedMaxHealth = 20.0D; -@@ -1238,6 +1262,7 @@ public class PurpurWorldConfig { + public boolean drownedRidable = false; +@@ -1357,6 +1381,7 @@ public class PurpurWorldConfig { public boolean drownedJockeyTryExistingChickens = true; public boolean drownedTakeDamageFromWater = false; public boolean drownedBreakDoors = false; + public boolean drownedAlwaysDropExp = false; private void drownedSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.drowned.attributes.max-health", drownedMaxHealth); -@@ -1251,10 +1276,12 @@ public class PurpurWorldConfig { + drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); + drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); +@@ -1373,6 +1398,7 @@ public class PurpurWorldConfig { drownedJockeyTryExistingChickens = getBoolean("mobs.drowned.jockey.try-existing-chickens", drownedJockeyTryExistingChickens); drownedTakeDamageFromWater = getBoolean("mobs.drowned.takes-damage-from-water", drownedTakeDamageFromWater); drownedBreakDoors = getBoolean("mobs.drowned.can-break-doors", drownedBreakDoors); + drownedAlwaysDropExp = getBoolean("mobs.drowned.always-drop-exp", drownedAlwaysDropExp); } + public double camelMaxHealthMin = 32.0D; +@@ -1396,6 +1422,7 @@ public class PurpurWorldConfig { + public boolean elderGuardianControllable = true; public double elderGuardianMaxHealth = 80.0D; public boolean elderGuardianTakeDamageFromWater = false; + public boolean elderGuardianAlwaysDropExp = false; private void elderGuardianSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.elder_guardian.attributes.max-health", elderGuardianMaxHealth); -@@ -1263,6 +1290,7 @@ public class PurpurWorldConfig { + elderGuardianRidable = getBoolean("mobs.elder_guardian.ridable", elderGuardianRidable); + elderGuardianControllable = getBoolean("mobs.elder_guardian.controllable", elderGuardianControllable); +@@ -1406,6 +1433,7 @@ public class PurpurWorldConfig { } elderGuardianMaxHealth = getDouble("mobs.elder_guardian.attributes.max_health", elderGuardianMaxHealth); elderGuardianTakeDamageFromWater = getBoolean("mobs.elder_guardian.takes-damage-from-water", elderGuardianTakeDamageFromWater); + elderGuardianAlwaysDropExp = getBoolean("mobs.elder_guardian.always-drop-exp", elderGuardianAlwaysDropExp); } - public double enderDragonMaxHealth = 200.0D; -@@ -1297,6 +1325,7 @@ public class PurpurWorldConfig { + public boolean enderDragonRidable = false; +@@ -1451,6 +1479,7 @@ public class PurpurWorldConfig { public boolean endermanIgnorePlayerDragonHead = false; public boolean endermanDisableStareAggro = false; public boolean endermanIgnoreProjectiles = false; + public boolean endermanAlwaysDropExp = false; private void endermanSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.enderman.attributes.max-health", endermanMaxHealth); -@@ -1317,10 +1346,12 @@ public class PurpurWorldConfig { + endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); + endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); +@@ -1474,6 +1503,7 @@ public class PurpurWorldConfig { endermanIgnorePlayerDragonHead = getBoolean("mobs.enderman.ignore-players-wearing-dragon-head", endermanIgnorePlayerDragonHead); endermanDisableStareAggro = getBoolean("mobs.enderman.disable-player-stare-aggression", endermanDisableStareAggro); endermanIgnoreProjectiles = getBoolean("mobs.enderman.ignore-projectiles", endermanIgnoreProjectiles); + endermanAlwaysDropExp = getBoolean("mobs.enderman.always-drop-exp", endermanAlwaysDropExp); } + public boolean endermiteRidable = false; +@@ -1481,6 +1511,7 @@ public class PurpurWorldConfig { + public boolean endermiteControllable = true; public double endermiteMaxHealth = 8.0D; public boolean endermiteTakeDamageFromWater = false; + public boolean endermiteAlwaysDropExp = false; private void endermiteSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.endermite.attributes.max-health", endermiteMaxHealth); -@@ -1329,11 +1360,13 @@ public class PurpurWorldConfig { + endermiteRidable = getBoolean("mobs.endermite.ridable", endermiteRidable); + endermiteRidableInWater = getBoolean("mobs.endermite.ridable-in-water", endermiteRidableInWater); +@@ -1492,6 +1523,7 @@ public class PurpurWorldConfig { } endermiteMaxHealth = getDouble("mobs.endermite.attributes.max_health", endermiteMaxHealth); endermiteTakeDamageFromWater = getBoolean("mobs.endermite.takes-damage-from-water", endermiteTakeDamageFromWater); + endermiteAlwaysDropExp = getBoolean("mobs.endermite.always-drop-exp", endermiteAlwaysDropExp); } + public boolean evokerRidable = false; +@@ -1500,6 +1532,7 @@ public class PurpurWorldConfig { public double evokerMaxHealth = 24.0D; public boolean evokerBypassMobGriefing = false; public boolean evokerTakeDamageFromWater = false; + public boolean evokerAlwaysDropExp = false; private void evokerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.evoker.attributes.max-health", evokerMaxHealth); -@@ -1343,6 +1376,7 @@ public class PurpurWorldConfig { + evokerRidable = getBoolean("mobs.evoker.ridable", evokerRidable); + evokerRidableInWater = getBoolean("mobs.evoker.ridable-in-water", evokerRidableInWater); +@@ -1512,6 +1545,7 @@ public class PurpurWorldConfig { evokerMaxHealth = getDouble("mobs.evoker.attributes.max_health", evokerMaxHealth); evokerBypassMobGriefing = getBoolean("mobs.evoker.bypass-mob-griefing", evokerBypassMobGriefing); evokerTakeDamageFromWater = getBoolean("mobs.evoker.takes-damage-from-water", evokerTakeDamageFromWater); + evokerAlwaysDropExp = getBoolean("mobs.evoker.always-drop-exp", evokerAlwaysDropExp); } - public double foxMaxHealth = 10.0D; -@@ -1350,6 +1384,7 @@ public class PurpurWorldConfig { + public boolean foxRidable = false; +@@ -1522,6 +1556,7 @@ public class PurpurWorldConfig { public int foxBreedingTicks = 6000; public boolean foxBypassMobGriefing = false; public boolean foxTakeDamageFromWater = false; + public boolean foxAlwaysDropExp = false; private void foxSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.fox.attributes.max-health", foxMaxHealth); -@@ -1361,6 +1396,7 @@ public class PurpurWorldConfig { + foxRidable = getBoolean("mobs.fox.ridable", foxRidable); + foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); +@@ -1536,6 +1571,7 @@ public class PurpurWorldConfig { foxBreedingTicks = getInt("mobs.fox.breeding-delay-ticks", foxBreedingTicks); foxBypassMobGriefing = getBoolean("mobs.fox.bypass-mob-griefing", foxBypassMobGriefing); foxTakeDamageFromWater = getBoolean("mobs.fox.takes-damage-from-water", foxTakeDamageFromWater); + foxAlwaysDropExp = getBoolean("mobs.fox.always-drop-exp", foxAlwaysDropExp); } - public int frogBreedingTicks = 6000; -@@ -1370,6 +1406,7 @@ public class PurpurWorldConfig { - + public boolean frogRidable = false; +@@ -1557,6 +1593,7 @@ public class PurpurWorldConfig { + public double ghastMaxY = 320D; public double ghastMaxHealth = 10.0D; public boolean ghastTakeDamageFromWater = false; + public boolean ghastAlwaysDropExp = false; private void ghastSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.ghast.attributes.max-health", ghastMaxHealth); -@@ -1378,6 +1415,7 @@ public class PurpurWorldConfig { + ghastRidable = getBoolean("mobs.ghast.ridable", ghastRidable); + ghastRidableInWater = getBoolean("mobs.ghast.ridable-in-water", ghastRidableInWater); +@@ -1569,6 +1606,7 @@ public class PurpurWorldConfig { } ghastMaxHealth = getDouble("mobs.ghast.attributes.max_health", ghastMaxHealth); ghastTakeDamageFromWater = getBoolean("mobs.ghast.takes-damage-from-water", ghastTakeDamageFromWater); + ghastAlwaysDropExp = getBoolean("mobs.ghast.always-drop-exp", ghastAlwaysDropExp); } - public double giantMovementSpeed = 0.5D; -@@ -1388,6 +1426,7 @@ public class PurpurWorldConfig { + public boolean giantRidable = false; +@@ -1582,6 +1620,7 @@ public class PurpurWorldConfig { public boolean giantHaveAI = false; public boolean giantHaveHostileAI = false; public boolean giantTakeDamageFromWater = false; + public boolean giantAlwaysDropExp = false; private void giantSettings() { - giantMovementSpeed = getDouble("mobs.giant.movement-speed", giantMovementSpeed); - giantAttackDamage = getDouble("mobs.giant.attack-damage", giantAttackDamage); -@@ -1406,28 +1445,34 @@ public class PurpurWorldConfig { + giantRidable = getBoolean("mobs.giant.ridable", giantRidable); + giantRidableInWater = getBoolean("mobs.giant.ridable-in-water", giantRidableInWater); +@@ -1603,6 +1642,7 @@ public class PurpurWorldConfig { giantHaveAI = getBoolean("mobs.giant.have-ai", giantHaveAI); giantHaveHostileAI = getBoolean("mobs.giant.have-hostile-ai", giantHaveHostileAI); giantTakeDamageFromWater = getBoolean("mobs.giant.takes-damage-from-water", giantTakeDamageFromWater); + giantAlwaysDropExp = getBoolean("mobs.giant.always-drop-exp", giantAlwaysDropExp); } + public boolean glowSquidRidable = false; +@@ -1610,12 +1650,14 @@ public class PurpurWorldConfig { public double glowSquidMaxHealth = 10.0D; public boolean glowSquidsCanFly = false; public boolean glowSquidTakeDamageFromWater = false; + public boolean glowSquidAlwaysDropExp = false; private void glowSquidSettings() { + glowSquidRidable = getBoolean("mobs.glow_squid.ridable", glowSquidRidable); + glowSquidControllable = getBoolean("mobs.glow_squid.controllable", glowSquidControllable); glowSquidMaxHealth = getDouble("mobs.glow_squid.attributes.max_health", glowSquidMaxHealth); glowSquidsCanFly = getBoolean("mobs.glow_squid.can-fly", glowSquidsCanFly); glowSquidTakeDamageFromWater = getBoolean("mobs.glow_squid.takes-damage-from-water", glowSquidTakeDamageFromWater); + glowSquidAlwaysDropExp = getBoolean("mobs.glow_squid.always-drop-exp", glowSquidAlwaysDropExp); } + public boolean goatRidable = false; +@@ -1624,6 +1666,7 @@ public class PurpurWorldConfig { public double goatMaxHealth = 10.0D; public int goatBreedingTicks = 6000; public boolean goatTakeDamageFromWater = false; + public boolean goatAlwaysDropExp = false; private void goatSettings() { + goatRidable = getBoolean("mobs.goat.ridable", goatRidable); + goatRidableInWater = getBoolean("mobs.goat.ridable-in-water", goatRidableInWater); +@@ -1631,12 +1674,14 @@ public class PurpurWorldConfig { goatMaxHealth = getDouble("mobs.goat.attributes.max_health", goatMaxHealth); goatBreedingTicks = getInt("mobs.goat.breeding-delay-ticks", goatBreedingTicks); goatTakeDamageFromWater = getBoolean("mobs.goat.takes-damage-from-water", goatTakeDamageFromWater); + goatAlwaysDropExp = getBoolean("mobs.goat.always-drop-exp", goatAlwaysDropExp); } + public boolean guardianRidable = false; + public boolean guardianControllable = true; public double guardianMaxHealth = 30.0D; public boolean guardianTakeDamageFromWater = false; + public boolean guardianAlwaysDropExp = false; private void guardianSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.guardian.attributes.max-health", guardianMaxHealth); -@@ -1436,11 +1481,13 @@ public class PurpurWorldConfig { + guardianRidable = getBoolean("mobs.guardian.ridable", guardianRidable); + guardianControllable = getBoolean("mobs.guardian.controllable", guardianControllable); +@@ -1647,6 +1692,7 @@ public class PurpurWorldConfig { } guardianMaxHealth = getDouble("mobs.guardian.attributes.max_health", guardianMaxHealth); guardianTakeDamageFromWater = getBoolean("mobs.guardian.takes-damage-from-water", guardianTakeDamageFromWater); + guardianAlwaysDropExp = getBoolean("mobs.guardian.always-drop-exp", guardianAlwaysDropExp); } + public boolean hoglinRidable = false; +@@ -1655,6 +1701,7 @@ public class PurpurWorldConfig { public double hoglinMaxHealth = 40.0D; public int hoglinBreedingTicks = 6000; public boolean hoglinTakeDamageFromWater = false; + public boolean hoglinAlwaysDropExp = false; private void hoglinSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.hoglin.attributes.max-health", hoglinMaxHealth); -@@ -1450,6 +1497,7 @@ public class PurpurWorldConfig { + hoglinRidable = getBoolean("mobs.hoglin.ridable", hoglinRidable); + hoglinRidableInWater = getBoolean("mobs.hoglin.ridable-in-water", hoglinRidableInWater); +@@ -1667,6 +1714,7 @@ public class PurpurWorldConfig { hoglinMaxHealth = getDouble("mobs.hoglin.attributes.max_health", hoglinMaxHealth); hoglinBreedingTicks = getInt("mobs.hoglin.breeding-delay-ticks", hoglinBreedingTicks); hoglinTakeDamageFromWater = getBoolean("mobs.hoglin.takes-damage-from-water", hoglinTakeDamageFromWater); + hoglinAlwaysDropExp = getBoolean("mobs.hoglin.always-drop-exp", hoglinAlwaysDropExp); } - public double horseMaxHealthMin = 15.0D; -@@ -1460,6 +1508,7 @@ public class PurpurWorldConfig { + public boolean horseRidableInWater = false; +@@ -1678,6 +1726,7 @@ public class PurpurWorldConfig { public double horseMovementSpeedMax = 0.3375D; public int horseBreedingTicks = 6000; public boolean horseTakeDamageFromWater = false; + public boolean horseAlwaysDropExp = false; private void horseSettings() { + horseRidableInWater = getBoolean("mobs.horse.ridable-in-water", horseRidableInWater); if (PurpurConfig.version < 10) { - double oldMin = getDouble("mobs.horse.attributes.max-health.min", horseMaxHealthMin); -@@ -1476,6 +1525,7 @@ public class PurpurWorldConfig { +@@ -1695,6 +1744,7 @@ public class PurpurWorldConfig { horseMovementSpeedMax = getDouble("mobs.horse.attributes.movement_speed.max", horseMovementSpeedMax); horseBreedingTicks = getInt("mobs.horse.breeding-delay-ticks", horseBreedingTicks); horseTakeDamageFromWater = getBoolean("mobs.horse.takes-damage-from-water", horseTakeDamageFromWater); + horseAlwaysDropExp = getBoolean("mobs.horse.always-drop-exp", horseAlwaysDropExp); } - public double huskMaxHealth = 20.0D; -@@ -1484,6 +1534,7 @@ public class PurpurWorldConfig { + public boolean huskRidable = false; +@@ -1706,6 +1756,7 @@ public class PurpurWorldConfig { public double huskJockeyChance = 0.05D; public boolean huskJockeyTryExistingChickens = true; public boolean huskTakeDamageFromWater = false; + public boolean huskAlwaysDropExp = false; private void huskSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.husk.attributes.max-health", huskMaxHealth); -@@ -1496,12 +1547,14 @@ public class PurpurWorldConfig { + huskRidable = getBoolean("mobs.husk.ridable", huskRidable); + huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); +@@ -1721,6 +1772,7 @@ public class PurpurWorldConfig { huskJockeyChance = getDouble("mobs.husk.jockey.chance", huskJockeyChance); huskJockeyTryExistingChickens = getBoolean("mobs.husk.jockey.try-existing-chickens", huskJockeyTryExistingChickens); huskTakeDamageFromWater = getBoolean("mobs.husk.takes-damage-from-water", huskTakeDamageFromWater); + huskAlwaysDropExp = getBoolean("mobs.husk.always-drop-exp", huskAlwaysDropExp); } - public double illusionerMovementSpeed = 0.5D; + public boolean illusionerRidable = false; +@@ -1730,6 +1782,7 @@ public class PurpurWorldConfig { public double illusionerFollowRange = 18.0D; public double illusionerMaxHealth = 32.0D; public boolean illusionerTakeDamageFromWater = false; + public boolean illusionerAlwaysDropExp = false; private void illusionerSettings() { - illusionerMovementSpeed = getDouble("mobs.illusioner.movement-speed", illusionerMovementSpeed); - illusionerFollowRange = getDouble("mobs.illusioner.follow-range", illusionerFollowRange); -@@ -1516,12 +1569,14 @@ public class PurpurWorldConfig { + illusionerRidable = getBoolean("mobs.illusioner.ridable", illusionerRidable); + illusionerRidableInWater = getBoolean("mobs.illusioner.ridable-in-water", illusionerRidableInWater); +@@ -1747,6 +1800,7 @@ public class PurpurWorldConfig { } illusionerMaxHealth = getDouble("mobs.illusioner.attributes.max_health", illusionerMaxHealth); illusionerTakeDamageFromWater = getBoolean("mobs.illusioner.takes-damage-from-water", illusionerTakeDamageFromWater); + illusionerAlwaysDropExp = getBoolean("mobs.illusioner.always-drop-exp", illusionerAlwaysDropExp); } - public double ironGolemMaxHealth = 100.0D; + public boolean ironGolemRidable = false; +@@ -1757,6 +1811,7 @@ public class PurpurWorldConfig { public boolean ironGolemTakeDamageFromWater = false; public boolean ironGolemPoppyCalm = false; public boolean ironGolemHealCalm = false; + public boolean ironGolemAlwaysDropExp = false; private void ironGolemSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.iron_golem.attributes.max-health", ironGolemMaxHealth); -@@ -1532,6 +1587,7 @@ public class PurpurWorldConfig { + ironGolemRidable = getBoolean("mobs.iron_golem.ridable", ironGolemRidable); + ironGolemRidableInWater = getBoolean("mobs.iron_golem.ridable-in-water", ironGolemRidableInWater); +@@ -1771,6 +1826,7 @@ public class PurpurWorldConfig { ironGolemTakeDamageFromWater = getBoolean("mobs.iron_golem.takes-damage-from-water", ironGolemTakeDamageFromWater); ironGolemPoppyCalm = getBoolean("mobs.iron_golem.poppy-calms-anger", ironGolemPoppyCalm); ironGolemHealCalm = getBoolean("mobs.iron_golem.healing-calms-anger", ironGolemHealCalm); @@ -1569,7 +1604,7 @@ index 9af4765b04263ee79e95f07aabf91a55a7e760bf..b2693eaaca09da316fa06a4a901f1b16 } public boolean llamaRidable = false; -@@ -1546,6 +1602,7 @@ public class PurpurWorldConfig { +@@ -1785,6 +1841,7 @@ public class PurpurWorldConfig { public int llamaBreedingTicks = 6000; public boolean llamaTakeDamageFromWater = false; public boolean llamaJoinCaravans = true; @@ -1577,646 +1612,696 @@ index 9af4765b04263ee79e95f07aabf91a55a7e760bf..b2693eaaca09da316fa06a4a901f1b16 private void llamaSettings() { llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); -@@ -1566,6 +1623,7 @@ public class PurpurWorldConfig { +@@ -1808,6 +1865,7 @@ public class PurpurWorldConfig { llamaBreedingTicks = getInt("mobs.llama.breeding-delay-ticks", llamaBreedingTicks); llamaTakeDamageFromWater = getBoolean("mobs.llama.takes-damage-from-water", llamaTakeDamageFromWater); llamaJoinCaravans = getBoolean("mobs.llama.join-caravans", llamaJoinCaravans); + llamaAlwaysDropExp = getBoolean("mobs.llama.always-drop-exp", llamaAlwaysDropExp); } - public String magmaCubeMaxHealth = "size * size"; -@@ -1573,6 +1631,7 @@ public class PurpurWorldConfig { + public boolean magmaCubeRidable = false; +@@ -1818,6 +1876,7 @@ public class PurpurWorldConfig { public Map magmaCubeMaxHealthCache = new HashMap<>(); public Map magmaCubeAttackDamageCache = new HashMap<>(); public boolean magmaCubeTakeDamageFromWater = false; + public boolean magmaCubeAlwaysDropExp = false; private void magmaCubeSettings() { - if (PurpurConfig.version < 10) { - String oldValue = getString("mobs.magma_cube.attributes.max-health", magmaCubeMaxHealth); -@@ -1584,11 +1643,13 @@ public class PurpurWorldConfig { + magmaCubeRidable = getBoolean("mobs.magma_cube.ridable", magmaCubeRidable); + magmaCubeRidableInWater = getBoolean("mobs.magma_cube.ridable-in-water", magmaCubeRidableInWater); +@@ -1832,6 +1891,7 @@ public class PurpurWorldConfig { magmaCubeMaxHealthCache.clear(); magmaCubeAttackDamageCache.clear(); magmaCubeTakeDamageFromWater = getBoolean("mobs.magma_cube.takes-damage-from-water", magmaCubeTakeDamageFromWater); + magmaCubeAlwaysDropExp = getBoolean("mobs.magma_cube.always-drop-exp", magmaCubeAlwaysDropExp); } + public boolean mooshroomRidable = false; +@@ -1840,6 +1900,7 @@ public class PurpurWorldConfig { public double mooshroomMaxHealth = 10.0D; public int mooshroomBreedingTicks = 6000; public boolean mooshroomTakeDamageFromWater = false; + public boolean mooshroomAlwaysDropExp = false; private void mooshroomSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.mooshroom.attributes.max-health", mooshroomMaxHealth); -@@ -1598,6 +1659,7 @@ public class PurpurWorldConfig { + mooshroomRidable = getBoolean("mobs.mooshroom.ridable", mooshroomRidable); + mooshroomRidableInWater = getBoolean("mobs.mooshroom.ridable-in-water", mooshroomRidableInWater); +@@ -1852,6 +1913,7 @@ public class PurpurWorldConfig { mooshroomMaxHealth = getDouble("mobs.mooshroom.attributes.max_health", mooshroomMaxHealth); mooshroomBreedingTicks = getInt("mobs.mooshroom.breeding-delay-ticks", mooshroomBreedingTicks); mooshroomTakeDamageFromWater = getBoolean("mobs.mooshroom.takes-damage-from-water", mooshroomTakeDamageFromWater); + mooshroomAlwaysDropExp = getBoolean("mobs.mooshroom.always-drop-exp", mooshroomAlwaysDropExp); } - public double muleMaxHealthMin = 15.0D; -@@ -1608,6 +1670,7 @@ public class PurpurWorldConfig { + public boolean muleRidableInWater = false; +@@ -1863,6 +1925,7 @@ public class PurpurWorldConfig { public double muleMovementSpeedMax = 0.175D; public int muleBreedingTicks = 6000; public boolean muleTakeDamageFromWater = false; + public boolean muleAlwaysDropExp = false; private void muleSettings() { + muleRidableInWater = getBoolean("mobs.mule.ridable-in-water", muleRidableInWater); if (PurpurConfig.version < 10) { - double oldMin = getDouble("mobs.mule.attributes.max-health.min", muleMaxHealthMin); -@@ -1624,11 +1687,13 @@ public class PurpurWorldConfig { +@@ -1880,6 +1943,7 @@ public class PurpurWorldConfig { muleMovementSpeedMax = getDouble("mobs.mule.attributes.movement_speed.max", muleMovementSpeedMax); muleBreedingTicks = getInt("mobs.mule.breeding-delay-ticks", muleBreedingTicks); muleTakeDamageFromWater = getBoolean("mobs.mule.takes-damage-from-water", muleTakeDamageFromWater); + muleAlwaysDropExp = getBoolean("mobs.mule.always-drop-exp", muleAlwaysDropExp); } + public boolean ocelotRidable = false; +@@ -1888,6 +1952,7 @@ public class PurpurWorldConfig { public double ocelotMaxHealth = 10.0D; public int ocelotBreedingTicks = 6000; public boolean ocelotTakeDamageFromWater = false; + public boolean ocelotAlwaysDropExp = false; private void ocelotSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.ocelot.attributes.max-health", ocelotMaxHealth); -@@ -1638,11 +1703,13 @@ public class PurpurWorldConfig { + ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable); + ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater); +@@ -1900,6 +1965,7 @@ public class PurpurWorldConfig { ocelotMaxHealth = getDouble("mobs.ocelot.attributes.max_health", ocelotMaxHealth); ocelotBreedingTicks = getInt("mobs.ocelot.breeding-delay-ticks", ocelotBreedingTicks); ocelotTakeDamageFromWater = getBoolean("mobs.ocelot.takes-damage-from-water", ocelotTakeDamageFromWater); + ocelotAlwaysDropExp = getBoolean("mobs.ocelot.always-drop-exp", ocelotAlwaysDropExp); } + public boolean pandaRidable = false; +@@ -1908,6 +1974,7 @@ public class PurpurWorldConfig { public double pandaMaxHealth = 20.0D; public int pandaBreedingTicks = 6000; public boolean pandaTakeDamageFromWater = false; + public boolean pandaAlwaysDropExp = false; private void pandaSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.panda.attributes.max-health", pandaMaxHealth); -@@ -1652,11 +1719,13 @@ public class PurpurWorldConfig { + pandaRidable = getBoolean("mobs.panda.ridable", pandaRidable); + pandaRidableInWater = getBoolean("mobs.panda.ridable-in-water", pandaRidableInWater); +@@ -1920,6 +1987,7 @@ public class PurpurWorldConfig { pandaMaxHealth = getDouble("mobs.panda.attributes.max_health", pandaMaxHealth); pandaBreedingTicks = getInt("mobs.panda.breeding-delay-ticks", pandaBreedingTicks); pandaTakeDamageFromWater = getBoolean("mobs.panda.takes-damage-from-water", pandaTakeDamageFromWater); + pandaAlwaysDropExp = getBoolean("mobs.panda.always-drop-exp", pandaAlwaysDropExp); } + public boolean parrotRidable = false; +@@ -1929,6 +1997,7 @@ public class PurpurWorldConfig { public double parrotMaxHealth = 6.0D; public boolean parrotTakeDamageFromWater = false; public boolean parrotBreedable = false; + public boolean parrotAlwaysDropExp = false; private void parrotSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.parrot.attributes.max-health", parrotMaxHealth); -@@ -1666,6 +1735,7 @@ public class PurpurWorldConfig { + parrotRidable = getBoolean("mobs.parrot.ridable", parrotRidable); + parrotRidableInWater = getBoolean("mobs.parrot.ridable-in-water", parrotRidableInWater); +@@ -1942,6 +2011,7 @@ public class PurpurWorldConfig { parrotMaxHealth = getDouble("mobs.parrot.attributes.max_health", parrotMaxHealth); parrotTakeDamageFromWater = getBoolean("mobs.parrot.takes-damage-from-water", parrotTakeDamageFromWater); parrotBreedable = getBoolean("mobs.parrot.can-breed", parrotBreedable); + parrotAlwaysDropExp = getBoolean("mobs.parrot.always-drop-exp", parrotAlwaysDropExp); } - public String phantomMaxHealth = "20.0"; -@@ -1683,6 +1753,7 @@ public class PurpurWorldConfig { + public boolean phantomRidable = false; +@@ -1966,6 +2036,7 @@ public class PurpurWorldConfig { public boolean phantomBurnInDaylight = true; public boolean phantomFlamesOnSwoop = false; public boolean phantomTakeDamageFromWater = false; + public boolean phantomAlwaysDropExp = false; private void phantomSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.phantom.attributes.max-health", Double.parseDouble(phantomMaxHealth)); -@@ -1708,12 +1779,14 @@ public class PurpurWorldConfig { + phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); + phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); +@@ -1998,6 +2069,7 @@ public class PurpurWorldConfig { phantomIgnorePlayersWithTorch = getBoolean("mobs.phantom.ignore-players-with-torch", phantomIgnorePlayersWithTorch); phantomFlamesOnSwoop = getBoolean("mobs.phantom.flames-on-swoop", phantomFlamesOnSwoop); phantomTakeDamageFromWater = getBoolean("mobs.phantom.takes-damage-from-water", phantomTakeDamageFromWater); + phantomAlwaysDropExp = getBoolean("mobs.phantom.always-drop-exp", phantomAlwaysDropExp); } - public double pigMaxHealth = 10.0D; + public boolean pigRidable = false; +@@ -2007,6 +2079,7 @@ public class PurpurWorldConfig { public boolean pigGiveSaddleBack = false; public int pigBreedingTicks = 6000; public boolean pigTakeDamageFromWater = false; + public boolean pigAlwaysDropExp = false; private void pigSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.pig.attributes.max-health", pigMaxHealth); -@@ -1724,12 +1797,14 @@ public class PurpurWorldConfig { + pigRidable = getBoolean("mobs.pig.ridable", pigRidable); + pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); +@@ -2020,6 +2093,7 @@ public class PurpurWorldConfig { pigGiveSaddleBack = getBoolean("mobs.pig.give-saddle-back", pigGiveSaddleBack); pigBreedingTicks = getInt("mobs.pig.breeding-delay-ticks", pigBreedingTicks); pigTakeDamageFromWater = getBoolean("mobs.pig.takes-damage-from-water", pigTakeDamageFromWater); + pigAlwaysDropExp = getBoolean("mobs.pig.always-drop-exp", pigAlwaysDropExp); } - public double piglinMaxHealth = 16.0D; + public boolean piglinRidable = false; +@@ -2029,6 +2103,7 @@ public class PurpurWorldConfig { public boolean piglinBypassMobGriefing = false; public boolean piglinTakeDamageFromWater = false; public int piglinPortalSpawnModifier = 2000; + public boolean piglinAlwaysDropExp = false; private void piglinSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.piglin.attributes.max-health", piglinMaxHealth); -@@ -1740,10 +1815,12 @@ public class PurpurWorldConfig { + piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); + piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); +@@ -2042,6 +2117,7 @@ public class PurpurWorldConfig { piglinBypassMobGriefing = getBoolean("mobs.piglin.bypass-mob-griefing", piglinBypassMobGriefing); piglinTakeDamageFromWater = getBoolean("mobs.piglin.takes-damage-from-water", piglinTakeDamageFromWater); piglinPortalSpawnModifier = getInt("mobs.piglin.portal-spawn-modifier", piglinPortalSpawnModifier); + piglinAlwaysDropExp = getBoolean("mobs.piglin.always-drop-exp", piglinAlwaysDropExp); } + public boolean piglinBruteRidable = false; +@@ -2049,6 +2125,7 @@ public class PurpurWorldConfig { + public boolean piglinBruteControllable = true; public double piglinBruteMaxHealth = 50.0D; public boolean piglinBruteTakeDamageFromWater = false; + public boolean piglinBruteAlwaysDropExp = false; private void piglinBruteSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.piglin_brute.attributes.max-health", piglinBruteMaxHealth); -@@ -1752,11 +1829,13 @@ public class PurpurWorldConfig { + piglinBruteRidable = getBoolean("mobs.piglin_brute.ridable", piglinBruteRidable); + piglinBruteRidableInWater = getBoolean("mobs.piglin_brute.ridable-in-water", piglinBruteRidableInWater); +@@ -2060,6 +2137,7 @@ public class PurpurWorldConfig { } piglinBruteMaxHealth = getDouble("mobs.piglin_brute.attributes.max_health", piglinBruteMaxHealth); piglinBruteTakeDamageFromWater = getBoolean("mobs.piglin_brute.takes-damage-from-water", piglinBruteTakeDamageFromWater); + piglinBruteAlwaysDropExp = getBoolean("mobs.piglin_brute.always-drop-exp", piglinBruteAlwaysDropExp); } + public boolean pillagerRidable = false; +@@ -2068,6 +2146,7 @@ public class PurpurWorldConfig { public double pillagerMaxHealth = 24.0D; public boolean pillagerBypassMobGriefing = false; public boolean pillagerTakeDamageFromWater = false; + public boolean pillagerAlwaysDropExp = false; private void pillagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.pillager.attributes.max-health", pillagerMaxHealth); -@@ -1766,6 +1845,7 @@ public class PurpurWorldConfig { + pillagerRidable = getBoolean("mobs.pillager.ridable", pillagerRidable); + pillagerRidableInWater = getBoolean("mobs.pillager.ridable-in-water", pillagerRidableInWater); +@@ -2080,6 +2159,7 @@ public class PurpurWorldConfig { pillagerMaxHealth = getDouble("mobs.pillager.attributes.max_health", pillagerMaxHealth); pillagerBypassMobGriefing = getBoolean("mobs.pillager.bypass-mob-griefing", pillagerBypassMobGriefing); pillagerTakeDamageFromWater = getBoolean("mobs.pillager.takes-damage-from-water", pillagerTakeDamageFromWater); + pillagerAlwaysDropExp = getBoolean("mobs.pillager.always-drop-exp", pillagerAlwaysDropExp); } - public double polarBearMaxHealth = 30.0D; -@@ -1773,6 +1853,7 @@ public class PurpurWorldConfig { + public boolean polarBearRidable = false; +@@ -2090,6 +2170,7 @@ public class PurpurWorldConfig { public Item polarBearBreedableItem = null; public int polarBearBreedingTicks = 6000; public boolean polarBearTakeDamageFromWater = false; + public boolean polarBearAlwaysDropExp = false; private void polarBearSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.polar_bear.attributes.max-health", polarBearMaxHealth); -@@ -1785,10 +1866,12 @@ public class PurpurWorldConfig { + polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); + polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); +@@ -2105,12 +2186,14 @@ public class PurpurWorldConfig { if (item != Items.AIR) polarBearBreedableItem = item; polarBearBreedingTicks = getInt("mobs.polar_bear.breeding-delay-ticks", polarBearBreedingTicks); polarBearTakeDamageFromWater = getBoolean("mobs.polar_bear.takes-damage-from-water", polarBearTakeDamageFromWater); + polarBearAlwaysDropExp = getBoolean("mobs.polar_bear.always-drop-exp", polarBearAlwaysDropExp); } + public boolean pufferfishRidable = false; + public boolean pufferfishControllable = true; public double pufferfishMaxHealth = 3.0D; public boolean pufferfishTakeDamageFromWater = false; + public boolean pufferfishAlwaysDropExp = false; private void pufferfishSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.pufferfish.attributes.max-health", pufferfishMaxHealth); -@@ -1797,6 +1880,7 @@ public class PurpurWorldConfig { + pufferfishRidable = getBoolean("mobs.pufferfish.ridable", pufferfishRidable); + pufferfishControllable = getBoolean("mobs.pufferfish.controllable", pufferfishControllable); +@@ -2121,6 +2204,7 @@ public class PurpurWorldConfig { } pufferfishMaxHealth = getDouble("mobs.pufferfish.attributes.max_health", pufferfishMaxHealth); pufferfishTakeDamageFromWater = getBoolean("mobs.pufferfish.takes-damage-from-water", pufferfishTakeDamageFromWater); + pufferfishAlwaysDropExp = getBoolean("mobs.pufferfish.always-drop-exp", pufferfishAlwaysDropExp); } - public double rabbitMaxHealth = 3.0D; -@@ -1805,6 +1889,7 @@ public class PurpurWorldConfig { + public boolean rabbitRidable = false; +@@ -2132,6 +2216,7 @@ public class PurpurWorldConfig { public int rabbitBreedingTicks = 6000; public boolean rabbitBypassMobGriefing = false; public boolean rabbitTakeDamageFromWater = false; + public boolean rabbitAlwaysDropExp = false; private void rabbitSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.rabbit.attributes.max-health", rabbitMaxHealth); -@@ -1817,12 +1902,14 @@ public class PurpurWorldConfig { + rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); + rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); +@@ -2147,6 +2232,7 @@ public class PurpurWorldConfig { rabbitBreedingTicks = getInt("mobs.rabbit.breeding-delay-ticks", rabbitBreedingTicks); rabbitBypassMobGriefing = getBoolean("mobs.rabbit.bypass-mob-griefing", rabbitBypassMobGriefing); rabbitTakeDamageFromWater = getBoolean("mobs.rabbit.takes-damage-from-water", rabbitTakeDamageFromWater); + rabbitAlwaysDropExp = getBoolean("mobs.rabbit.always-drop-exp", rabbitAlwaysDropExp); } - public double ravagerMaxHealth = 100.0D; + public boolean ravagerRidable = false; +@@ -2156,6 +2242,7 @@ public class PurpurWorldConfig { public boolean ravagerBypassMobGriefing = false; public boolean ravagerTakeDamageFromWater = false; public List ravagerGriefableBlocks = new ArrayList<>(); + public boolean ravagerAlwaysDropExp = false; private void ravagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.ravager.attributes.max-health", ravagerMaxHealth); -@@ -1849,10 +1936,12 @@ public class PurpurWorldConfig { + ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); + ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); +@@ -2185,12 +2272,14 @@ public class PurpurWorldConfig { ravagerGriefableBlocks.add(block); } }); + ravagerAlwaysDropExp = getBoolean("mobs.ravager.always-drop-exp", ravagerAlwaysDropExp); } + public boolean salmonRidable = false; + public boolean salmonControllable = true; public double salmonMaxHealth = 3.0D; public boolean salmonTakeDamageFromWater = false; + public boolean salmonAlwaysDropExp = false; private void salmonSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.salmon.attributes.max-health", salmonMaxHealth); -@@ -1861,12 +1950,14 @@ public class PurpurWorldConfig { + salmonRidable = getBoolean("mobs.salmon.ridable", salmonRidable); + salmonControllable = getBoolean("mobs.salmon.controllable", salmonControllable); +@@ -2201,6 +2290,7 @@ public class PurpurWorldConfig { } salmonMaxHealth = getDouble("mobs.salmon.attributes.max_health", salmonMaxHealth); salmonTakeDamageFromWater = getBoolean("mobs.salmon.takes-damage-from-water", salmonTakeDamageFromWater); + salmonAlwaysDropExp = getBoolean("mobs.salmon.always-drop-exp", salmonAlwaysDropExp); } - public double sheepMaxHealth = 8.0D; + public boolean sheepRidable = false; +@@ -2210,6 +2300,7 @@ public class PurpurWorldConfig { public int sheepBreedingTicks = 6000; public boolean sheepBypassMobGriefing = false; public boolean sheepTakeDamageFromWater = false; + public boolean sheepAlwaysDropExp = false; private void sheepSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.sheep.attributes.max-health", sheepMaxHealth); -@@ -1877,6 +1968,7 @@ public class PurpurWorldConfig { + sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); + sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); +@@ -2223,6 +2314,7 @@ public class PurpurWorldConfig { sheepBreedingTicks = getInt("mobs.sheep.breeding-delay-ticks", sheepBreedingTicks); sheepBypassMobGriefing = getBoolean("mobs.sheep.bypass-mob-griefing", sheepBypassMobGriefing); sheepTakeDamageFromWater = getBoolean("mobs.sheep.takes-damage-from-water", sheepTakeDamageFromWater); + sheepAlwaysDropExp = getBoolean("mobs.sheep.always-drop-exp", sheepAlwaysDropExp); } - public double shulkerMaxHealth = 30.0D; -@@ -1887,6 +1979,7 @@ public class PurpurWorldConfig { + public boolean shulkerRidable = false; +@@ -2236,6 +2328,7 @@ public class PurpurWorldConfig { public String shulkerSpawnFromBulletNearbyEquation = "(nearby - 1) / 5.0"; public boolean shulkerSpawnFromBulletRandomColor = false; public boolean shulkerChangeColorWithDye = false; + public boolean shulkerAlwaysDropExp = false; private void shulkerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.shulker.attributes.max-health", shulkerMaxHealth); -@@ -1901,11 +1994,13 @@ public class PurpurWorldConfig { + shulkerRidable = getBoolean("mobs.shulker.ridable", shulkerRidable); + shulkerRidableInWater = getBoolean("mobs.shulker.ridable-in-water", shulkerRidableInWater); +@@ -2253,6 +2346,7 @@ public class PurpurWorldConfig { shulkerSpawnFromBulletNearbyEquation = getString("mobs.shulker.spawn-from-bullet.nearby-equation", shulkerSpawnFromBulletNearbyEquation); shulkerSpawnFromBulletRandomColor = getBoolean("mobs.shulker.spawn-from-bullet.random-color", shulkerSpawnFromBulletRandomColor); shulkerChangeColorWithDye = getBoolean("mobs.shulker.change-color-with-dye", shulkerChangeColorWithDye); + shulkerAlwaysDropExp = getBoolean("mobs.shulker.always-drop-exp", shulkerAlwaysDropExp); } + public boolean silverfishRidable = false; +@@ -2261,6 +2355,7 @@ public class PurpurWorldConfig { public double silverfishMaxHealth = 8.0D; public boolean silverfishBypassMobGriefing = false; public boolean silverfishTakeDamageFromWater = false; + public boolean silverfishAlwaysDropExp = false; private void silverfishSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.silverfish.attributes.max-health", silverfishMaxHealth); -@@ -1915,10 +2010,12 @@ public class PurpurWorldConfig { + silverfishRidable = getBoolean("mobs.silverfish.ridable", silverfishRidable); + silverfishRidableInWater = getBoolean("mobs.silverfish.ridable-in-water", silverfishRidableInWater); +@@ -2273,6 +2368,7 @@ public class PurpurWorldConfig { silverfishMaxHealth = getDouble("mobs.silverfish.attributes.max_health", silverfishMaxHealth); silverfishBypassMobGriefing = getBoolean("mobs.silverfish.bypass-mob-griefing", silverfishBypassMobGriefing); silverfishTakeDamageFromWater = getBoolean("mobs.silverfish.takes-damage-from-water", silverfishTakeDamageFromWater); + silverfishAlwaysDropExp = getBoolean("mobs.silverfish.always-drop-exp", silverfishAlwaysDropExp); } + public boolean skeletonRidable = false; +@@ -2280,6 +2376,7 @@ public class PurpurWorldConfig { + public boolean skeletonControllable = true; public double skeletonMaxHealth = 20.0D; public boolean skeletonTakeDamageFromWater = false; + public boolean skeletonAlwaysDropExp = false; private void skeletonSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.skeleton.attributes.max-health", skeletonMaxHealth); -@@ -1927,6 +2024,7 @@ public class PurpurWorldConfig { + skeletonRidable = getBoolean("mobs.skeleton.ridable", skeletonRidable); + skeletonRidableInWater = getBoolean("mobs.skeleton.ridable-in-water", skeletonRidableInWater); +@@ -2291,6 +2388,7 @@ public class PurpurWorldConfig { } skeletonMaxHealth = getDouble("mobs.skeleton.attributes.max_health", skeletonMaxHealth); skeletonTakeDamageFromWater = getBoolean("mobs.skeleton.takes-damage-from-water", skeletonTakeDamageFromWater); + skeletonAlwaysDropExp = getBoolean("mobs.skeleton.always-drop-exp", skeletonAlwaysDropExp); } - public double skeletonHorseMaxHealthMin = 15.0D; -@@ -1936,6 +2034,7 @@ public class PurpurWorldConfig { + public boolean skeletonHorseRidableInWater = true; +@@ -2302,6 +2400,7 @@ public class PurpurWorldConfig { public double skeletonHorseMovementSpeedMin = 0.2D; public double skeletonHorseMovementSpeedMax = 0.2D; public boolean skeletonHorseTakeDamageFromWater = false; + public boolean skeletonHorseAlwaysDropExp = false; private void skeletonHorseSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.skeleton_horse.attributes.max-health", skeletonHorseMaxHealthMin); -@@ -1950,6 +2049,7 @@ public class PurpurWorldConfig { + skeletonHorseRidableInWater = getBoolean("mobs.skeleton_horse.ridable-in-water", skeletonHorseRidableInWater); + skeletonHorseCanSwim = getBoolean("mobs.skeleton_horse.can-swim", skeletonHorseCanSwim); +@@ -2318,6 +2417,7 @@ public class PurpurWorldConfig { skeletonHorseMovementSpeedMin = getDouble("mobs.skeleton_horse.attributes.movement_speed.min", skeletonHorseMovementSpeedMin); skeletonHorseMovementSpeedMax = getDouble("mobs.skeleton_horse.attributes.movement_speed.max", skeletonHorseMovementSpeedMax); skeletonHorseTakeDamageFromWater = getBoolean("mobs.skeleton_horse.takes-damage-from-water", skeletonHorseTakeDamageFromWater); + skeletonHorseAlwaysDropExp = getBoolean("mobs.skeleton_horse.always-drop-exp", skeletonHorseAlwaysDropExp); } - public String slimeMaxHealth = "size * size"; -@@ -1957,6 +2057,7 @@ public class PurpurWorldConfig { + public boolean slimeRidable = false; +@@ -2328,6 +2428,7 @@ public class PurpurWorldConfig { public Map slimeMaxHealthCache = new HashMap<>(); public Map slimeAttackDamageCache = new HashMap<>(); public boolean slimeTakeDamageFromWater = false; + public boolean slimeAlwaysDropExp = false; private void slimeSettings() { - if (PurpurConfig.version < 10) { - String oldValue = getString("mobs.slime.attributes.max-health", slimeMaxHealth); -@@ -1968,6 +2069,7 @@ public class PurpurWorldConfig { + slimeRidable = getBoolean("mobs.slime.ridable", slimeRidable); + slimeRidableInWater = getBoolean("mobs.slime.ridable-in-water", slimeRidableInWater); +@@ -2342,6 +2443,7 @@ public class PurpurWorldConfig { slimeMaxHealthCache.clear(); slimeAttackDamageCache.clear(); slimeTakeDamageFromWater = getBoolean("mobs.slime.takes-damage-from-water", slimeTakeDamageFromWater); + slimeAlwaysDropExp = getBoolean("mobs.slime.always-drop-exp", slimeAlwaysDropExp); } - public boolean snowGolemLeaveTrailWhenRidden = false; -@@ -1980,6 +2082,7 @@ public class PurpurWorldConfig { + public boolean snowGolemRidable = false; +@@ -2357,6 +2459,7 @@ public class PurpurWorldConfig { public double snowGolemAttackDistance = 1.25D; public boolean snowGolemBypassMobGriefing = false; public boolean snowGolemTakeDamageFromWater = true; + public boolean snowGolemAlwaysDropExp = false; private void snowGolemSettings() { - snowGolemLeaveTrailWhenRidden = getBoolean("mobs.snow_golem.leave-trail-when-ridden", snowGolemLeaveTrailWhenRidden); - if (PurpurConfig.version < 10) { -@@ -1996,6 +2099,7 @@ public class PurpurWorldConfig { + snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); + snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); +@@ -2376,6 +2479,7 @@ public class PurpurWorldConfig { snowGolemAttackDistance = getDouble("mobs.snow_golem.attack-distance", snowGolemAttackDistance); snowGolemBypassMobGriefing = getBoolean("mobs.snow_golem.bypass-mob-griefing", snowGolemBypassMobGriefing); snowGolemTakeDamageFromWater = getBoolean("mobs.snow_golem.takes-damage-from-water", snowGolemTakeDamageFromWater); + snowGolemAlwaysDropExp = getBoolean("mobs.snow_golem.always-drop-exp", snowGolemAlwaysDropExp); } - public double snifferMaxHealth = 14.0D; -@@ -2010,6 +2114,7 @@ public class PurpurWorldConfig { + public boolean snifferRidable = false; +@@ -2398,6 +2502,7 @@ public class PurpurWorldConfig { public double squidOffsetWaterCheck = 0.0D; public boolean squidsCanFly = false; public boolean squidTakeDamageFromWater = false; + public boolean squidAlwaysDropExp = false; private void squidSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.squid.attributes.max-health", squidMaxHealth); -@@ -2021,10 +2126,12 @@ public class PurpurWorldConfig { + squidRidable = getBoolean("mobs.squid.ridable", squidRidable); + squidControllable = getBoolean("mobs.squid.controllable", squidControllable); +@@ -2411,6 +2516,7 @@ public class PurpurWorldConfig { squidOffsetWaterCheck = getDouble("mobs.squid.water-offset-check", squidOffsetWaterCheck); squidsCanFly = getBoolean("mobs.squid.can-fly", squidsCanFly); squidTakeDamageFromWater = getBoolean("mobs.squid.takes-damage-from-water", squidTakeDamageFromWater); + squidAlwaysDropExp = getBoolean("mobs.squid.always-drop-exp", squidAlwaysDropExp); } + public boolean spiderRidable = false; +@@ -2418,6 +2524,7 @@ public class PurpurWorldConfig { + public boolean spiderControllable = true; public double spiderMaxHealth = 16.0D; public boolean spiderTakeDamageFromWater = false; + public boolean spiderAlwaysDropExp = false; private void spiderSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.spider.attributes.max-health", spiderMaxHealth); -@@ -2033,10 +2140,12 @@ public class PurpurWorldConfig { + spiderRidable = getBoolean("mobs.spider.ridable", spiderRidable); + spiderRidableInWater = getBoolean("mobs.spider.ridable-in-water", spiderRidableInWater); +@@ -2429,6 +2536,7 @@ public class PurpurWorldConfig { } spiderMaxHealth = getDouble("mobs.spider.attributes.max_health", spiderMaxHealth); spiderTakeDamageFromWater = getBoolean("mobs.spider.takes-damage-from-water", spiderTakeDamageFromWater); + spiderAlwaysDropExp = getBoolean("mobs.spider.always-drop-exp", spiderAlwaysDropExp); } + public boolean strayRidable = false; +@@ -2436,6 +2544,7 @@ public class PurpurWorldConfig { + public boolean strayControllable = true; public double strayMaxHealth = 20.0D; public boolean strayTakeDamageFromWater = false; + public boolean strayAlwaysDropExp = false; private void straySettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.stray.attributes.max-health", strayMaxHealth); -@@ -2045,12 +2154,14 @@ public class PurpurWorldConfig { + strayRidable = getBoolean("mobs.stray.ridable", strayRidable); + strayRidableInWater = getBoolean("mobs.stray.ridable-in-water", strayRidableInWater); +@@ -2447,6 +2556,7 @@ public class PurpurWorldConfig { } strayMaxHealth = getDouble("mobs.stray.attributes.max_health", strayMaxHealth); strayTakeDamageFromWater = getBoolean("mobs.stray.takes-damage-from-water", strayTakeDamageFromWater); + strayAlwaysDropExp = getBoolean("mobs.stray.always-drop-exp", strayAlwaysDropExp); } - public double striderMaxHealth = 20.0D; + public boolean striderRidable = false; +@@ -2456,6 +2566,7 @@ public class PurpurWorldConfig { public int striderBreedingTicks = 6000; public boolean striderGiveSaddleBack = false; public boolean striderTakeDamageFromWater = true; + public boolean striderAlwaysDropExp = false; private void striderSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.strider.attributes.max-health", striderMaxHealth); -@@ -2061,6 +2172,7 @@ public class PurpurWorldConfig { + striderRidable = getBoolean("mobs.strider.ridable", striderRidable); + striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); +@@ -2469,6 +2580,7 @@ public class PurpurWorldConfig { striderBreedingTicks = getInt("mobs.strider.breeding-delay-ticks", striderBreedingTicks); striderGiveSaddleBack = getBoolean("mobs.strider.give-saddle-back", striderGiveSaddleBack); striderTakeDamageFromWater = getBoolean("mobs.strider.takes-damage-from-water", striderTakeDamageFromWater); + striderAlwaysDropExp = getBoolean("mobs.strider.always-drop-exp", striderAlwaysDropExp); } - public double traderLlamaMaxHealthMin = 15.0D; -@@ -2071,6 +2183,7 @@ public class PurpurWorldConfig { + public boolean tadpoleRidable = false; +@@ -2491,6 +2603,7 @@ public class PurpurWorldConfig { public double traderLlamaMovementSpeedMax = 0.175D; public int traderLlamaBreedingTicks = 6000; public boolean traderLlamaTakeDamageFromWater = false; + public boolean traderLlamaAlwaysDropExp = false; private void traderLlamaSettings() { - if (PurpurConfig.version < 10) { - double oldMin = getDouble("mobs.trader_llama.attributes.max-health.min", traderLlamaMaxHealthMin); -@@ -2087,10 +2200,12 @@ public class PurpurWorldConfig { + traderLlamaRidable = getBoolean("mobs.trader_llama.ridable", traderLlamaRidable); + traderLlamaRidableInWater = getBoolean("mobs.trader_llama.ridable-in-water", traderLlamaRidableInWater); +@@ -2510,12 +2623,14 @@ public class PurpurWorldConfig { traderLlamaMovementSpeedMax = getDouble("mobs.trader_llama.attributes.movement_speed.max", traderLlamaMovementSpeedMax); traderLlamaBreedingTicks = getInt("mobs.trader_llama.breeding-delay-ticks", traderLlamaBreedingTicks); traderLlamaTakeDamageFromWater = getBoolean("mobs.trader_llama.takes-damage-from-water", traderLlamaTakeDamageFromWater); + traderLlamaAlwaysDropExp = getBoolean("mobs.trader_llama.always-drop-exp", traderLlamaAlwaysDropExp); } + public boolean tropicalFishRidable = false; + public boolean tropicalFishControllable = true; public double tropicalFishMaxHealth = 3.0D; public boolean tropicalFishTakeDamageFromWater = false; + public boolean tropicalFishAlwaysDropExp = false; private void tropicalFishSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.tropical_fish.attributes.max-health", tropicalFishMaxHealth); -@@ -2099,11 +2214,13 @@ public class PurpurWorldConfig { + tropicalFishRidable = getBoolean("mobs.tropical_fish.ridable", tropicalFishRidable); + tropicalFishControllable = getBoolean("mobs.tropical_fish.controllable", tropicalFishControllable); +@@ -2526,6 +2641,7 @@ public class PurpurWorldConfig { } tropicalFishMaxHealth = getDouble("mobs.tropical_fish.attributes.max_health", tropicalFishMaxHealth); tropicalFishTakeDamageFromWater = getBoolean("mobs.tropical_fish.takes-damage-from-water", tropicalFishTakeDamageFromWater); + tropicalFishAlwaysDropExp = getBoolean("mobs.tropical_fish.always-drop-exp", tropicalFishAlwaysDropExp); } + public boolean turtleRidable = false; +@@ -2534,6 +2650,7 @@ public class PurpurWorldConfig { public double turtleMaxHealth = 30.0D; public int turtleBreedingTicks = 6000; public boolean turtleTakeDamageFromWater = false; + public boolean turtleAlwaysDropExp = false; private void turtleSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.turtle.attributes.max-health", turtleMaxHealth); -@@ -2113,11 +2230,13 @@ public class PurpurWorldConfig { + turtleRidable = getBoolean("mobs.turtle.ridable", turtleRidable); + turtleRidableInWater = getBoolean("mobs.turtle.ridable-in-water", turtleRidableInWater); +@@ -2546,6 +2663,7 @@ public class PurpurWorldConfig { turtleMaxHealth = getDouble("mobs.turtle.attributes.max_health", turtleMaxHealth); turtleBreedingTicks = getInt("mobs.turtle.breeding-delay-ticks", turtleBreedingTicks); turtleTakeDamageFromWater = getBoolean("mobs.turtle.takes-damage-from-water", turtleTakeDamageFromWater); + turtleAlwaysDropExp = getBoolean("mobs.turtle.always-drop-exp", turtleAlwaysDropExp); } + public boolean vexRidable = false; +@@ -2554,6 +2672,7 @@ public class PurpurWorldConfig { public double vexMaxY = 320D; public double vexMaxHealth = 14.0D; public boolean vexTakeDamageFromWater = false; + public boolean vexAlwaysDropExp = false; private void vexSettings() { - vexMaxY = getDouble("mobs.vex.ridable-max-y", vexMaxY); - if (PurpurConfig.version < 10) { -@@ -2127,6 +2246,7 @@ public class PurpurWorldConfig { + vexRidable = getBoolean("mobs.vex.ridable", vexRidable); + vexRidableInWater = getBoolean("mobs.vex.ridable-in-water", vexRidableInWater); +@@ -2566,6 +2685,7 @@ public class PurpurWorldConfig { } vexMaxHealth = getDouble("mobs.vex.attributes.max_health", vexMaxHealth); vexTakeDamageFromWater = getBoolean("mobs.vex.takes-damage-from-water", vexTakeDamageFromWater); + vexAlwaysDropExp = getBoolean("mobs.vex.always-drop-exp", vexAlwaysDropExp); } - public double villagerMaxHealth = 20.0D; -@@ -2137,6 +2257,7 @@ public class PurpurWorldConfig { + public boolean villagerRidable = false; +@@ -2579,6 +2699,7 @@ public class PurpurWorldConfig { public boolean villagerBypassMobGriefing = false; public boolean villagerTakeDamageFromWater = false; public boolean villagerAllowTrading = true; + public boolean villagerAlwaysDropExp = false; private void villagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.villager.attributes.max-health", villagerMaxHealth); -@@ -2151,11 +2272,13 @@ public class PurpurWorldConfig { + villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); + villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); +@@ -2596,6 +2717,7 @@ public class PurpurWorldConfig { villagerBypassMobGriefing = getBoolean("mobs.villager.bypass-mob-griefing", villagerBypassMobGriefing); villagerTakeDamageFromWater = getBoolean("mobs.villager.takes-damage-from-water", villagerTakeDamageFromWater); villagerAllowTrading = getBoolean("mobs.villager.allow-trading", villagerAllowTrading); + villagerAlwaysDropExp = getBoolean("mobs.villager.always-drop-exp", villagerAlwaysDropExp); } + public boolean vindicatorRidable = false; +@@ -2604,6 +2726,7 @@ public class PurpurWorldConfig { public double vindicatorMaxHealth = 24.0D; public double vindicatorJohnnySpawnChance = 0D; public boolean vindicatorTakeDamageFromWater = false; + public boolean vindicatorAlwaysDropExp = false; private void vindicatorSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.vindicator.attributes.max-health", vindicatorMaxHealth); -@@ -2165,6 +2288,7 @@ public class PurpurWorldConfig { + vindicatorRidable = getBoolean("mobs.vindicator.ridable", vindicatorRidable); + vindicatorRidableInWater = getBoolean("mobs.vindicator.ridable-in-water", vindicatorRidableInWater); +@@ -2616,6 +2739,7 @@ public class PurpurWorldConfig { vindicatorMaxHealth = getDouble("mobs.vindicator.attributes.max_health", vindicatorMaxHealth); vindicatorJohnnySpawnChance = getDouble("mobs.vindicator.johnny.spawn-chance", vindicatorJohnnySpawnChance); vindicatorTakeDamageFromWater = getBoolean("mobs.vindicator.takes-damage-from-water", vindicatorTakeDamageFromWater); + vindicatorAlwaysDropExp = getBoolean("mobs.vindicator.always-drop-exp", vindicatorAlwaysDropExp); } - public double wanderingTraderMaxHealth = 20.0D; -@@ -2172,6 +2296,7 @@ public class PurpurWorldConfig { + public boolean wanderingTraderRidable = false; +@@ -2626,6 +2750,7 @@ public class PurpurWorldConfig { public boolean wanderingTraderCanBeLeashed = false; public boolean wanderingTraderTakeDamageFromWater = false; public boolean wanderingTraderAllowTrading = true; + public boolean wanderingTraderAlwaysDropExp = false; private void wanderingTraderSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.wandering_trader.attributes.max-health", wanderingTraderMaxHealth); -@@ -2183,10 +2308,12 @@ public class PurpurWorldConfig { + wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); + wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); +@@ -2640,6 +2765,7 @@ public class PurpurWorldConfig { wanderingTraderCanBeLeashed = getBoolean("mobs.wandering_trader.can-be-leashed", wanderingTraderCanBeLeashed); wanderingTraderTakeDamageFromWater = getBoolean("mobs.wandering_trader.takes-damage-from-water", wanderingTraderTakeDamageFromWater); wanderingTraderAllowTrading = getBoolean("mobs.wandering_trader.allow-trading", wanderingTraderAllowTrading); + wanderingTraderAlwaysDropExp = getBoolean("mobs.wandering_trader.always-drop-exp", wanderingTraderAlwaysDropExp); } + public boolean wardenRidable = false; +@@ -2656,6 +2782,7 @@ public class PurpurWorldConfig { + public boolean witchControllable = true; public double witchMaxHealth = 26.0D; public boolean witchTakeDamageFromWater = false; + public boolean witchAlwaysDropExp = false; private void witchSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.witch.attributes.max-health", witchMaxHealth); -@@ -2195,6 +2322,7 @@ public class PurpurWorldConfig { + witchRidable = getBoolean("mobs.witch.ridable", witchRidable); + witchRidableInWater = getBoolean("mobs.witch.ridable-in-water", witchRidableInWater); +@@ -2667,6 +2794,7 @@ public class PurpurWorldConfig { } witchMaxHealth = getDouble("mobs.witch.attributes.max_health", witchMaxHealth); witchTakeDamageFromWater = getBoolean("mobs.witch.takes-damage-from-water", witchTakeDamageFromWater); + witchAlwaysDropExp = getBoolean("mobs.witch.always-drop-exp", witchAlwaysDropExp); } - public double witherMaxHealth = 300.0D; -@@ -2205,6 +2333,7 @@ public class PurpurWorldConfig { + public boolean witherRidable = false; +@@ -2681,6 +2809,7 @@ public class PurpurWorldConfig { public boolean witherCanRideVehicles = false; public float witherExplosionRadius = 1.0F; public boolean witherPlaySpawnSound = true; + public boolean witherAlwaysDropExp = false; private void witherSettings() { - if (PurpurConfig.version < 8) { - double oldValue = getDouble("mobs.wither.max-health", witherMaxHealth); -@@ -2223,10 +2352,12 @@ public class PurpurWorldConfig { + witherRidable = getBoolean("mobs.wither.ridable", witherRidable); + witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); +@@ -2703,6 +2832,7 @@ public class PurpurWorldConfig { witherCanRideVehicles = getBoolean("mobs.wither.can-ride-vehicles", witherCanRideVehicles); witherExplosionRadius = (float) getDouble("mobs.wither.explosion-radius", witherExplosionRadius); witherPlaySpawnSound = getBoolean("mobs.wither.play-spawn-sound", witherPlaySpawnSound); + witherAlwaysDropExp = getBoolean("mobs.wither.always-drop-exp", witherAlwaysDropExp); } + public boolean witherSkeletonRidable = false; +@@ -2710,6 +2840,7 @@ public class PurpurWorldConfig { + public boolean witherSkeletonControllable = true; public double witherSkeletonMaxHealth = 20.0D; public boolean witherSkeletonTakeDamageFromWater = false; + public boolean witherSkeletonAlwaysDropExp = false; private void witherSkeletonSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.wither_skeleton.attributes.max-health", witherSkeletonMaxHealth); -@@ -2235,6 +2366,7 @@ public class PurpurWorldConfig { + witherSkeletonRidable = getBoolean("mobs.wither_skeleton.ridable", witherSkeletonRidable); + witherSkeletonRidableInWater = getBoolean("mobs.wither_skeleton.ridable-in-water", witherSkeletonRidableInWater); +@@ -2721,6 +2852,7 @@ public class PurpurWorldConfig { } witherSkeletonMaxHealth = getDouble("mobs.wither_skeleton.attributes.max_health", witherSkeletonMaxHealth); witherSkeletonTakeDamageFromWater = getBoolean("mobs.wither_skeleton.takes-damage-from-water", witherSkeletonTakeDamageFromWater); + witherSkeletonAlwaysDropExp = getBoolean("mobs.wither_skeleton.always-drop-exp", witherSkeletonAlwaysDropExp); } - public double wolfMaxHealth = 8.0D; -@@ -2243,6 +2375,7 @@ public class PurpurWorldConfig { + public boolean wolfRidable = false; +@@ -2732,6 +2864,7 @@ public class PurpurWorldConfig { public double wolfNaturalRabid = 0.0D; public int wolfBreedingTicks = 6000; public boolean wolfTakeDamageFromWater = false; + public boolean wolfAlwaysDropExp = false; private void wolfSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.wolf.attributes.max-health", wolfMaxHealth); -@@ -2259,10 +2392,12 @@ public class PurpurWorldConfig { + wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); + wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater); +@@ -2751,6 +2884,7 @@ public class PurpurWorldConfig { wolfNaturalRabid = getDouble("mobs.wolf.spawn-rabid-chance", wolfNaturalRabid); wolfBreedingTicks = getInt("mobs.wolf.breeding-delay-ticks", wolfBreedingTicks); wolfTakeDamageFromWater = getBoolean("mobs.wolf.takes-damage-from-water", wolfTakeDamageFromWater); + wolfAlwaysDropExp = getBoolean("mobs.wolf.always-drop-exp", wolfAlwaysDropExp); } + public boolean zoglinRidable = false; +@@ -2758,6 +2892,7 @@ public class PurpurWorldConfig { + public boolean zoglinControllable = true; public double zoglinMaxHealth = 40.0D; public boolean zoglinTakeDamageFromWater = false; + public boolean zoglinAlwaysDropExp = false; private void zoglinSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.zoglin.attributes.max-health", zoglinMaxHealth); -@@ -2271,6 +2406,7 @@ public class PurpurWorldConfig { + zoglinRidable = getBoolean("mobs.zoglin.ridable", zoglinRidable); + zoglinRidableInWater = getBoolean("mobs.zoglin.ridable-in-water", zoglinRidableInWater); +@@ -2769,6 +2904,7 @@ public class PurpurWorldConfig { } zoglinMaxHealth = getDouble("mobs.zoglin.attributes.max_health", zoglinMaxHealth); zoglinTakeDamageFromWater = getBoolean("mobs.zoglin.takes-damage-from-water", zoglinTakeDamageFromWater); + zoglinAlwaysDropExp = getBoolean("mobs.zoglin.always-drop-exp", zoglinAlwaysDropExp); } - public double zombieMaxHealth = 20.0D; -@@ -2281,6 +2417,7 @@ public class PurpurWorldConfig { + public boolean zombieRidable = false; +@@ -2782,6 +2918,7 @@ public class PurpurWorldConfig { public boolean zombieAggressiveTowardsVillagerWhenLagging = true; public boolean zombieBypassMobGriefing = false; public boolean zombieTakeDamageFromWater = false; + public boolean zombieAlwaysDropExp = false; private void zombieSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.zombie.attributes.max-health", zombieMaxHealth); -@@ -2295,6 +2432,7 @@ public class PurpurWorldConfig { + zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); + zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); +@@ -2799,6 +2936,7 @@ public class PurpurWorldConfig { zombieAggressiveTowardsVillagerWhenLagging = getBoolean("mobs.zombie.aggressive-towards-villager-when-lagging", zombieAggressiveTowardsVillagerWhenLagging); zombieBypassMobGriefing = getBoolean("mobs.zombie.bypass-mob-griefing", zombieBypassMobGriefing); zombieTakeDamageFromWater = getBoolean("mobs.zombie.takes-damage-from-water", zombieTakeDamageFromWater); + zombieAlwaysDropExp = getBoolean("mobs.zombie.always-drop-exp", zombieAlwaysDropExp); } - public double zombieHorseMaxHealthMin = 15.0D; -@@ -2305,6 +2443,7 @@ public class PurpurWorldConfig { + public boolean zombieHorseRidableInWater = false; +@@ -2813,6 +2951,7 @@ public class PurpurWorldConfig { public double zombieHorseMovementSpeedMax = 0.2D; public double zombieHorseSpawnChance = 0.0D; public boolean zombieHorseTakeDamageFromWater = false; + public boolean zombieHorseAlwaysDropExp = false; private void zombieHorseSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.zombie_horse.attributes.max-health", zombieHorseMaxHealthMin); -@@ -2320,6 +2459,7 @@ public class PurpurWorldConfig { + zombieHorseRidableInWater = getBoolean("mobs.zombie_horse.ridable-in-water", zombieHorseRidableInWater); + zombieHorseCanSwim = getBoolean("mobs.zombie_horse.can-swim", zombieHorseCanSwim); +@@ -2832,6 +2971,7 @@ public class PurpurWorldConfig { zombieHorseMovementSpeedMax = getDouble("mobs.zombie_horse.attributes.movement_speed.max", zombieHorseMovementSpeedMax); zombieHorseSpawnChance = getDouble("mobs.zombie_horse.spawn-chance", zombieHorseSpawnChance); zombieHorseTakeDamageFromWater = getBoolean("mobs.zombie_horse.takes-damage-from-water", zombieHorseTakeDamageFromWater); + zombieHorseAlwaysDropExp = getBoolean("mobs.zombie_horse.always-drop-exp", zombieHorseAlwaysDropExp); } - public double zombieVillagerMaxHealth = 20.0D; -@@ -2331,6 +2471,7 @@ public class PurpurWorldConfig { + public boolean zombieVillagerRidable = false; +@@ -2844,6 +2984,7 @@ public class PurpurWorldConfig { public int zombieVillagerCuringTimeMin = 3600; public int zombieVillagerCuringTimeMax = 6000; public boolean zombieVillagerCureEnabled = true; + public boolean zombieVillagerAlwaysDropExp = false; private void zombieVillagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.zombie_villager.attributes.max-health", zombieVillagerMaxHealth); -@@ -2346,6 +2487,7 @@ public class PurpurWorldConfig { + zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); + zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); +@@ -2855,6 +2996,7 @@ public class PurpurWorldConfig { zombieVillagerCuringTimeMin = getInt("mobs.zombie_villager.curing_time.min", zombieVillagerCuringTimeMin); zombieVillagerCuringTimeMax = getInt("mobs.zombie_villager.curing_time.max", zombieVillagerCuringTimeMax); zombieVillagerCureEnabled = getBoolean("mobs.zombie_villager.cure.enabled", zombieVillagerCureEnabled); + zombieVillagerAlwaysDropExp = getBoolean("mobs.zombie_villager.always-drop-exp", zombieVillagerAlwaysDropExp); } - public double zombifiedPiglinMaxHealth = 20.0D; -@@ -2355,6 +2497,7 @@ public class PurpurWorldConfig { + public boolean zombifiedPiglinRidable = false; +@@ -2867,6 +3009,7 @@ public class PurpurWorldConfig { public boolean zombifiedPiglinJockeyTryExistingChickens = true; public boolean zombifiedPiglinCountAsPlayerKillWhenAngry = true; public boolean zombifiedPiglinTakeDamageFromWater = false; + public boolean zombifiedPiglinAlwaysDropExp = false; private void zombifiedPiglinSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.zombified_piglin.attributes.max-health", zombifiedPiglinMaxHealth); -@@ -2368,6 +2511,7 @@ public class PurpurWorldConfig { + zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); + zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); +@@ -2883,6 +3026,7 @@ public class PurpurWorldConfig { zombifiedPiglinJockeyTryExistingChickens = getBoolean("mobs.zombified_piglin.jockey.try-existing-chickens", zombifiedPiglinJockeyTryExistingChickens); zombifiedPiglinCountAsPlayerKillWhenAngry = getBoolean("mobs.zombified_piglin.count-as-player-kill-when-angry", zombifiedPiglinCountAsPlayerKillWhenAngry); zombifiedPiglinTakeDamageFromWater = getBoolean("mobs.zombified_piglin.takes-damage-from-water", zombifiedPiglinTakeDamageFromWater); + zombifiedPiglinAlwaysDropExp = getBoolean("mobs.zombified_piglin.always-drop-exp", zombifiedPiglinAlwaysDropExp); } + } - public float hungerStarvationDamage = 1.0F; diff --git a/patches/server/0228-Shearing-jeb-produces-random-color-wool.patch b/patches/server/0228-Shearing-jeb-produces-random-color-wool.patch index 266c88b68..7830ba89b 100644 --- a/patches/server/0228-Shearing-jeb-produces-random-color-wool.patch +++ b/patches/server/0228-Shearing-jeb-produces-random-color-wool.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Shearing jeb produces random color wool diff --git a/src/main/java/net/minecraft/world/entity/animal/Sheep.java b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -index 8c6aa82746720f6cc404531a94a02b52bc42278b..5d7f86140a9c5475e450026d0b7bddc5e049f6d4 100644 +index a1b323ecba25910e97f154e487acc94943117e0c..f3d17ace7273c0678870d6730a1986175642c03a 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java +++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java @@ -315,7 +315,7 @@ public class Sheep extends Animal implements Shearable { @@ -13,27 +13,27 @@ index 8c6aa82746720f6cc404531a94a02b52bc42278b..5d7f86140a9c5475e450026d0b7bddc5 for (int j = 0; j < i; ++j) { this.forceDrops = true; // CraftBukkit - ItemEntity entityitem = this.spawnAtLocation((ItemLike) Sheep.ITEM_BY_DYE.get(this.getColor()), 1); -+ ItemEntity entityitem = this.spawnAtLocation((ItemLike) Sheep.ITEM_BY_DYE.get(this.level.purpurConfig.sheepShearJebRandomColor && hasCustomName() && getCustomName().getString().equals("jeb_") ? DyeColor.random(this.level.random) : this.getColor()), 1); // Purpur ++ ItemEntity entityitem = this.spawnAtLocation((ItemLike) Sheep.ITEM_BY_DYE.get(this.level().purpurConfig.sheepShearJebRandomColor && hasCustomName() && getCustomName().getString().equals("jeb_") ? DyeColor.random(this.level.random) : this.getColor()), 1); // Purpur this.forceDrops = false; // CraftBukkit if (entityitem != null) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 2e3f957d2c056ce1b43e8b2b39e0eaece3d6da9b..73ea4baa63a9c0b9d1eff81a701cb52534bdf972 100644 +index 4f50b9d2fb35502fd1a787e547cab4cb88142438..b49b6b2558d18565d5a222360c7865a09c1ab026 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1962,6 +1962,7 @@ public class PurpurWorldConfig { +@@ -2305,6 +2305,7 @@ public class PurpurWorldConfig { public boolean sheepBypassMobGriefing = false; public boolean sheepTakeDamageFromWater = false; public boolean sheepAlwaysDropExp = false; + public boolean sheepShearJebRandomColor = false; private void sheepSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.sheep.attributes.max-health", sheepMaxHealth); -@@ -1973,6 +1974,7 @@ public class PurpurWorldConfig { + sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); + sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); +@@ -2319,6 +2320,7 @@ public class PurpurWorldConfig { sheepBypassMobGriefing = getBoolean("mobs.sheep.bypass-mob-griefing", sheepBypassMobGriefing); sheepTakeDamageFromWater = getBoolean("mobs.sheep.takes-damage-from-water", sheepTakeDamageFromWater); sheepAlwaysDropExp = getBoolean("mobs.sheep.always-drop-exp", sheepAlwaysDropExp); + sheepShearJebRandomColor = getBoolean("mobs.sheep.jeb-shear-random-color", sheepShearJebRandomColor); } - public double shulkerMaxHealth = 30.0D; + public boolean shulkerRidable = false; diff --git a/patches/server/0229-Turtle-eggs-random-tick-crack-chance.patch b/patches/server/0229-Turtle-eggs-random-tick-crack-chance.patch index ba66efc46..434b1c5d0 100644 --- a/patches/server/0229-Turtle-eggs-random-tick-crack-chance.patch +++ b/patches/server/0229-Turtle-eggs-random-tick-crack-chance.patch @@ -18,7 +18,7 @@ index 7495e0e8beedad59fff24ebf189b58b307f7d796..70997b83fd7631ebf3c5bda67ef77bef @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 73ea4baa63a9c0b9d1eff81a701cb52534bdf972..c6d6e863c1626aa3eece4959f64d70bb0f701027 100644 +index b49b6b2558d18565d5a222360c7865a09c1ab026..a054dd54797af8190b09d2d9975edbf323496dd8 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -991,11 +991,13 @@ public class PurpurWorldConfig { @@ -34,4 +34,4 @@ index 73ea4baa63a9c0b9d1eff81a701cb52534bdf972..c6d6e863c1626aa3eece4959f64d70bb + turtleEggsRandomTickCrackChance = getInt("blocks.turtle_egg.random-tick-crack-chance", turtleEggsRandomTickCrackChance); } - public double axolotlMaxHealth = 14.0D; + public float hungerStarvationDamage = 1.0F; diff --git a/patches/server/0230-Mob-head-visibility-percent.patch b/patches/server/0230-Mob-head-visibility-percent.patch index cd8084aeb..70d4df726 100644 --- a/patches/server/0230-Mob-head-visibility-percent.patch +++ b/patches/server/0230-Mob-head-visibility-percent.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Mob head visibility percent diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 1bb1be688326d79c34b589bd859f21c2d43c53b8..576d29c30d089b7cbdae6a3eb9aad0ca23e847eb 100644 +index 7a35d45f8449a8399cb417357f0f0a6419bfbe3a..39ee6fbc6ce17b61abf88deba69b0adecb294417 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -1042,9 +1042,20 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -16,86 +16,86 @@ index 1bb1be688326d79c34b589bd859f21c2d43c53b8..576d29c30d089b7cbdae6a3eb9aad0ca - d0 *= 0.5D; + // Purpur start + if (entitytypes == EntityType.SKELETON && itemstack.is(Items.SKELETON_SKULL)) { -+ d0 *= entity.level.purpurConfig.skeletonHeadVisibilityPercent; ++ d0 *= entity.level().purpurConfig.skeletonHeadVisibilityPercent; + } + else if (entitytypes == EntityType.ZOMBIE && itemstack.is(Items.ZOMBIE_HEAD)) { -+ d0 *= entity.level.purpurConfig.zombieHeadVisibilityPercent; ++ d0 *= entity.level().purpurConfig.zombieHeadVisibilityPercent; + } + else if (entitytypes == EntityType.CREEPER && itemstack.is(Items.CREEPER_HEAD)) { -+ d0 *= entity.level.purpurConfig.creeperHeadVisibilityPercent; ++ d0 *= entity.level().purpurConfig.creeperHeadVisibilityPercent; } + else if ((entitytypes == EntityType.PIGLIN || entitytypes == EntityType.PIGLIN_BRUTE) && itemstack.is(Items.PIGLIN_HEAD)) { -+ d0 *= entity.level.purpurConfig.piglinHeadVisibilityPercent; ++ d0 *= entity.level().purpurConfig.piglinHeadVisibilityPercent; + } + // Purpur end // Purpur start if (entity instanceof LivingEntity entityliving) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index c6d6e863c1626aa3eece4959f64d70bb0f701027..b1c20a1cf47a119bbe6b934d2c54cbaf143073c7 100644 +index a054dd54797af8190b09d2d9975edbf323496dd8..8ae28ced1d88e3b7ad3656a1389d9e9994992823 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1199,6 +1199,7 @@ public class PurpurWorldConfig { +@@ -1300,6 +1300,7 @@ public class PurpurWorldConfig { public boolean creeperExplodeWhenKilled = false; public boolean creeperHealthRadius = false; public boolean creeperAlwaysDropExp = false; + public double creeperHeadVisibilityPercent = 0.5D; private void creeperSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.creeper.attributes.max-health", creeperMaxHealth); -@@ -1213,6 +1214,7 @@ public class PurpurWorldConfig { + creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); + creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); +@@ -1317,6 +1318,7 @@ public class PurpurWorldConfig { creeperExplodeWhenKilled = getBoolean("mobs.creeper.explode-when-killed", creeperExplodeWhenKilled); creeperHealthRadius = getBoolean("mobs.creeper.health-impacts-explosion", creeperHealthRadius); creeperAlwaysDropExp = getBoolean("mobs.creeper.always-drop-exp", creeperAlwaysDropExp); + creeperHeadVisibilityPercent = getDouble("mobs.creeper.head-visibility-percent", creeperHeadVisibilityPercent); } - public double dolphinMaxHealth = 10.0D; -@@ -1811,6 +1813,7 @@ public class PurpurWorldConfig { + public boolean dolphinRidable = false; +@@ -2110,6 +2112,7 @@ public class PurpurWorldConfig { public boolean piglinTakeDamageFromWater = false; public int piglinPortalSpawnModifier = 2000; public boolean piglinAlwaysDropExp = false; + public double piglinHeadVisibilityPercent = 0.5D; private void piglinSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.piglin.attributes.max-health", piglinMaxHealth); -@@ -1822,6 +1825,7 @@ public class PurpurWorldConfig { + piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); + piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); +@@ -2124,6 +2127,7 @@ public class PurpurWorldConfig { piglinTakeDamageFromWater = getBoolean("mobs.piglin.takes-damage-from-water", piglinTakeDamageFromWater); piglinPortalSpawnModifier = getInt("mobs.piglin.portal-spawn-modifier", piglinPortalSpawnModifier); piglinAlwaysDropExp = getBoolean("mobs.piglin.always-drop-exp", piglinAlwaysDropExp); + piglinHeadVisibilityPercent = getDouble("mobs.piglin.head-visibility-percent", piglinHeadVisibilityPercent); } - public double piglinBruteMaxHealth = 50.0D; -@@ -2024,6 +2028,7 @@ public class PurpurWorldConfig { + public boolean piglinBruteRidable = false; +@@ -2385,6 +2389,7 @@ public class PurpurWorldConfig { public double skeletonMaxHealth = 20.0D; public boolean skeletonTakeDamageFromWater = false; public boolean skeletonAlwaysDropExp = false; + public double skeletonHeadVisibilityPercent = 0.5D; private void skeletonSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.skeleton.attributes.max-health", skeletonMaxHealth); -@@ -2033,6 +2038,7 @@ public class PurpurWorldConfig { + skeletonRidable = getBoolean("mobs.skeleton.ridable", skeletonRidable); + skeletonRidableInWater = getBoolean("mobs.skeleton.ridable-in-water", skeletonRidableInWater); +@@ -2397,6 +2402,7 @@ public class PurpurWorldConfig { skeletonMaxHealth = getDouble("mobs.skeleton.attributes.max_health", skeletonMaxHealth); skeletonTakeDamageFromWater = getBoolean("mobs.skeleton.takes-damage-from-water", skeletonTakeDamageFromWater); skeletonAlwaysDropExp = getBoolean("mobs.skeleton.always-drop-exp", skeletonAlwaysDropExp); + skeletonHeadVisibilityPercent = getDouble("mobs.skeleton.head-visibility-percent", skeletonHeadVisibilityPercent); } - public double skeletonHorseMaxHealthMin = 15.0D; -@@ -2426,6 +2432,7 @@ public class PurpurWorldConfig { + public boolean skeletonHorseRidableInWater = true; +@@ -2927,6 +2933,7 @@ public class PurpurWorldConfig { public boolean zombieBypassMobGriefing = false; public boolean zombieTakeDamageFromWater = false; public boolean zombieAlwaysDropExp = false; + public double zombieHeadVisibilityPercent = 0.5D; private void zombieSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.zombie.attributes.max-health", zombieMaxHealth); -@@ -2441,6 +2448,7 @@ public class PurpurWorldConfig { + zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); + zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); +@@ -2945,6 +2952,7 @@ public class PurpurWorldConfig { zombieBypassMobGriefing = getBoolean("mobs.zombie.bypass-mob-griefing", zombieBypassMobGriefing); zombieTakeDamageFromWater = getBoolean("mobs.zombie.takes-damage-from-water", zombieTakeDamageFromWater); zombieAlwaysDropExp = getBoolean("mobs.zombie.always-drop-exp", zombieAlwaysDropExp); + zombieHeadVisibilityPercent = getDouble("mobs.zombie.head-visibility-percent", zombieHeadVisibilityPercent); } - public double zombieHorseMaxHealthMin = 15.0D; + public boolean zombieHorseRidableInWater = false; diff --git a/patches/server/0233-Stop-bees-from-dying-after-stinging.patch b/patches/server/0233-Stop-bees-from-dying-after-stinging.patch index d7c2f2e9f..ef16e22c0 100644 --- a/patches/server/0233-Stop-bees-from-dying-after-stinging.patch +++ b/patches/server/0233-Stop-bees-from-dying-after-stinging.patch @@ -5,34 +5,34 @@ Subject: [PATCH] Stop bees from dying after stinging 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 521cad59e394901e16d178c46e10d186eb3fdefd..ca977a8f3d3e7925b3abc78d2dd1a7f57771eee8 100644 +index fad2da0ba194d349de73777a7ab43bb6447298e7..2afe5a4f3abaa3f9883b13fa3895e1e15ed68d3a 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java @@ -434,6 +434,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { this.hurt(this.damageSources().drown(), 1.0F); } -+ if (flag && !this.level.purpurConfig.beeDiesAfterSting) setHasStung(false); else // Purpur ++ if (flag && !this.level().purpurConfig.beeDiesAfterSting) setHasStung(false); else // Purpur if (flag) { ++this.timeSinceSting; if (this.timeSinceSting % 5 == 0 && this.random.nextInt(Mth.clamp(1200 - this.timeSinceSting, 1, 1200)) == 0) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b1c20a1cf47a119bbe6b934d2c54cbaf143073c7..2bc13a187d743695e75ed617e9d8f01d6c6c0941 100644 +index 8ae28ced1d88e3b7ad3656a1389d9e9994992823..2ce03717081c92b79573b0252750a06f60cb030c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1045,6 +1045,7 @@ public class PurpurWorldConfig { +@@ -1120,6 +1120,7 @@ public class PurpurWorldConfig { public boolean beeCanWorkAtNight = false; public boolean beeCanWorkInRain = false; public boolean beeAlwaysDropExp = false; + public boolean beeDiesAfterSting = true; private void beeSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.bee.attributes.max-health", beeMaxHealth); -@@ -1057,6 +1058,7 @@ public class PurpurWorldConfig { + beeRidable = getBoolean("mobs.bee.ridable", beeRidable); + beeRidableInWater = getBoolean("mobs.bee.ridable-in-water", beeRidableInWater); +@@ -1136,6 +1137,7 @@ public class PurpurWorldConfig { beeCanWorkAtNight = getBoolean("mobs.bee.can-work-at-night", beeCanWorkAtNight); beeCanWorkInRain = getBoolean("mobs.bee.can-work-in-rain", beeCanWorkInRain); beeAlwaysDropExp = getBoolean("mobs.bee.always-drop-exp", beeAlwaysDropExp); + beeDiesAfterSting = getBoolean("mobs.bee.dies-after-sting", beeDiesAfterSting); } - public double blazeMaxHealth = 20.0D; + public boolean blazeRidable = false; diff --git a/patches/server/0236-Configurable-player-pickup-exp-delay.patch b/patches/server/0236-Configurable-player-pickup-exp-delay.patch index b3327a75e..81c8b7d42 100644 --- a/patches/server/0236-Configurable-player-pickup-exp-delay.patch +++ b/patches/server/0236-Configurable-player-pickup-exp-delay.patch @@ -9,7 +9,7 @@ players still only pick up one orb every tick. However, setting this to any negative number will pick up all orbs instantly. diff --git a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java -index 9b122ea4a76a136719aac9910e229306128d382e..4746dcb444f0c1b0801cd1805b7fcd3612f5ad85 100644 +index 45af026f572a67061ce63229913366f719cf0a5f..7ccf214d376771814b27aa8e1f34d5a73f1b61f5 100644 --- a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java +++ b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java @@ -311,7 +311,7 @@ public class ExperienceOrb extends Entity { @@ -17,12 +17,12 @@ index 9b122ea4a76a136719aac9910e229306128d382e..4746dcb444f0c1b0801cd1805b7fcd36 if (!this.level().isClientSide) { if (player.takeXpDelay == 0 && new com.destroystokyo.paper.event.player.PlayerPickupExperienceEvent(((net.minecraft.server.level.ServerPlayer) player).getBukkitEntity(), (org.bukkit.entity.ExperienceOrb) this.getBukkitEntity()).callEvent()) { // Paper - player.takeXpDelay = CraftEventFactory.callPlayerXpCooldownEvent(player, 2, PlayerExpCooldownChangeEvent.ChangeReason.PICKUP_ORB).getNewCooldown(); // CraftBukkit - entityhuman.takeXpDelay = 2; -+ player.takeXpDelay = CraftEventFactory.callPlayerXpCooldownEvent(player, this.level.purpurConfig.playerExpPickupDelay, PlayerExpCooldownChangeEvent.ChangeReason.PICKUP_ORB).getNewCooldown(); // CraftBukkit - entityhuman.takeXpDelay = 2; // Purpur ++ player.takeXpDelay = CraftEventFactory.callPlayerXpCooldownEvent(player, this.level().purpurConfig.playerExpPickupDelay, PlayerExpCooldownChangeEvent.ChangeReason.PICKUP_ORB).getNewCooldown(); // CraftBukkit - entityhuman.takeXpDelay = 2; // Purpur player.take(this, 1); int i = this.repairPlayerItems(player, this.value); diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index ddb36e630c1f1b71c44c31e940c0845ecae14c0b..0eadd47aae59f7f055737df81054e38d4b47f5d4 100644 +index 3661f60cf1be5ecbd5a8a3f07553f2b42b52a4f0..15701784129616a9b27bbaac893eacda1717e1d4 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java @@ -630,7 +630,7 @@ public abstract class Player extends LivingEntity { @@ -30,12 +30,12 @@ index ddb36e630c1f1b71c44c31e940c0845ecae14c0b..0eadd47aae59f7f055737df81054e38d Entity entity = (Entity) list.get(i); - if (entity.getType() == EntityType.EXPERIENCE_ORB) { -+ if (entity.getType() == EntityType.EXPERIENCE_ORB && entity.level.purpurConfig.playerExpPickupDelay >= 0) { // Purpur ++ if (entity.getType() == EntityType.EXPERIENCE_ORB && entity.level().purpurConfig.playerExpPickupDelay >= 0) { // Purpur list1.add(entity); } else if (!entity.isRemoved()) { this.touch(entity); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d14862d6a927623a06baf61da3d1eabdde65c23c..c1c944e378442037b8c45e7510f016304b01a8c5 100644 +index 1a23e1a3141ae673740d90ea1ff9a4c85639f54a..bd944329f58960839e54c742b69a9f89bf219512 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -430,6 +430,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0237-Allow-void-trading.patch b/patches/server/0237-Allow-void-trading.patch index 34e3292c0..75ed2afda 100644 --- a/patches/server/0237-Allow-void-trading.patch +++ b/patches/server/0237-Allow-void-trading.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Allow void trading diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index d48132f978a4395e489b3ba21f634f19790134b3..e748a3ce076865ce13431c04ba78f4c9735806b1 100644 +index d48132f978a4395e489b3ba21f634f19790134b3..c490c88fd7798c0ac186b1de22a0dfc433adc431 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -2740,7 +2740,7 @@ public class ServerLevel extends Level implements WorldGenLevel { @@ -13,12 +13,12 @@ index d48132f978a4395e489b3ba21f634f19790134b3..e748a3ce076865ce13431c04ba78f4c9 if (entity.getBukkitEntity() instanceof org.bukkit.inventory.InventoryHolder && (!(entity instanceof ServerPlayer) || entity.getRemovalReason() != Entity.RemovalReason.KILLED)) { // SPIGOT-6876: closeInventory clears death message // Paper start - if (entity.getBukkitEntity() instanceof org.bukkit.inventory.Merchant merchant && merchant.getTrader() != null) { -+ if (!entity.level.purpurConfig.playerVoidTrading && entity.getBukkitEntity() instanceof org.bukkit.inventory.Merchant merchant && merchant.getTrader() != null) { // Purpur ++ if (!entity.level().purpurConfig.playerVoidTrading && entity.getBukkitEntity() instanceof org.bukkit.inventory.Merchant merchant && merchant.getTrader() != null) { // Purpur merchant.getTrader().closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.UNLOADED); } // Paper end diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index c1c944e378442037b8c45e7510f016304b01a8c5..b32679b7bfa1e10839b0cda6d81ae8c65ec51d32 100644 +index bd944329f58960839e54c742b69a9f89bf219512..244e2a1a9fbbc7fc6116df5cdfb81f9f9dc93384 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -431,6 +431,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0239-Configurable-phantom-size.patch b/patches/server/0239-Configurable-phantom-size.patch index e5e903d88..04754bb00 100644 --- a/patches/server/0239-Configurable-phantom-size.patch +++ b/patches/server/0239-Configurable-phantom-size.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configurable phantom size diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -index 4c4b8b3f656cfb5cb084a456076f1b0061711970..31bee2b6a18dd90448f212ab00ffa363c5666a3f 100644 +index d6eda14f1735a8d8a6b7aa1afb6afeff4397fb1b..06b08e31e97855de8784a96f4268dd4654242a2c 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java @@ -247,7 +247,11 @@ public class Phantom extends FlyingMob implements Enemy { @@ -22,19 +22,19 @@ index 4c4b8b3f656cfb5cb084a456076f1b0061711970..31bee2b6a18dd90448f212ab00ffa363 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b32679b7bfa1e10839b0cda6d81ae8c65ec51d32..c5cf65e0c90188dda629056e897e589cd760c6b8 100644 +index 244e2a1a9fbbc7fc6116df5cdfb81f9f9dc93384..31c1f60c2bcb3203a32b4999428d92882ea80246 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1770,6 +1770,8 @@ public class PurpurWorldConfig { +@@ -2053,6 +2053,8 @@ public class PurpurWorldConfig { public boolean phantomFlamesOnSwoop = false; public boolean phantomTakeDamageFromWater = false; public boolean phantomAlwaysDropExp = false; + public int phantomMinSize = 0; + public int phantomMaxSize = 0; private void phantomSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.phantom.attributes.max-health", Double.parseDouble(phantomMaxHealth)); -@@ -1796,6 +1798,13 @@ public class PurpurWorldConfig { + phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); + phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); +@@ -2086,6 +2088,13 @@ public class PurpurWorldConfig { phantomFlamesOnSwoop = getBoolean("mobs.phantom.flames-on-swoop", phantomFlamesOnSwoop); phantomTakeDamageFromWater = getBoolean("mobs.phantom.takes-damage-from-water", phantomTakeDamageFromWater); phantomAlwaysDropExp = getBoolean("mobs.phantom.always-drop-exp", phantomAlwaysDropExp); @@ -47,4 +47,4 @@ index b32679b7bfa1e10839b0cda6d81ae8c65ec51d32..c5cf65e0c90188dda629056e897e589c + } } - public double pigMaxHealth = 10.0D; + public boolean pigRidable = false; diff --git a/patches/server/0242-Configurable-minimum-demand-for-trades.patch b/patches/server/0242-Configurable-minimum-demand-for-trades.patch index f74f3bfe2..cc7fd04ce 100644 --- a/patches/server/0242-Configurable-minimum-demand-for-trades.patch +++ b/patches/server/0242-Configurable-minimum-demand-for-trades.patch @@ -9,7 +9,7 @@ This patch adds a config option to allow the minimum demand to instead be configurable. diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 21f50d2216399837fb144608950adbfdc00a498b..e520fbbf781d05537a0cbc0025f4cda7f62a1c5f 100644 +index 00a62f48961f6909488b040d75457633d47809ec..64f7de2f79ec21a25994d827a8266f731e514d09 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java @@ -539,7 +539,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @@ -17,7 +17,7 @@ index 21f50d2216399837fb144608950adbfdc00a498b..e520fbbf781d05537a0cbc0025f4cda7 MerchantOffer merchantrecipe = (MerchantOffer) iterator.next(); - merchantrecipe.updateDemand(); -+ merchantrecipe.updateDemand(this.level.purpurConfig.villagerMinimumDemand); // Purpur ++ merchantrecipe.updateDemand(this.level().purpurConfig.villagerMinimumDemand); // Purpur } } @@ -40,22 +40,22 @@ index 28bdcb14cb5b458d3c990fcf343ef97f08e4f3c6..48167334162443365bb8a6d082a51b2c public ItemStack assemble() { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index c5cf65e0c90188dda629056e897e589cd760c6b8..27b5d3f48db08721de0056d3b7b5d2f1cbe708fc 100644 +index 31c1f60c2bcb3203a32b4999428d92882ea80246..ed8586f428f93f2cbf0f382fa1a94bb4b7bc6a41 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2289,6 +2289,7 @@ public class PurpurWorldConfig { +@@ -2731,6 +2731,7 @@ public class PurpurWorldConfig { public boolean villagerTakeDamageFromWater = false; public boolean villagerAllowTrading = true; public boolean villagerAlwaysDropExp = false; + public int villagerMinimumDemand = 0; private void villagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.villager.attributes.max-health", villagerMaxHealth); -@@ -2304,6 +2305,7 @@ public class PurpurWorldConfig { + villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); + villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); +@@ -2749,6 +2750,7 @@ public class PurpurWorldConfig { villagerTakeDamageFromWater = getBoolean("mobs.villager.takes-damage-from-water", villagerTakeDamageFromWater); villagerAllowTrading = getBoolean("mobs.villager.allow-trading", villagerAllowTrading); villagerAlwaysDropExp = getBoolean("mobs.villager.always-drop-exp", villagerAlwaysDropExp); + villagerMinimumDemand = getInt("mobs.villager.minimum-demand", villagerMinimumDemand); } - public double vindicatorMaxHealth = 24.0D; + public boolean vindicatorRidable = false; diff --git a/patches/server/0243-Lobotomize-stuck-villagers.patch b/patches/server/0243-Lobotomize-stuck-villagers.patch index 532b3cbc4..56c94fcdb 100644 --- a/patches/server/0243-Lobotomize-stuck-villagers.patch +++ b/patches/server/0243-Lobotomize-stuck-villagers.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Lobotomize stuck villagers diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index e520fbbf781d05537a0cbc0025f4cda7f62a1c5f..6e5dd65d3410b805168d6fbfc2705af6cae3c421 100644 +index 64f7de2f79ec21a25994d827a8266f731e514d09..ae582a9a89846fe9d3a04d215e40129805cc4f2a 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java @@ -140,6 +140,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @@ -18,7 +18,7 @@ index e520fbbf781d05537a0cbc0025f4cda7f62a1c5f..6e5dd65d3410b805168d6fbfc2705af6 public Villager(EntityType entityType, Level world) { this(entityType, world, VillagerType.PLAINS); @@ -197,6 +199,47 @@ public class Villager extends AbstractVillager implements ReputationEventHandler - return this.level.purpurConfig.villagerAlwaysDropExp; + return this.level().purpurConfig.villagerAlwaysDropExp; } + private boolean checkLobotomized() { @@ -105,19 +105,19 @@ index e986767316a717bdbdff7a9ccaaeba068ab2a6d8..4d0b37957eb02b5d48beb76295ebc7c4 + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 27b5d3f48db08721de0056d3b7b5d2f1cbe708fc..b6d0438a8a135e38a4c3284e71f6d324ca42291c 100644 +index ed8586f428f93f2cbf0f382fa1a94bb4b7bc6a41..72f4a0fb9aa44190ae24c383b26724eaed1e7c67 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2290,6 +2290,8 @@ public class PurpurWorldConfig { +@@ -2732,6 +2732,8 @@ public class PurpurWorldConfig { public boolean villagerAllowTrading = true; public boolean villagerAlwaysDropExp = false; public int villagerMinimumDemand = 0; + public boolean villagerLobotomizeEnabled = false; + public int villagerLobotomizeCheckInterval = 100; private void villagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.villager.attributes.max-health", villagerMaxHealth); -@@ -2306,6 +2308,17 @@ public class PurpurWorldConfig { + villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); + villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); +@@ -2751,6 +2753,17 @@ public class PurpurWorldConfig { villagerAllowTrading = getBoolean("mobs.villager.allow-trading", villagerAllowTrading); villagerAlwaysDropExp = getBoolean("mobs.villager.always-drop-exp", villagerAlwaysDropExp); villagerMinimumDemand = getInt("mobs.villager.minimum-demand", villagerMinimumDemand); @@ -134,4 +134,4 @@ index 27b5d3f48db08721de0056d3b7b5d2f1cbe708fc..b6d0438a8a135e38a4c3284e71f6d324 + villagerLobotomizeCheckInterval = getInt("mobs.villager.lobotomize.check-interval", villagerLobotomizeCheckInterval); } - public double vindicatorMaxHealth = 24.0D; + public boolean vindicatorRidable = false; diff --git a/patches/server/0244-Option-for-villager-display-trade-item.patch b/patches/server/0244-Option-for-villager-display-trade-item.patch index 93f94d732..71bba69a3 100644 --- a/patches/server/0244-Option-for-villager-display-trade-item.patch +++ b/patches/server/0244-Option-for-villager-display-trade-item.patch @@ -5,34 +5,34 @@ Subject: [PATCH] Option for villager display trade item diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/ShowTradesToPlayer.java b/src/main/java/net/minecraft/world/entity/ai/behavior/ShowTradesToPlayer.java -index 050be72c815010bf3f4b72427e2052b00420e8ee..5a461afd35b3a88d5717a26874c7732a4ec5027e 100644 +index 050be72c815010bf3f4b72427e2052b00420e8ee..8a213205f57c8dcd2226d7194d74b1b13dec5a78 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/ShowTradesToPlayer.java +++ b/src/main/java/net/minecraft/world/entity/ai/behavior/ShowTradesToPlayer.java @@ -42,6 +42,7 @@ public class ShowTradesToPlayer extends Behavior { @Override public boolean canStillUse(ServerLevel world, Villager entity, long time) { -+ if (!entity.level.purpurConfig.villagerDisplayTradeItem) return false; // Purpur ++ if (!entity.level().purpurConfig.villagerDisplayTradeItem) return false; // Purpur return this.checkExtraStartConditions(world, entity) && this.lookTime > 0 && entity.getBrain().getMemory(MemoryModuleType.INTERACTION_TARGET).isPresent(); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b6d0438a8a135e38a4c3284e71f6d324ca42291c..39e72f264a9efc5979f0202aff18c7bf6c794e03 100644 +index 72f4a0fb9aa44190ae24c383b26724eaed1e7c67..0c54e4808b5e18d7dcba98af938aa17cb8e47f24 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2292,6 +2292,7 @@ public class PurpurWorldConfig { +@@ -2734,6 +2734,7 @@ public class PurpurWorldConfig { public int villagerMinimumDemand = 0; public boolean villagerLobotomizeEnabled = false; public int villagerLobotomizeCheckInterval = 100; + public boolean villagerDisplayTradeItem = true; private void villagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.villager.attributes.max-health", villagerMaxHealth); -@@ -2319,6 +2320,7 @@ public class PurpurWorldConfig { + villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); + villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); +@@ -2764,6 +2765,7 @@ public class PurpurWorldConfig { } villagerLobotomizeEnabled = getBoolean("mobs.villager.lobotomize.enabled", villagerLobotomizeEnabled); villagerLobotomizeCheckInterval = getInt("mobs.villager.lobotomize.check-interval", villagerLobotomizeCheckInterval); + villagerDisplayTradeItem = getBoolean("mobs.villager.display-trade-item", villagerDisplayTradeItem); } - public double vindicatorMaxHealth = 24.0D; + public boolean vindicatorRidable = false; diff --git a/patches/server/0246-Config-for-mob-last-hurt-by-player-time.patch b/patches/server/0246-Config-for-mob-last-hurt-by-player-time.patch index c527a5158..f8c10aa47 100644 --- a/patches/server/0246-Config-for-mob-last-hurt-by-player-time.patch +++ b/patches/server/0246-Config-for-mob-last-hurt-by-player-time.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Config for mob last hurt by player time diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 576d29c30d089b7cbdae6a3eb9aad0ca23e847eb..937c01e0a306c475b0ea4bbb90c2602ca8ee53a2 100644 +index 39ee6fbc6ce17b61abf88deba69b0adecb294417..b8fbc726f1f73a4c20ea7eeca2846c864b9e67bc 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -1504,13 +1504,13 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -13,19 +13,19 @@ index 576d29c30d089b7cbdae6a3eb9aad0ca23e847eb..937c01e0a306c475b0ea4bbb90c2602c net.minecraft.world.entity.player.Player entityhuman = (net.minecraft.world.entity.player.Player) entity1; - this.lastHurtByPlayerTime = 100; -+ this.lastHurtByPlayerTime = this.level.purpurConfig.mobLastHurtByPlayerTime; // Purpur ++ this.lastHurtByPlayerTime = this.level().purpurConfig.mobLastHurtByPlayerTime; // Purpur this.lastHurtByPlayer = entityhuman; } else if (entity1 instanceof Wolf) { Wolf entitywolf = (Wolf) entity1; if (entitywolf.isTame()) { - this.lastHurtByPlayerTime = 100; -+ this.lastHurtByPlayerTime = this.level.purpurConfig.mobLastHurtByPlayerTime; // Purpur ++ this.lastHurtByPlayerTime = this.level().purpurConfig.mobLastHurtByPlayerTime; // Purpur LivingEntity entityliving2 = entitywolf.getOwner(); if (entityliving2 instanceof net.minecraft.world.entity.player.Player) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -index 641caa0f74a40ea52f71f3150c0168272b378edf..0eaf7209c636440fa9351797d46954d53dd16c5c 100644 +index 641caa0f74a40ea52f71f3150c0168272b378edf..d5ed0e06c13f6df41b073a8b90992a20d6b9fac6 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -444,7 +444,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { @@ -33,12 +33,12 @@ index 641caa0f74a40ea52f71f3150c0168272b378edf..0eaf7209c636440fa9351797d46954d5 getHandle().lastHurtByPlayer = entityPlayer; getHandle().lastHurtByMob = entityPlayer; - getHandle().lastHurtByPlayerTime = entityPlayer == null ? 0 : 100; // 100 value taken from EntityLiving#damageEntity -+ getHandle().lastHurtByPlayerTime = entityPlayer == null ? 0 : getHandle().level.purpurConfig.mobLastHurtByPlayerTime; // 100 value taken from EntityLiving#damageEntity // Purpur ++ getHandle().lastHurtByPlayerTime = entityPlayer == null ? 0 : getHandle().level().purpurConfig.mobLastHurtByPlayerTime; // 100 value taken from EntityLiving#damageEntity // Purpur } // Paper end diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 4f47dfb986d53001a29870e4237633ac2ae84311..d4fffb0173d8f9c946aad0c9ceb467745f541d91 100644 +index 561b6d09ca789bfabb1203d74620e3678605a4c3..fcda2a5405bb1503b2bf1d1ab523267f2859360a 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -146,6 +146,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0249-Option-to-disable-turtle-egg-trampling-with-feather-.patch b/patches/server/0249-Option-to-disable-turtle-egg-trampling-with-feather-.patch index d879e9c7f..16a866bbe 100644 --- a/patches/server/0249-Option-to-disable-turtle-egg-trampling-with-feather-.patch +++ b/patches/server/0249-Option-to-disable-turtle-egg-trampling-with-feather-.patch @@ -24,7 +24,7 @@ index 70997b83fd7631ebf3c5bda67ef77bef605eb464..a8c227e2cb62cfa8225798329cde9078 return world.purpurConfig.turtleEggsBypassMobGriefing || world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // Purpur end diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index eb8bd77034a804c7ce25ef93fd6668563ac3f592..8a3dac193beaa6d5e58490b5a86d64b60eb439b7 100644 +index b15a1001b5b2dd8ea7cd10248040e102b6ce4365..b8b4fbedb349857ac72c0fadd6d560a140f92527 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -1006,12 +1006,14 @@ public class PurpurWorldConfig { @@ -41,4 +41,4 @@ index eb8bd77034a804c7ce25ef93fd6668563ac3f592..8a3dac193beaa6d5e58490b5a86d64b6 + turtleEggsTramplingFeatherFalling = getBoolean("blocks.turtle_egg.feather-fall-distance-affects-trampling", turtleEggsTramplingFeatherFalling); } - public double axolotlMaxHealth = 14.0D; + public float hungerStarvationDamage = 1.0F; diff --git a/patches/server/0252-Implement-configurable-search-radius-for-villagers-t.patch b/patches/server/0252-Implement-configurable-search-radius-for-villagers-t.patch index 54b142e35..3dfb04418 100644 --- a/patches/server/0252-Implement-configurable-search-radius-for-villagers-t.patch +++ b/patches/server/0252-Implement-configurable-search-radius-for-villagers-t.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Implement configurable search radius for villagers to spawn diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 6e5dd65d3410b805168d6fbfc2705af6cae3c421..557ee2539c110bac5fcb57439eca31173a54b30a 100644 +index ae582a9a89846fe9d3a04d215e40129805cc4f2a..05206247613aa73e1bf4536d1b6760b573828867 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java @@ -1084,6 +1084,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @@ -18,19 +18,19 @@ index 6e5dd65d3410b805168d6fbfc2705af6cae3c421..557ee2539c110bac5fcb57439eca3117 AABB axisalignedbb = this.getBoundingBox().inflate(10.0D, 10.0D, 10.0D); List list = world.getEntitiesOfClass(Villager.class, axisalignedbb); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8a3dac193beaa6d5e58490b5a86d64b60eb439b7..8b30cc064de1edb3330fc374c22dbfbdba1dbe6d 100644 +index b8b4fbedb349857ac72c0fadd6d560a140f92527..e0cfd29988ec58e0f1328b9b2d131ff6f5f5fa8c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2303,6 +2303,8 @@ public class PurpurWorldConfig { +@@ -2745,6 +2745,8 @@ public class PurpurWorldConfig { public boolean villagerLobotomizeEnabled = false; public int villagerLobotomizeCheckInterval = 100; public boolean villagerDisplayTradeItem = true; + public int villagerSpawnIronGolemRadius = 0; + public int villagerSpawnIronGolemLimit = 0; private void villagerSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.villager.attributes.max-health", villagerMaxHealth); -@@ -2331,6 +2333,8 @@ public class PurpurWorldConfig { + villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); + villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); +@@ -2776,6 +2778,8 @@ public class PurpurWorldConfig { villagerLobotomizeEnabled = getBoolean("mobs.villager.lobotomize.enabled", villagerLobotomizeEnabled); villagerLobotomizeCheckInterval = getInt("mobs.villager.lobotomize.check-interval", villagerLobotomizeCheckInterval); villagerDisplayTradeItem = getBoolean("mobs.villager.display-trade-item", villagerDisplayTradeItem); @@ -38,4 +38,4 @@ index 8a3dac193beaa6d5e58490b5a86d64b60eb439b7..8b30cc064de1edb3330fc374c22dbfbd + villagerSpawnIronGolemLimit = getInt("mobs.villager.spawn-iron-golem.limit", villagerSpawnIronGolemLimit); } - public double vindicatorMaxHealth = 24.0D; + public boolean vindicatorRidable = false; diff --git a/patches/server/0253-Stonecutter-damage.patch b/patches/server/0253-Stonecutter-damage.patch index 9ff0daf14..060f66a69 100644 --- a/patches/server/0253-Stonecutter-damage.patch +++ b/patches/server/0253-Stonecutter-damage.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Stonecutter damage diff --git a/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java b/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java -index 0a95842c53a9d0286c57bcb42db97e468e30fb7d..e2d42e7947a237dd060ec1b9b63ac6ca4f37241a 100644 +index 0a95842c53a9d0286c57bcb42db97e468e30fb7d..b2e4dd9ed599156f517d38eca3b71c8d1e6dc1b6 100644 --- a/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java +++ b/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java @@ -92,4 +92,16 @@ public class StonecutterBlock extends Block { @@ -16,9 +16,9 @@ index 0a95842c53a9d0286c57bcb42db97e468e30fb7d..e2d42e7947a237dd060ec1b9b63ac6ca + // Purpur start + @Override + public void stepOn(Level level, BlockPos pos, BlockState state, net.minecraft.world.entity.Entity entity) { -+ if (level.purpurConfig.stonecutterDamage > 0.0F && entity instanceof net.minecraft.world.entity.LivingEntity) { ++ if (level().purpurConfig.stonecutterDamage > 0.0F && entity instanceof net.minecraft.world.entity.LivingEntity) { + org.bukkit.craftbukkit.event.CraftEventFactory.blockDamage = level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()); -+ entity.hurt(entity.damageSources().magic(), level.purpurConfig.stonecutterDamage); ++ entity.hurt(entity.damageSources().magic(), level().purpurConfig.stonecutterDamage); + org.bukkit.craftbukkit.event.CraftEventFactory.blockDamage = null; + } + super.stepOn(level, pos, state, entity); @@ -26,7 +26,7 @@ index 0a95842c53a9d0286c57bcb42db97e468e30fb7d..e2d42e7947a237dd060ec1b9b63ac6ca + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java b/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java -index 0e6923e6d440e846b3db47c6b8357f7e0e85ad65..48356602e9e112c4f059777467d8adf6d5147184 100644 +index d976a6df54c1e817def2d588692abe25a03ee0fa..ba57accc272958da4714896baeadb52c99383561 100644 --- a/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java +++ b/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java @@ -465,7 +465,7 @@ public class WalkNodeEvaluator extends NodeEvaluator { @@ -63,7 +63,7 @@ index 3de2e7a17e1234367e4ec6d944b1145781aefeba..15ed564a579237dd1f5d6ce56ccb473f public static boolean advancementOnlyBroadcastToAffectedPlayer = false; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8b30cc064de1edb3330fc374c22dbfbdba1dbe6d..269f22938ef0d34a9169e2249771ffaa308c3636 100644 +index e0cfd29988ec58e0f1328b9b2d131ff6f5f5fa8c..2d52019aa041956827156e5e511f1533f1ff4c96 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -1001,6 +1001,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0256-Skeletons-eat-wither-roses.patch b/patches/server/0256-Skeletons-eat-wither-roses.patch index 7156adb7f..7a5487ad3 100644 --- a/patches/server/0256-Skeletons-eat-wither-roses.patch +++ b/patches/server/0256-Skeletons-eat-wither-roses.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Skeletons eat wither roses diff --git a/src/main/java/net/minecraft/world/entity/monster/Skeleton.java b/src/main/java/net/minecraft/world/entity/monster/Skeleton.java -index b4ad943cb2c84a4abc3a75a475706a0f2c93a141..74b7cec6dbee0f53e2e822af850fe2aad4f30ee7 100644 +index 9b43150a00d7fac85aa69f5a2dbffd0dfdae4b86..65d97a2c4b3fcdfa4800787ab1ef5b77f49229c8 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Skeleton.java +++ b/src/main/java/net/minecraft/world/entity/monster/Skeleton.java @@ -14,6 +14,16 @@ import net.minecraft.world.item.Items; @@ -37,7 +37,7 @@ index b4ad943cb2c84a4abc3a75a475706a0f2c93a141..74b7cec6dbee0f53e2e822af850fe2aa + public InteractionResult mobInteract(Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + -+ if (level.purpurConfig.skeletonFeedWitherRoses > 0 && this.getType() != EntityType.WITHER_SKELETON && stack.getItem() == Blocks.WITHER_ROSE.asItem()) { ++ if (level().purpurConfig.skeletonFeedWitherRoses > 0 && this.getType() != EntityType.WITHER_SKELETON && stack.getItem() == Blocks.WITHER_ROSE.asItem()) { + return this.feedWitherRose(player, stack); + } + @@ -45,7 +45,7 @@ index b4ad943cb2c84a4abc3a75a475706a0f2c93a141..74b7cec6dbee0f53e2e822af850fe2aa + } + + private InteractionResult feedWitherRose(Player player, ItemStack stack) { -+ if (++witherRosesFed < level.purpurConfig.skeletonFeedWitherRoses) { ++ if (++witherRosesFed < level().purpurConfig.skeletonFeedWitherRoses) { + if (!player.getAbilities().instabuild) { + stack.shrink(1); + } @@ -94,22 +94,22 @@ index b4ad943cb2c84a4abc3a75a475706a0f2c93a141..74b7cec6dbee0f53e2e822af850fe2aa + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3b2c8c0d98eac2fd02db468d13eed35643df6a84..422de739e5f342cfd18af3740815f80b5a5179ba 100644 +index 24377bf7a10a758bd2049031983b9d9347ccd0c4..fac5a929dec9df57217a9b835910769958d39351 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2070,6 +2070,7 @@ public class PurpurWorldConfig { +@@ -2431,6 +2431,7 @@ public class PurpurWorldConfig { public boolean skeletonTakeDamageFromWater = false; public boolean skeletonAlwaysDropExp = false; public double skeletonHeadVisibilityPercent = 0.5D; + public int skeletonFeedWitherRoses = 0; private void skeletonSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.skeleton.attributes.max-health", skeletonMaxHealth); -@@ -2080,6 +2081,7 @@ public class PurpurWorldConfig { + skeletonRidable = getBoolean("mobs.skeleton.ridable", skeletonRidable); + skeletonRidableInWater = getBoolean("mobs.skeleton.ridable-in-water", skeletonRidableInWater); +@@ -2444,6 +2445,7 @@ public class PurpurWorldConfig { skeletonTakeDamageFromWater = getBoolean("mobs.skeleton.takes-damage-from-water", skeletonTakeDamageFromWater); skeletonAlwaysDropExp = getBoolean("mobs.skeleton.always-drop-exp", skeletonAlwaysDropExp); skeletonHeadVisibilityPercent = getDouble("mobs.skeleton.head-visibility-percent", skeletonHeadVisibilityPercent); + skeletonFeedWitherRoses = getInt("mobs.skeleton.feed-wither-roses", skeletonFeedWitherRoses); } - public double skeletonHorseMaxHealthMin = 15.0D; + public boolean skeletonHorseRidableInWater = true; diff --git a/patches/server/0257-Enchantment-Table-Persists-Lapis.patch b/patches/server/0257-Enchantment-Table-Persists-Lapis.patch index a9bdb577b..ec98030b9 100644 --- a/patches/server/0257-Enchantment-Table-Persists-Lapis.patch +++ b/patches/server/0257-Enchantment-Table-Persists-Lapis.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Enchantment Table Persists Lapis diff --git a/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java b/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java -index 0c3c3902e84010684ef703545c1377d8a6f32580..556e36c96820bfeba46f8e98b905c4456b969545 100644 +index 0c3c3902e84010684ef703545c1377d8a6f32580..fa3ecf3ca6514dcf957b07c787946cc5d626e15a 100644 --- a/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java +++ b/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java @@ -38,6 +38,12 @@ import org.bukkit.event.enchantment.PrepareItemEnchantEvent; @@ -50,7 +50,7 @@ index 0c3c3902e84010684ef703545c1377d8a6f32580..556e36c96820bfeba46f8e98b905c445 + // Purpur start + access.execute((level, pos) -> { -+ if (level.purpurConfig.enchantmentTableLapisPersists) { ++ if (level().purpurConfig.enchantmentTableLapisPersists) { + BlockEntity blockEntity = level.getBlockEntity(pos); + if (blockEntity instanceof EnchantmentTableBlockEntity enchantmentTable) { + this.getSlot(1).set(new ItemStack(Items.LAPIS_LAZULI, enchantmentTable.getLapis())); @@ -71,7 +71,7 @@ index 0c3c3902e84010684ef703545c1377d8a6f32580..556e36c96820bfeba46f8e98b905c445 }); } diff --git a/src/main/java/net/minecraft/world/level/block/EnchantmentTableBlock.java b/src/main/java/net/minecraft/world/level/block/EnchantmentTableBlock.java -index 839b7bc9392906dca384003468746963631fe095..286f34eef22a85be3fe9747dc3c3f9a7d51f437c 100644 +index 839b7bc9392906dca384003468746963631fe095..cc065545723c118b454acd91ef9044af36aa3f1b 100644 --- a/src/main/java/net/minecraft/world/level/block/EnchantmentTableBlock.java +++ b/src/main/java/net/minecraft/world/level/block/EnchantmentTableBlock.java @@ -29,6 +29,8 @@ import net.minecraft.world.level.pathfinder.PathComputationType; @@ -93,7 +93,7 @@ index 839b7bc9392906dca384003468746963631fe095..286f34eef22a85be3fe9747dc3c3f9a7 + public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean moved) { + BlockEntity blockEntity = level.getBlockEntity(pos); + -+ if (level.purpurConfig.enchantmentTableLapisPersists && blockEntity instanceof EnchantmentTableBlockEntity enchantmentTable) { ++ if (level().purpurConfig.enchantmentTableLapisPersists && blockEntity instanceof EnchantmentTableBlockEntity enchantmentTable) { + Containers.dropItemStack(level, pos.getX(), pos.getY(), pos.getZ(), new ItemStack(Items.LAPIS_LAZULI, enchantmentTable.getLapis())); + level.updateNeighbourForOutputSignal(pos, this); + } @@ -146,7 +146,7 @@ index 65e1381bb2d10bd212463feb602c60f8fdb9ade1..b7370e64fd0d50e8725d7d5afc30af2e + // Purpur } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 422de739e5f342cfd18af3740815f80b5a5179ba..17045e05b0ea705ff9dba8cce68ab34d498cb556 100644 +index fac5a929dec9df57217a9b835910769958d39351..26586904990f39298f7e2a6e1be657a13808fd6d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -745,6 +745,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0272-Add-skeleton-bow-accuracy-option.patch b/patches/server/0272-Add-skeleton-bow-accuracy-option.patch index 04a3fad69..1ca03bbeb 100644 --- a/patches/server/0272-Add-skeleton-bow-accuracy-option.patch +++ b/patches/server/0272-Add-skeleton-bow-accuracy-option.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add skeleton bow accuracy option diff --git a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java -index 27c001b35441e82b2b4292c0d4ddf54486d7c3cb..aa25e78985b48a0b6a40b2fac39c9c1979fba03e 100644 +index 41376b705748e14c1c4174e07732ce09ad8e581f..dd84433a988712da9d799cbda2487a902315fb92 100644 --- a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java +++ b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java @@ -182,7 +182,7 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo @@ -18,19 +18,19 @@ index 27c001b35441e82b2b4292c0d4ddf54486d7c3cb..aa25e78985b48a0b6a40b2fac39c9c19 org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(this, this.getMainHandItem(), entityarrow.getPickupItem(), entityarrow, net.minecraft.world.InteractionHand.MAIN_HAND, 0.8F, true); // Paper if (event.isCancelled()) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e138d1fa48346e0f523da8c74750383604e69b39..b596ab3f8c186cb46d319d9122fd2e0892e9029c 100644 +index d740cdf24fde59376c32eb2bd59d95fca0d71fe2..513ae5170af015928b8ce472fcf70256a611a5df 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2090,6 +2090,8 @@ public class PurpurWorldConfig { +@@ -2451,6 +2451,8 @@ public class PurpurWorldConfig { public boolean skeletonAlwaysDropExp = false; public double skeletonHeadVisibilityPercent = 0.5D; public int skeletonFeedWitherRoses = 0; + public String skeletonBowAccuracy = "14 - difficulty * 4"; + public Map skeletonBowAccuracyMap = new HashMap<>(); private void skeletonSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.skeleton.attributes.max-health", skeletonMaxHealth); -@@ -2101,6 +2103,18 @@ public class PurpurWorldConfig { + skeletonRidable = getBoolean("mobs.skeleton.ridable", skeletonRidable); + skeletonRidableInWater = getBoolean("mobs.skeleton.ridable-in-water", skeletonRidableInWater); +@@ -2465,6 +2467,18 @@ public class PurpurWorldConfig { skeletonAlwaysDropExp = getBoolean("mobs.skeleton.always-drop-exp", skeletonAlwaysDropExp); skeletonHeadVisibilityPercent = getDouble("mobs.skeleton.head-visibility-percent", skeletonHeadVisibilityPercent); skeletonFeedWitherRoses = getInt("mobs.skeleton.feed-wither-roses", skeletonFeedWitherRoses); @@ -48,4 +48,4 @@ index e138d1fa48346e0f523da8c74750383604e69b39..b596ab3f8c186cb46d319d9122fd2e08 + } } - public double skeletonHorseMaxHealthMin = 15.0D; + public boolean skeletonHorseRidableInWater = true; diff --git a/patches/server/0273-Allay-respect-item-NBT.patch b/patches/server/0273-Allay-respect-item-NBT.patch index d97ebf6da..3e521537c 100644 --- a/patches/server/0273-Allay-respect-item-NBT.patch +++ b/patches/server/0273-Allay-respect-item-NBT.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Allay respect item NBT diff --git a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java -index 81c10577b176b8325092457d0b543ed098ca54f2..9bd77b9c943315701ecc5e94de5061ff19a3e1ee 100644 +index 9588f9adad23aa6f2240d1ddb2f92aa82e8e740b..6b99ab10dc99375c56dd5c5c8f4acdec1b59f3a5 100644 --- a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java +++ b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java @@ -405,9 +405,31 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS @@ -44,19 +44,20 @@ index 81c10577b176b8325092457d0b543ed098ca54f2..9bd77b9c943315701ecc5e94de5061ff private boolean allayConsidersItemEqual(ItemStack stack, ItemStack stack2) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b596ab3f8c186cb46d319d9122fd2e0892e9029c..05ddd21cbc9d18c1c595849cb24a90baeca92729 100644 +index 513ae5170af015928b8ce472fcf70256a611a5df..179896e32591d028c3e35ec9f868e3768d82bfa6 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1049,6 +1049,12 @@ public class PurpurWorldConfig { - turtleEggsTramplingFeatherFalling = getBoolean("blocks.turtle_egg.feather-fall-distance-affects-trampling", turtleEggsTramplingFeatherFalling); - } - +@@ -1102,10 +1102,13 @@ public class PurpurWorldConfig { + public boolean allayRidable = false; + public boolean allayRidableInWater = true; + public boolean allayControllable = true; + public List allayRespectNBT = new ArrayList<>(); -+ private void allaySettings() { + private void allaySettings() { + allayRidable = getBoolean("mobs.allay.ridable", allayRidable); + allayRidableInWater = getBoolean("mobs.allay.ridable-in-water", allayRidableInWater); + allayControllable = getBoolean("mobs.allay.controllable", allayControllable); + allayRespectNBT.clear(); + getList("mobs.allay.respect-nbt", new ArrayList<>()).forEach(key -> allayRespectNBT.add(key.toString())); -+ } -+ - public double axolotlMaxHealth = 14.0D; - public int axolotlBreedingTicks = 6000; - public boolean axolotlTakeDamageFromWater = false; + } + + public boolean axolotlRidable = false; diff --git a/patches/server/0278-Implement-squid-colors-for-rainglow-fabric-mod.patch b/patches/server/0278-Implement-squid-colors-for-rainglow-fabric-mod.patch index 6e8f9976b..53cf0afc1 100644 --- a/patches/server/0278-Implement-squid-colors-for-rainglow-fabric-mod.patch +++ b/patches/server/0278-Implement-squid-colors-for-rainglow-fabric-mod.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Implement squid colors for rainglow fabric mod diff --git a/src/main/java/net/minecraft/world/entity/GlowSquid.java b/src/main/java/net/minecraft/world/entity/GlowSquid.java -index 678cff629d4de6fbe060dbbebbb669c93164f59b..332447ab89d369e83a99404d19cdfce5360f71da 100644 +index 43cdda0cb26c5d5cc9025199eb71673d71c2abea..83660fad1e4c0ce5800f6e62f915ccd87b9d04ac 100644 --- a/src/main/java/net/minecraft/world/entity/GlowSquid.java +++ b/src/main/java/net/minecraft/world/entity/GlowSquid.java @@ -18,6 +18,7 @@ import net.minecraft.world.level.block.Blocks; @@ -20,7 +20,7 @@ index 678cff629d4de6fbe060dbbebbb669c93164f59b..332447ab89d369e83a99404d19cdfce5 protected void defineSynchedData() { super.defineSynchedData(); this.entityData.define(DATA_DARK_TICKS_REMAINING, 0); -+ this.entityData.define(SQUID_COLOR, this.level.purpurConfig.glowSquidColorMode.getRandom(this.random).toString()); // Purpur ++ this.entityData.define(SQUID_COLOR, this.level().purpurConfig.glowSquidColorMode.getRandom(this.random).toString()); // Purpur } @Override @@ -40,23 +40,25 @@ index 678cff629d4de6fbe060dbbebbb669c93164f59b..332447ab89d369e83a99404d19cdfce5 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 05ddd21cbc9d18c1c595849cb24a90baeca92729..bef4ef082a076b52ed4952b101c433855e86c0de 100644 +index 179896e32591d028c3e35ec9f868e3768d82bfa6..80651ef3f4cd8d92a2b0d399d9620dc6a8968ea5 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1517,11 +1517,13 @@ public class PurpurWorldConfig { +@@ -1713,6 +1713,7 @@ public class PurpurWorldConfig { public boolean glowSquidsCanFly = false; public boolean glowSquidTakeDamageFromWater = false; public boolean glowSquidAlwaysDropExp = false; + public GlowSquidColor.Mode glowSquidColorMode = GlowSquidColor.Mode.RAINBOW; private void glowSquidSettings() { - glowSquidMaxHealth = getDouble("mobs.glow_squid.attributes.max_health", glowSquidMaxHealth); + glowSquidRidable = getBoolean("mobs.glow_squid.ridable", glowSquidRidable); + glowSquidControllable = getBoolean("mobs.glow_squid.controllable", glowSquidControllable); +@@ -1720,6 +1721,7 @@ public class PurpurWorldConfig { glowSquidsCanFly = getBoolean("mobs.glow_squid.can-fly", glowSquidsCanFly); glowSquidTakeDamageFromWater = getBoolean("mobs.glow_squid.takes-damage-from-water", glowSquidTakeDamageFromWater); glowSquidAlwaysDropExp = getBoolean("mobs.glow_squid.always-drop-exp", glowSquidAlwaysDropExp); + glowSquidColorMode = GlowSquidColor.Mode.get(getString("mobs.glow_squid.rainglow-mode", glowSquidColorMode.toString())); } - public double goatMaxHealth = 10.0D; + public boolean goatRidable = false; diff --git a/src/main/java/org/purpurmc/purpur/entity/GlowSquidColor.java b/src/main/java/org/purpurmc/purpur/entity/GlowSquidColor.java new file mode 100644 index 0000000000000000000000000000000000000000..c90256f4c16ffdb2d8e767e837ea36ac7a6613be diff --git a/patches/server/0283-Milk-Keeps-Beneficial-Effects.patch b/patches/server/0283-Milk-Keeps-Beneficial-Effects.patch index 0fc0a51bc..6f34df2f0 100644 --- a/patches/server/0283-Milk-Keeps-Beneficial-Effects.patch +++ b/patches/server/0283-Milk-Keeps-Beneficial-Effects.patch @@ -5,19 +5,19 @@ Subject: [PATCH] Milk Keeps Beneficial Effects diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 937c01e0a306c475b0ea4bbb90c2602ca8ee53a2..a31cc081e8cfe37ef054b8c5e73f369f95e9e426 100644 +index b8fbc726f1f73a4c20ea7eeca2846c864b9e67bc..dfc226aec69fe0bed2681005a6fdd05f27219819 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -1126,6 +1126,7 @@ public abstract class LivingEntity extends Entity implements Attackable { for (flag = false; iterator.hasNext(); flag = true) { // CraftBukkit start MobEffectInstance effect = (MobEffectInstance) iterator.next(); -+ if (cause == EntityPotionEffectEvent.Cause.MILK && !this.level.purpurConfig.milkClearsBeneficialEffects && effect.getEffect().isBeneficial()) continue; // Purpur ++ if (cause == EntityPotionEffectEvent.Cause.MILK && !this.level().purpurConfig.milkClearsBeneficialEffects && effect.getEffect().isBeneficial()) continue; // Purpur EntityPotionEffectEvent event = CraftEventFactory.callEntityPotionEffectChangeEvent(this, effect, null, cause, EntityPotionEffectEvent.Action.CLEARED); if (event.isCancelled()) { continue; diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index fd93eebe94f0ed4d26633292b7c711519a12d6b1..4552002a66d222b87dda15ec65118e470477aeba 100644 +index 7fa248b2d1b73e20085f0d3cdfead38547e4e924..ecfb5d8b47c461ae661149f1c7b9bacee226c311 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java @@ -110,7 +110,7 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill @@ -30,7 +30,7 @@ index fd93eebe94f0ed4d26633292b7c711519a12d6b1..4552002a66d222b87dda15ec65118e47 this.goalSelector.addGoal(1, new TradeWithPlayerGoal(this)); this.goalSelector.addGoal(1, new AvoidEntityGoal<>(this, Zombie.class, 8.0F, 0.5D, 0.5D)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index bef4ef082a076b52ed4952b101c433855e86c0de..8899611cfae4ea794f559da5eba1d70889fe8056 100644 +index 80651ef3f4cd8d92a2b0d399d9620dc6a8968ea5..68d57972e86ad8ad12cf4b3e597f4ced044a278b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -130,6 +130,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0287-Add-option-to-allow-creeper-to-encircle-target-when-.patch b/patches/server/0287-Add-option-to-allow-creeper-to-encircle-target-when-.patch index fc472fd22..df7f1a3ee 100644 --- a/patches/server/0287-Add-option-to-allow-creeper-to-encircle-target-when-.patch +++ b/patches/server/0287-Add-option-to-allow-creeper-to-encircle-target-when-.patch @@ -24,22 +24,22 @@ index e241ae250f4f04a17ef2c583d00b065a4ca56a4c..02b567e4e808e1a809d285ef39e1abc5 } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8899611cfae4ea794f559da5eba1d70889fe8056..5422fe94cec80485b2c94a9f4ad5b10ede6c22c2 100644 +index 68d57972e86ad8ad12cf4b3e597f4ced044a278b..0f9cb1fb0e4afbd79d331585c350b1092ef2e963 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1259,6 +1259,7 @@ public class PurpurWorldConfig { +@@ -1357,6 +1357,7 @@ public class PurpurWorldConfig { public boolean creeperHealthRadius = false; public boolean creeperAlwaysDropExp = false; public double creeperHeadVisibilityPercent = 0.5D; + public boolean creeperEncircleTarget = false; private void creeperSettings() { - if (PurpurConfig.version < 10) { - double oldValue = getDouble("mobs.creeper.attributes.max-health", creeperMaxHealth); -@@ -1274,6 +1275,7 @@ public class PurpurWorldConfig { + creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); + creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); +@@ -1375,6 +1376,7 @@ public class PurpurWorldConfig { creeperHealthRadius = getBoolean("mobs.creeper.health-impacts-explosion", creeperHealthRadius); creeperAlwaysDropExp = getBoolean("mobs.creeper.always-drop-exp", creeperAlwaysDropExp); creeperHeadVisibilityPercent = getDouble("mobs.creeper.head-visibility-percent", creeperHeadVisibilityPercent); + creeperEncircleTarget = getBoolean("mobs.creeper.encircle-target", creeperEncircleTarget); } - public double dolphinMaxHealth = 10.0D; + public boolean dolphinRidable = false; diff --git a/patches/server/0289-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch b/patches/server/0289-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch index cd2e85a51..ab3ad9199 100644 --- a/patches/server/0289-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch +++ b/patches/server/0289-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add option to teleport to spawn on nether ceiling damage diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 98684d5f05e1d9deff5b5edc923c27110277eda0..c9eb9135880087fe3d20586278032cf03bd7f171 100644 +index d66e16cd770fce8788d78a95193e65ac1ce7a56a..ffb95077a63bbe9855d6a458633d36f437a5efab 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -7,6 +7,7 @@ import com.google.common.collect.Lists; @@ -20,12 +20,12 @@ index 98684d5f05e1d9deff5b5edc923c27110277eda0..c9eb9135880087fe3d20586278032cf0 && this.level.paperConfig().environment.netherCeilingVoidDamageHeight.test(v -> this.getY() >= v) && (!(this instanceof Player player) || !player.getAbilities().invulnerable))) { // Paper end -+ if (this.level.purpurConfig.teleportOnNetherCeilingDamage && this.level.getWorld().getEnvironment() == org.bukkit.World.Environment.NETHER && this instanceof ServerPlayer player) player.teleport(MCUtil.toLocation(this.level, this.level.getSharedSpawnPos())); else // Purpur ++ if (this.level().purpurConfig.teleportOnNetherCeilingDamage && this.level.getWorld().getEnvironment() == org.bukkit.World.Environment.NETHER && this instanceof ServerPlayer player) player.teleport(MCUtil.toLocation(this.level, this.level.getSharedSpawnPos())); else // Purpur this.onBelowWorld(); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 5422fe94cec80485b2c94a9f4ad5b10ede6c22c2..c8dbf4052c6b8e525c6f8e06b2af0e1d60adf5e9 100644 +index 0f9cb1fb0e4afbd79d331585c350b1092ef2e963..4c359f653e7beb0c1e162ebb53dcf1332e334bd6 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -425,6 +425,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0292-End-Crystal-Cramming.patch b/patches/server/0292-End-Crystal-Cramming.patch index e61367dd9..0cfb79655 100644 --- a/patches/server/0292-End-Crystal-Cramming.patch +++ b/patches/server/0292-End-Crystal-Cramming.patch @@ -5,19 +5,19 @@ Subject: [PATCH] End Crystal Cramming diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java -index ada7eba2beca5b0897fa2eb3567a639573f4e18d..4591fd93d94a4e68c7e23674d434ba019ad85607 100644 +index ada7eba2beca5b0897fa2eb3567a639573f4e18d..db513ae4b1427ceba7f1a5878ba692ea42fa12ea 100644 --- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java +++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java @@ -93,6 +93,7 @@ public class EndCrystal extends Entity { } } // Paper end -+ if (this.level.purpurConfig.endCrystalCramming > 0 && this.level.getEntitiesOfClass(EndCrystal.class, getBoundingBox()).size() > this.level.purpurConfig.endCrystalCramming) this.hurt(this.damageSources().cramming(), 6.0F); // Purpur ++ if (this.level().purpurConfig.endCrystalCramming > 0 && this.level.getEntitiesOfClass(EndCrystal.class, getBoundingBox()).size() > this.level().purpurConfig.endCrystalCramming) this.hurt(this.damageSources().cramming(), 6.0F); // Purpur } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index c8dbf4052c6b8e525c6f8e06b2af0e1d60adf5e9..dced4230ce8e68fe74b67a1446078fda1a6f8d64 100644 +index 4c359f653e7beb0c1e162ebb53dcf1332e334bd6..68690f120e4586defa87de6be1b485e904eb21ff 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -873,6 +873,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0295-Config-to-remove-explosion-radius-clamp.patch b/patches/server/0295-Config-to-remove-explosion-radius-clamp.patch index 812211582..591e3a790 100644 --- a/patches/server/0295-Config-to-remove-explosion-radius-clamp.patch +++ b/patches/server/0295-Config-to-remove-explosion-radius-clamp.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Config to remove explosion radius clamp diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java -index 8f97c9df726ac20cfce7bdddd5dd4f8c5aa76c35..93e7e2fe1f4184719736e698563f493b1d31e8c0 100644 +index 8f97c9df726ac20cfce7bdddd5dd4f8c5aa76c35..6fed8a6f4e633cda367e9ee9a0065690bb65a8dc 100644 --- a/src/main/java/net/minecraft/world/level/Explosion.java +++ b/src/main/java/net/minecraft/world/level/Explosion.java @@ -86,7 +86,7 @@ public class Explosion { @@ -22,12 +22,12 @@ index 8f97c9df726ac20cfce7bdddd5dd4f8c5aa76c35..93e7e2fe1f4184719736e698563f493b public void explode() { // CraftBukkit start - if (this.radius < 0.1F) { -+ if ((this.level == null || this.level.purpurConfig.explosionClampRadius) && this.radius < 0.1F) { // Purpur ++ if ((this.level == null || this.level().purpurConfig.explosionClampRadius) && this.radius < 0.1F) { // Purpur return; } // CraftBukkit end diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index fd3131de66a09f7be3e4dc9e4a033f82a0cb25ea..b88f5f93c54f72927601337c5a5d418c384ac8d3 100644 +index 18f1f53ba9084b2d1ed8edbddb19e8253b0b79a4..365c2f9fa912d902fe12ec647ba0193513f4cc92 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -219,6 +219,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0300-Add-mending-multiplier.patch b/patches/server/0300-Add-mending-multiplier.patch index ab29d7bc3..b25fffe60 100644 --- a/patches/server/0300-Add-mending-multiplier.patch +++ b/patches/server/0300-Add-mending-multiplier.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add mending multiplier diff --git a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java -index 4746dcb444f0c1b0801cd1805b7fcd3612f5ad85..2930932b431c57974bae7c28a4450a03c5f29b6d 100644 +index 7ccf214d376771814b27aa8e1f34d5a73f1b61f5..3e42b12804f37c4b0ab083273a105939fe8f5734 100644 --- a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java +++ b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java @@ -357,13 +357,15 @@ public class ExperienceOrb extends Entity { @@ -15,19 +15,19 @@ index 4746dcb444f0c1b0801cd1805b7fcd3612f5ad85..2930932b431c57974bae7c28a4450a03 + // Purpur start public int durabilityToXp(int repairAmount) { - return repairAmount / 2; -+ return (int) (repairAmount / (2 * level.purpurConfig.mendingMultiplier)); ++ return (int) (repairAmount / (2 * level().purpurConfig.mendingMultiplier)); } public int xpToDurability(int experienceAmount) { - return experienceAmount * 2; -+ return (int) ((experienceAmount * 2) * level.purpurConfig.mendingMultiplier); ++ return (int) ((experienceAmount * 2) * level().purpurConfig.mendingMultiplier); } + // Purpur end public int getValue() { return this.value; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 72ba806e5922bc39eb566475c921851799cfb25a..9d0a691b57cd852c19d6a8bf46b1fca5188ea1ea 100644 +index ef30d6b5ef973508cce4279ae2a0240ab3161ec2..7d449621c0c40464bfb64fa2615e9c96ab95c188 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -121,6 +121,7 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0068-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch b/patches/todo/server/0068-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch index 28b24c4ed..0e8e5d4e6 100644 --- a/patches/todo/server/0068-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch +++ b/patches/todo/server/0068-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch @@ -26,12 +26,12 @@ index 64f17b4a22454b59968787089253eaba0a04c1f2..b373f9e4b5a2604bcbccd36cd3de961f } + // Purpur start -+ if (level.purpurConfig.phantomAttackedByCrystalRadius <= 0 || --idleCooldown > 0) { ++ if (level().purpurConfig.phantomAttackedByCrystalRadius <= 0 || --idleCooldown > 0) { + return; // on cooldown + } + + if (targetPhantom == null) { -+ for (net.minecraft.world.entity.monster.Phantom phantom : level.getEntitiesOfClass(net.minecraft.world.entity.monster.Phantom.class, getBoundingBox().inflate(level.purpurConfig.phantomAttackedByCrystalRadius))) { ++ for (net.minecraft.world.entity.monster.Phantom phantom : level.getEntitiesOfClass(net.minecraft.world.entity.monster.Phantom.class, getBoundingBox().inflate(level().purpurConfig.phantomAttackedByCrystalRadius))) { + if (phantom.hasLineOfSight(this)) { + attackPhantom(phantom); + break; @@ -44,7 +44,7 @@ index 64f17b4a22454b59968787089253eaba0a04c1f2..b373f9e4b5a2604bcbccd36cd3de961f + if (targetPhantom.hasLineOfSight(this)) { + if (phantomDamageCooldown <= 0) { + phantomDamageCooldown = 20; -+ targetPhantom.hurt(targetPhantom.damageSources().indirectMagic(this, this), level.purpurConfig.phantomAttackedByCrystalDamage); ++ targetPhantom.hurt(targetPhantom.damageSources().indirectMagic(this, this), level().purpurConfig.phantomAttackedByCrystalDamage); + } + } else { + forgetPhantom(); // no longer in sight @@ -120,7 +120,7 @@ index e271555ac03fcbb565a7fe08efdc9a6036164e74..fd02dfb905c71fa10e0830cf0a02d4b6 - this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur + // Purpur start + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); -+ if (level.purpurConfig.phantomOrbitCrystalRadius > 0) { ++ if (level().purpurConfig.phantomOrbitCrystalRadius > 0) { + this.goalSelector.addGoal(1, new FindCrystalGoal(this)); + this.goalSelector.addGoal(2, new OrbitCrystalGoal(this)); + } @@ -186,7 +186,7 @@ index e271555ac03fcbb565a7fe08efdc9a6036164e74..fd02dfb905c71fa10e0830cf0a02d4b6 + } + + private double maxTargetRange() { -+ return phantom.level.purpurConfig.phantomOrbitCrystalRadius; ++ return phantom.level().purpurConfig.phantomOrbitCrystalRadius; + } + } + diff --git a/patches/todo/server/0114-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch b/patches/todo/server/0114-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch index cb2f675a3..d154eb0d1 100644 --- a/patches/todo/server/0114-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch +++ b/patches/todo/server/0114-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch @@ -151,7 +151,7 @@ index aa95cd7e04e25dec63c172d219f1f16cd6c9c4b5..8e2015fc122a93015482a81b2bbfa112 } else { brain.setSchedule(Schedule.VILLAGER_DEFAULT); - brain.addActivityWithConditions(Activity.WORK, VillagerGoalPackages.getWorkPackage(villagerprofession, 0.5F), ImmutableSet.of(Pair.of(MemoryModuleType.JOB_SITE, MemoryStatus.VALUE_PRESENT))); -+ brain.addActivityWithConditions(Activity.WORK, VillagerGoalPackages.getWorkPackage(villagerprofession, 0.5F, this.level.purpurConfig.villagerClericsFarmWarts), ImmutableSet.of(Pair.of(MemoryModuleType.JOB_SITE, MemoryStatus.VALUE_PRESENT))); // Purpur ++ brain.addActivityWithConditions(Activity.WORK, VillagerGoalPackages.getWorkPackage(villagerprofession, 0.5F, this.level().purpurConfig.villagerClericsFarmWarts), ImmutableSet.of(Pair.of(MemoryModuleType.JOB_SITE, MemoryStatus.VALUE_PRESENT))); // Purpur } brain.addActivity(Activity.CORE, VillagerGoalPackages.getCorePackage(villagerprofession, 0.5F)); @@ -160,7 +160,7 @@ index aa95cd7e04e25dec63c172d219f1f16cd6c9c4b5..8e2015fc122a93015482a81b2bbfa112 public boolean hasFarmSeeds() { + // Purpur start -+ if (this.level.purpurConfig.villagerClericsFarmWarts && this.getVillagerData().getProfession() == VillagerProfession.CLERIC) { ++ if (this.level().purpurConfig.villagerClericsFarmWarts && this.getVillagerData().getProfession() == VillagerProfession.CLERIC) { + return this.getInventory().hasAnyOf(ImmutableSet.of(Items.NETHER_WART)); + } + // Purpur end diff --git a/patches/todo/server/0229-Signs-allow-color-codes.patch b/patches/todo/server/0229-Signs-allow-color-codes.patch index a02bcff34..a19dfca3a 100644 --- a/patches/todo/server/0229-Signs-allow-color-codes.patch +++ b/patches/todo/server/0229-Signs-allow-color-codes.patch @@ -12,7 +12,7 @@ index a7cd9d4f83a6e0df28818c55788cdc2db369dfac..dd21804bb62ad7ae2a086600d9cec7e6 @Override public void openTextEdit(SignBlockEntity sign) { -+ if (level.purpurConfig.signAllowColors) this.connection.send(sign.getTranslatedUpdatePacket(textFilteringEnabled)); // Purpur ++ if (level().purpurConfig.signAllowColors) this.connection.send(sign.getTranslatedUpdatePacket(textFilteringEnabled)); // Purpur sign.setAllowedPlayerEditor(this.getUUID()); this.connection.send(new ClientboundBlockUpdatePacket(this.level, sign.getBlockPos())); this.connection.send(new ClientboundOpenSignEditorPacket(sign.getBlockPos())); diff --git a/patches/todo/server/0276-Remove-Mojang-Profiler.patch b/patches/todo/server/0276-Remove-Mojang-Profiler.patch index c8238b40c..300a77d05 100644 --- a/patches/todo/server/0276-Remove-Mojang-Profiler.patch +++ b/patches/todo/server/0276-Remove-Mojang-Profiler.patch @@ -1290,7 +1290,7 @@ index bf5705551720d338ee0b790504727685b1f8f026..8e2274f7dce34e0997356205cf96e46f super.aiStep(); - this.level.getProfiler().push("looting"); + //this.level.getProfiler().push("looting"); // Purpur - if (!this.level.isClientSide && this.canPickUpLoot() && this.isAlive() && !this.dead && (this.level.purpurConfig.entitiesPickUpLootBypassMobGriefing || this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { + if (!this.level.isClientSide && this.canPickUpLoot() && this.isAlive() && !this.dead && (this.level().purpurConfig.entitiesPickUpLootBypassMobGriefing || this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { Vec3i baseblockposition = this.getPickupReach(); List list = this.level.getEntitiesOfClass(ItemEntity.class, this.getBoundingBox().inflate((double) baseblockposition.getX(), (double) baseblockposition.getY(), (double) baseblockposition.getZ())); @@ -719,7 +719,7 @@ public abstract class Mob extends LivingEntity implements Targeting { @@ -1704,7 +1704,7 @@ index 6f47f6c785dc8da6b211ac87630a3d83c42d1576..73cdb6b1793b264e1ec8ff51c4f82743 - this.level.getProfiler().push("villagerBrain"); + //this.level.getProfiler().push("villagerBrain"); // Purpur // Purpur start - if (this.level.purpurConfig.villagerLobotomizeEnabled) { + if (this.level().purpurConfig.villagerLobotomizeEnabled) { // treat as inactive if lobotomized @@ -357,7 +357,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler restock(); diff --git a/todo.txt b/todo.txt index e0848ecfc..6ae8b43fd 100644 --- a/todo.txt +++ b/todo.txt @@ -3,4 +3,8 @@ * configurable food atributes check `key.location().toString()` still works * fix all instances of `level.blahblah` * merge pufferfish fixes into one -* test allow transparent blocks in enchanting box \ No newline at end of file +* test allow transparent blocks in enchanting box + +* switch mojang api over +* zombie villager max health +* camel attribute in correct place \ No newline at end of file