-
Bug
-
Resolution: Works As Intended
-
None
-
Minecraft 15w50a, Minecraft 15w51b, Minecraft 16w02a, Minecraft 1.9, Minecraft 1.9.1 Pre-Release 3, Minecraft 1.11, Minecraft 1.12.1, Minecraft 1.13-pre8, Minecraft 18w32a, Minecraft 1.13.1-pre2, Minecraft 1.13.1, Minecraft 1.13.2-pre1, Minecraft 1.13.2, Minecraft 19w08b, Minecraft 19w09a, 1.15.1, 1.15.2 Pre-release 2, 1.15.2, 20w14a, 20w19a, 1.16.2, 1.16.4, 20w46a, 20w48a, 21w05b, 1.17, 1.17.1
-
None
-
Confirmed
-
Mob behaviour
The bug
When a witch is attacked by an undead mob, the witch will throw a splash potion of poison/instant damage. Which has the opposite effect since the target is undead, thus healing it.
How to reproduce
- Build a setup as seen here.
- Switch to survival and go behind the witch.
- When the skeleton has shot the witch, switch to creative (F3 + N).
→ The witch starts to heal the skeleton
Code analysis
The following is based on yarn 1.15.2 Pre-release 2 names.
In the method net.minecraft.entity.mob.WitchEntity.attack() it just doesn't check for if the mob is undead and to use another potion if so. I write a fix for this issue which hopefully will help to resolve this issue.
Fix for MC-94281
@Override public void attack(LivingEntity target, float float3) { boolean flag = target instanceof DrownedEntity || target instanceof PhantomEntity || target instanceof WitherSkeletonEntity || target instanceof SkeletonEntity || target instanceof SkeletonHorseEntity|| target instanceof HuskEntity|| target instanceof StrayEntity || target instanceof ZombieEntity|| target instanceof ZombieHorseEntity || target instanceof ZombiePigmanEntity || target instanceof ZombieVillagerEntity; //TODO: The entity class HostileEntity exists, does this include all of these above? if (this.isDrinking()) { return; } Vec3d vec3d4 = ... double double5 = ... double double7 = ... double double9 = ... float float11 = ... Potion potion12 = flag ? Potions.HEALING : Potions.HARMING; if (target instanceof RaiderEntity) { if (...) { potion12 = ... } else { potion12 = ... } this.setTarget(null); } else if (...)) { potion12 = ... } else if (target.getHealth() >= 8.0f && flag ? true : !target.hasStatusEffect(StatusEffects.POISON)) { potion12 = flag ? Potions.HEALING : Potions.POISON; } else if (...) { potion12 = ... } ThrownPotionEntity thrownPotionEntity13 = ... thrownPotionEntity13.setItemStack(...)); ThrownPotionEntity class_1686 = ... thrownPotionEntity13.setVelocity(...); this.world.playSound(...); this.world.spawnEntity(thrownPotionEntity13); }
Note: As per MC-93680, healing is used for both potion options as regeneration does not have the opposite effect on undead mobs.