From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: jmp Date: Thu, 20 Aug 2020 17:38:12 -0700 Subject: [PATCH] Customizable WitherBoss Health and Healing Adds the ability to customize the health of the Wither Boss, as well as the amount that it heals, and how often in the PurpurWorldConfig. diff --git a/src/main/java/net/minecraft/server/EntityWither.java b/src/main/java/net/minecraft/server/EntityWither.java index 29bb74e51e..d847c03c0c 100644 --- a/src/main/java/net/minecraft/server/EntityWither.java +++ b/src/main/java/net/minecraft/server/EntityWither.java @@ -41,6 +41,15 @@ public class EntityWither extends EntityMonster implements IRangedEntity { this.f = 50; } + // Purpur start + @Override + public void initAttributes(World world) { + if (world != null) { + this.getAttributeInstance(GenericAttributes.MAX_HEALTH).setValue(world.purpurConfig.witherMaxHealth); + } + } + // Purpur end + @Override protected void initPathfinder() { this.goalSelector.a(0, new EntityWither.a()); @@ -230,7 +239,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity { this.setInvul(i); if (this.ticksLived % 10 == 0) { - this.heal(10.0F, EntityRegainHealthEvent.RegainReason.WITHER_SPAWN); // CraftBukkit + this.heal(this.getMaxHealth() / 33, EntityRegainHealthEvent.RegainReason.WITHER_SPAWN); // CraftBukkit // Purpur - use max health for healing instead of a constant } } else { @@ -339,9 +348,11 @@ public class EntityWither extends EntityMonster implements IRangedEntity { } } - if (this.ticksLived % 20 == 0) { - this.heal(1.0F, EntityRegainHealthEvent.RegainReason.REGEN); // CraftBukkit + // Purpur start - customizable heal rate and amount + if (this.ticksLived % world.purpurConfig.witherHealthRegenDelay == 0) { + this.heal(world.purpurConfig.witherHealthRegenAmount, EntityRegainHealthEvent.RegainReason.REGEN); // CraftBukkit } + // Purpur end //this.bossBattle.setProgress(this.getHealth() / this.getMaxHealth()); // Paper - Moved down } @@ -355,6 +366,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity { public void beginSpawnSequence() { this.setInvul(220); this.setHealth(this.getMaxHealth() / 3.0F); + initAttributes(this.world); // Purpur - building the wither with soul_sand + wither_skeleton_skulls does not call prepare, so we need to call this manually } @Override diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java index efc4b3a3a0..bb3f0097d5 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -884,6 +884,15 @@ public class PurpurWorldConfig { witchRidableInWater = getBoolean("mobs.witch.ridable-in-water", witchRidableInWater); } + public double witherMaxHealth = 300.0D; + public float witherHealthRegenAmount = 1.0f; + public int witherHealthRegenDelay = 20; + private void witherSettings() { + witherMaxHealth = getDouble("mobs.wither.max-health", witherMaxHealth); + witherHealthRegenAmount = (float) getDouble("mobs.wither.health-regen-amount", witherHealthRegenAmount); + witherHealthRegenDelay = getInt("mobs.wither.health-regen-delay", witherHealthRegenDelay); + } + public boolean witherSkeletonRidable = false; public boolean witherSkeletonRidableInWater = false; public boolean witherSkeletonTakesWitherDamage = false;