Mojira Archive
MC-94281

Witches can heal undead mobs

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

  1. Build a setup as seen here.
  2. Switch to survival and go behind the witch.
  3. 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.