mojira.dev
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

[media]
  1. .

  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.

Linked issues

Attachments

Comments 23

most likely intended

that is intende beacause the skeleton is undead damge potions heal him and healing potions damage him

he knows that, but he thinks a witch should throw healing potions (harm undead) instead of harming when fighting undead mobs

@FVbico Yes that was what I wanted to mean, ty.

Interesting bug. But what if you think that the witch is "helping" the monster to be alive? That would then turn this to WAI.

13 more comments

Can confirm in 20w48a.

Can confirm in 21w05b.

Can confirm in 1.17.

Please, review the resolution. It doesn’t make sense for it to marked as WAI. If it’s WAI, atleast explain why it is

Guérin

Oval

(Unassigned)

Confirmed

Mob behaviour

Minecraft 15w50a, Minecraft 15w51b, Minecraft 16w02a, Minecraft 1.9, Minecraft 1.9.1 Pre-Release 3, ..., 20w46a, 20w48a, 21w05b, 1.17, 1.17.1

Retrieved