--- a/net/minecraft/world/entity/monster/ZombifiedPiglin.java
+++ b/net/minecraft/world/entity/monster/ZombifiedPiglin.java
@@ -56,6 +_,7 @@
     private static final int ALERT_RANGE_Y = 10;
     private static final UniformInt ALERT_INTERVAL = TimeUtil.rangeOfSeconds(4, 6);
     private int ticksUntilNextAlert;
+    private HurtByTargetGoal hurtByTargetGoal; // Paper - fix PigZombieAngerEvent cancellation
 
     public ZombifiedPiglin(EntityType<? extends ZombifiedPiglin> entityType, Level level) {
         super(entityType, level);
@@ -71,7 +_,7 @@
     protected void addBehaviourGoals() {
         this.goalSelector.addGoal(2, new ZombieAttackGoal(this, 1.0, false));
         this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0));
-        this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers());
+        this.targetSelector.addGoal(1, this.hurtByTargetGoal = (new HurtByTargetGoal(this)).setAlertOthers()); // Paper - fix PigZombieAngerEvent cancellation
         this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::isAngryAt));
         this.targetSelector.addGoal(3, new ResetUniversalAngerTargetGoal<>(this, true));
     }
@@ -144,7 +_,7 @@
             .filter(zombifiedPiglin -> zombifiedPiglin != this)
             .filter(zombifiedPiglin -> zombifiedPiglin.getTarget() == null)
             .filter(zombifiedPiglin -> !zombifiedPiglin.isAlliedTo(this.getTarget()))
-            .forEach(zombifiedPiglin -> zombifiedPiglin.setTarget(this.getTarget()));
+            .forEach(zombifiedPiglin -> zombifiedPiglin.setTarget(this.getTarget(), org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_NEARBY_ENTITY)); // CraftBukkit
     }
 
     private void playAngerSound() {
@@ -152,18 +_,27 @@
     }
 
     @Override
-    public void setTarget(@Nullable LivingEntity livingEntity) {
+    public boolean setTarget(@Nullable LivingEntity livingEntity, @Nullable org.bukkit.event.entity.EntityTargetEvent.TargetReason reason) { // CraftBukkit - signature
         if (this.getTarget() == null && livingEntity != null) {
             this.playFirstAngerSoundIn = FIRST_ANGER_SOUND_DELAY.sample(this.random);
             this.ticksUntilNextAlert = ALERT_INTERVAL.sample(this.random);
         }
 
-        super.setTarget(livingEntity);
+        return super.setTarget(livingEntity, reason); // CraftBukkit
     }
 
     @Override
     public void startPersistentAngerTimer() {
-        this.setRemainingPersistentAngerTime(PERSISTENT_ANGER_TIME.sample(this.random));
+        // CraftBukkit start
+        net.minecraft.world.entity.Entity entity = this.level().getEntity(this.getPersistentAngerTarget());
+        org.bukkit.event.entity.PigZombieAngerEvent event = new org.bukkit.event.entity.PigZombieAngerEvent((org.bukkit.entity.PigZombie) this.getBukkitEntity(), (entity == null) ? null : entity.getBukkitEntity(), PERSISTENT_ANGER_TIME.sample(this.random));
+        if (!event.callEvent()) {
+            this.setPersistentAngerTarget(null);
+            this.hurtByTargetGoal.stop();
+            return;
+        }
+        this.setRemainingPersistentAngerTime(event.getNewAnger());
+        // CraftBukkit end
     }
 
     public static boolean checkZombifiedPiglinSpawnRules(
@@ -200,17 +_,17 @@
     }
 
     @Override
-    protected SoundEvent getAmbientSound() {
+    public SoundEvent getAmbientSound() {
         return this.isAngry() ? SoundEvents.ZOMBIFIED_PIGLIN_ANGRY : SoundEvents.ZOMBIFIED_PIGLIN_AMBIENT;
     }
 
     @Override
-    protected SoundEvent getHurtSound(DamageSource damageSource) {
+    public SoundEvent getHurtSound(DamageSource damageSource) {
         return SoundEvents.ZOMBIFIED_PIGLIN_HURT;
     }
 
     @Override
-    protected SoundEvent getDeathSound() {
+    public SoundEvent getDeathSound() {
         return SoundEvents.ZOMBIFIED_PIGLIN_DEATH;
     }
 
