From c950ae4a7f7488913ea31380304b311213c2f3e6 Mon Sep 17 00:00:00 2001 From: Ghoulboy Date: Thu, 29 Jun 2023 21:50:27 +0200 Subject: [PATCH 01/12] Fixing Villager to Witch conversion --- src/main/java/carpet/CarpetSettings.java | 7 +++ .../carpet/mixins/Villager_bugFixMixin.java | 43 +++++++++++++++++++ src/main/resources/carpet.mixins.json | 1 + 3 files changed, 51 insertions(+) create mode 100644 src/main/java/carpet/mixins/Villager_bugFixMixin.java diff --git a/src/main/java/carpet/CarpetSettings.java b/src/main/java/carpet/CarpetSettings.java index 4caf08bf26..86164dcae9 100644 --- a/src/main/java/carpet/CarpetSettings.java +++ b/src/main/java/carpet/CarpetSettings.java @@ -1070,6 +1070,13 @@ public String validate(CommandSourceStack source, CarpetRule currentRule ) public static boolean lightningKillsDropsFix = false; + @Rule( + desc = "Mob conversions keep NBT Tags", + extra = {"Setting to true will ensure NBT tags are kept when mobs convert (e.g Villager to Witch)", "Fixes [MC-88967](https://bugs.mojang.com/browse/MC-88967)."}, + category = BUGFIX + ) + public static boolean mobConvertKeepNBTTags = false; + @Rule( desc = "Placing an activator rail on top of a barrier block will fill the neighbor updater stack when the rail turns off.", extra = {"The integer entered is the amount of updates that should be left in the stack", "-1 turns it off"}, diff --git a/src/main/java/carpet/mixins/Villager_bugFixMixin.java b/src/main/java/carpet/mixins/Villager_bugFixMixin.java new file mode 100644 index 0000000000..3e34fd28db --- /dev/null +++ b/src/main/java/carpet/mixins/Villager_bugFixMixin.java @@ -0,0 +1,43 @@ +package carpet.mixins; + +import carpet.CarpetSettings; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LightningBolt; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.monster.Witch; +import net.minecraft.world.entity.npc.Villager; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +@Mixin(Villager.class) +public abstract class Villager_bugFixMixin extends Mob { + + + protected Villager_bugFixMixin(EntityType entityType, Level level) { + super(entityType, level); + } + + @Inject(method = "thunderHit", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/monster/Witch;setPersistenceRequired()V"), locals = LocalCapture.CAPTURE_FAILSOFT) + private void mixin(ServerLevel serverLevel, LightningBolt lightningBolt, CallbackInfo ci, Witch witch) { + if (CarpetSettings.mobConvertKeepNBTTags) { + this.getActiveEffects().forEach(witch::addEffect); + witch.getAttributes().assignValues(this.getAttributes()); + witch.setCanPickUpLoot(this.canPickUpLoot()); + witch.setInvulnerable(this.isInvulnerable()); + witch.setLeftHanded(this.isLeftHanded()); + witch.setNoGravity(this.isNoGravity()); + witch.setXRot(this.getXRot()); + witch.setYRot(this.getYRot()); + witch.setYBodyRot(this.getVisualRotationYInDegrees()); + witch.setYHeadRot(this.getYHeadRot()); + witch.setSilent(this.isSilent()); + this.getTags().forEach(witch::addTag); + witch.setUUID(this.getUUID()); + } + } +} diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index c6af4fd698..7638a001db 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -26,6 +26,7 @@ "ServerStatus_motdMixin", "MinecraftServer_pingPlayerSampleLimit", "HugeFungusFeatureMixin", + "Villager_bugFixMixin", "MinecraftServer_coreMixin", From b0c7fc5610664e0aaad087e4ba3dc72b0627ec40 Mon Sep 17 00:00:00 2001 From: Ghoulboy Date: Thu, 29 Jun 2023 21:50:50 +0200 Subject: [PATCH 02/12] Fixing mooshroom to cow conversion --- .../mixins/MushroomCow_bugFixMixin.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/main/java/carpet/mixins/MushroomCow_bugFixMixin.java diff --git a/src/main/java/carpet/mixins/MushroomCow_bugFixMixin.java b/src/main/java/carpet/mixins/MushroomCow_bugFixMixin.java new file mode 100644 index 0000000000..94eb3213e5 --- /dev/null +++ b/src/main/java/carpet/mixins/MushroomCow_bugFixMixin.java @@ -0,0 +1,44 @@ +package carpet.mixins; + +import carpet.CarpetSettings; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LightningBolt; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.animal.Cow; +import net.minecraft.world.entity.animal.MushroomCow; +import net.minecraft.world.entity.monster.Witch; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +@Mixin(MushroomCow.class) +public abstract class MushroomCow_bugFixMixin extends Mob { + + protected MushroomCow_bugFixMixin(EntityType entityType, Level level) { + super(entityType, level); + } + + @Inject(method = "shear", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/animal/Cow;setInvulnerable(Z)V"), locals = LocalCapture.CAPTURE_FAILSOFT) + private void mixin(SoundSource soundSource, CallbackInfo ci, Cow cow) { + if (CarpetSettings.mobConvertKeepNBTTags) { + this.getActiveEffects().forEach(cow::addEffect); + cow.getAttributes().assignValues(this.getAttributes()); + cow.setDeltaMovement(this.getDeltaMovement()); + cow.setRemainingFireTicks(this.getRemainingFireTicks()); + cow.setNoGravity(this.isNoGravity()); + cow.setPortalCooldown(this.getPortalCooldown()); + cow.setXRot(this.getXRot()); + cow.setYRot(this.getYRot()); + cow.setYBodyRot(this.getVisualRotationYInDegrees()); + cow.setYHeadRot(this.getYHeadRot()); + cow.setSilent(this.isSilent()); + this.getTags().forEach(cow::addTag); + cow.setUUID(this.getUUID()); + } + } +} From 39fa607b78f6db47aa00702c0fffaf67e6b77bb3 Mon Sep 17 00:00:00 2001 From: Ghoulboy Date: Thu, 29 Jun 2023 21:51:05 +0200 Subject: [PATCH 03/12] Update carpet.mixins.json --- src/main/resources/carpet.mixins.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index 7638a001db..5f508110f4 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -27,6 +27,7 @@ "MinecraftServer_pingPlayerSampleLimit", "HugeFungusFeatureMixin", "Villager_bugFixMixin", + "MushroomCow_bugFixMixin", "MinecraftServer_coreMixin", From e636ad02b0741e8948c8cdf8f472e56bce458264 Mon Sep 17 00:00:00 2001 From: Ghoulboy Date: Thu, 29 Jun 2023 22:28:46 +0200 Subject: [PATCH 04/12] Fixing zombie villager to villager conversion --- src/main/java/carpet/CarpetSettings.java | 1 + .../mixins/ZombieVillager_bugFixMixin.java | 40 +++++++++++++++++++ src/main/resources/carpet.mixins.json | 1 + 3 files changed, 42 insertions(+) create mode 100644 src/main/java/carpet/mixins/ZombieVillager_bugFixMixin.java diff --git a/src/main/java/carpet/CarpetSettings.java b/src/main/java/carpet/CarpetSettings.java index 86164dcae9..e6b18f9e3d 100644 --- a/src/main/java/carpet/CarpetSettings.java +++ b/src/main/java/carpet/CarpetSettings.java @@ -1070,6 +1070,7 @@ public String validate(CommandSourceStack source, CarpetRule currentRule ) public static boolean lightningKillsDropsFix = false; + //Todo figure out how to do death loot tables @Rule( desc = "Mob conversions keep NBT Tags", extra = {"Setting to true will ensure NBT tags are kept when mobs convert (e.g Villager to Witch)", "Fixes [MC-88967](https://bugs.mojang.com/browse/MC-88967)."}, diff --git a/src/main/java/carpet/mixins/ZombieVillager_bugFixMixin.java b/src/main/java/carpet/mixins/ZombieVillager_bugFixMixin.java new file mode 100644 index 0000000000..59dbebf2b6 --- /dev/null +++ b/src/main/java/carpet/mixins/ZombieVillager_bugFixMixin.java @@ -0,0 +1,40 @@ +package carpet.mixins; + +import carpet.CarpetSettings; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LightningBolt; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.monster.Witch; +import net.minecraft.world.entity.monster.ZombieVillager; +import net.minecraft.world.entity.npc.Villager; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +@Mixin(ZombieVillager.class) +public abstract class ZombieVillager_bugFixMixin extends Mob { + + protected ZombieVillager_bugFixMixin(EntityType entityType, Level level) { + super(entityType, level); + } + + + @Inject(method = "finishConversion", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/EquipmentSlot;values()[Lnet/minecraft/world/entity/EquipmentSlot;"), locals = LocalCapture.CAPTURE_FAILSOFT) + private void mixin(ServerLevel serverLevel, CallbackInfo ci, Villager villager) { + if (CarpetSettings.mobConvertKeepNBTTags) { + this.getActiveEffects().forEach(villager::addEffect); + villager.setCanPickUpLoot(this.canPickUpLoot()); + villager.setRemainingFireTicks(this.getRemainingFireTicks()); + villager.setLeftHanded(this.isLeftHanded()); + villager.setNoGravity(this.isNoGravity()); + villager.setPortalCooldown(this.getPortalCooldown()); + villager.setSilent(this.isSilent()); + this.getTags().forEach(villager::addTag); + villager.setUUID(this.getUUID()); + } + } +} diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index 5f508110f4..6e4e73ac86 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -28,6 +28,7 @@ "HugeFungusFeatureMixin", "Villager_bugFixMixin", "MushroomCow_bugFixMixin", + "ZombieVillager_bugFixMixin", "MinecraftServer_coreMixin", From 016e3d0fbb54441ca7b0cf4f04e9ac44688bb364 Mon Sep 17 00:00:00 2001 From: Ghoulboy Date: Thu, 29 Jun 2023 22:34:25 +0200 Subject: [PATCH 05/12] Fixing piglin and piglin brute to pigman conversion --- .../mixins/AbstractPiglin_bugFixMixin.java | 43 +++++++++++++++++++ src/main/resources/carpet.mixins.json | 1 + 2 files changed, 44 insertions(+) create mode 100644 src/main/java/carpet/mixins/AbstractPiglin_bugFixMixin.java diff --git a/src/main/java/carpet/mixins/AbstractPiglin_bugFixMixin.java b/src/main/java/carpet/mixins/AbstractPiglin_bugFixMixin.java new file mode 100644 index 0000000000..9c7e660746 --- /dev/null +++ b/src/main/java/carpet/mixins/AbstractPiglin_bugFixMixin.java @@ -0,0 +1,43 @@ +package carpet.mixins; + +import carpet.CarpetSettings; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.animal.Cow; +import net.minecraft.world.entity.monster.ZombifiedPiglin; +import net.minecraft.world.entity.monster.piglin.AbstractPiglin; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +@Mixin(AbstractPiglin.class) +public abstract class AbstractPiglin_bugFixMixin extends Mob { + + protected AbstractPiglin_bugFixMixin(EntityType entityType, Level level) { + super(entityType, level); + } + + @Inject(method = "finishConversion", at = @At(value = "TAIL"), locals = LocalCapture.CAPTURE_FAILSOFT) + private void mixin(ServerLevel serverLevel, CallbackInfo ci, ZombifiedPiglin zombifiedPiglin) { + if (CarpetSettings.mobConvertKeepNBTTags) { + this.getActiveEffects().forEach(zombifiedPiglin::addEffect); + zombifiedPiglin.getAttributes().assignValues(this.getAttributes()); + zombifiedPiglin.setCanPickUpLoot(this.canPickUpLoot()); + zombifiedPiglin.setRemainingFireTicks(this.getRemainingFireTicks()); + zombifiedPiglin.setNoGravity(this.isNoGravity()); + zombifiedPiglin.setPortalCooldown(this.getPortalCooldown()); + zombifiedPiglin.setXRot(this.getXRot()); + zombifiedPiglin.setYRot(this.getYRot()); + zombifiedPiglin.setYBodyRot(this.getVisualRotationYInDegrees()); + zombifiedPiglin.setYHeadRot(this.getYHeadRot()); + zombifiedPiglin.setSilent(this.isSilent()); + this.getTags().forEach(zombifiedPiglin::addTag); + zombifiedPiglin.setUUID(this.getUUID()); + } + } +} diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index 6e4e73ac86..ca8bde83c7 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -29,6 +29,7 @@ "Villager_bugFixMixin", "MushroomCow_bugFixMixin", "ZombieVillager_bugFixMixin", + "AbstractPiglin_bugFixMixin", "MinecraftServer_coreMixin", From 668162be8e0a3111470c80ad742aac82530f029b Mon Sep 17 00:00:00 2001 From: Ghoulboy Date: Thu, 29 Jun 2023 22:38:01 +0200 Subject: [PATCH 06/12] Fixing tadpole to frog conversion --- .../carpet/mixins/Tadpole_bugFixMixin.java | 34 +++++++++++++++++++ src/main/resources/carpet.mixins.json | 1 + 2 files changed, 35 insertions(+) create mode 100644 src/main/java/carpet/mixins/Tadpole_bugFixMixin.java diff --git a/src/main/java/carpet/mixins/Tadpole_bugFixMixin.java b/src/main/java/carpet/mixins/Tadpole_bugFixMixin.java new file mode 100644 index 0000000000..fd0c1e005d --- /dev/null +++ b/src/main/java/carpet/mixins/Tadpole_bugFixMixin.java @@ -0,0 +1,34 @@ +package carpet.mixins; + +import carpet.CarpetSettings; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.animal.Cow; +import net.minecraft.world.entity.animal.frog.Frog; +import net.minecraft.world.entity.animal.frog.Tadpole; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +@Mixin(Tadpole.class) +public abstract class Tadpole_bugFixMixin extends Mob { + protected Tadpole_bugFixMixin(EntityType entityType, Level level) { + super(entityType, level); + } + + @Inject(method = "ageUp()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V"), locals = LocalCapture.CAPTURE_FAILSOFT) + private void mixin(CallbackInfo ci, ServerLevel serverLevel, Frog frog) { + if (CarpetSettings.mobConvertKeepNBTTags) { + frog.setXRot(this.getXRot()); + frog.setYRot(this.getYRot()); + frog.setYBodyRot(this.getVisualRotationYInDegrees()); + frog.setYHeadRot(this.getYHeadRot()); + frog.setUUID(this.getUUID()); + } + } +} diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index ca8bde83c7..d49d870d4a 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -30,6 +30,7 @@ "MushroomCow_bugFixMixin", "ZombieVillager_bugFixMixin", "AbstractPiglin_bugFixMixin", + "Tadpole_bugFixMixin", "MinecraftServer_coreMixin", From 53c7881fa9a159852f830c094438a9cab43521f6 Mon Sep 17 00:00:00 2001 From: Ghoulboy Date: Thu, 29 Jun 2023 22:45:04 +0200 Subject: [PATCH 07/12] Fixing slime and magma cube splitting --- .../java/carpet/mixins/Slime_bugFixMixin.java | 37 +++++++++++++++++++ src/main/resources/carpet.mixins.json | 1 + 2 files changed, 38 insertions(+) create mode 100644 src/main/java/carpet/mixins/Slime_bugFixMixin.java diff --git a/src/main/java/carpet/mixins/Slime_bugFixMixin.java b/src/main/java/carpet/mixins/Slime_bugFixMixin.java new file mode 100644 index 0000000000..60f358afd0 --- /dev/null +++ b/src/main/java/carpet/mixins/Slime_bugFixMixin.java @@ -0,0 +1,37 @@ +package carpet.mixins; + +import carpet.CarpetSettings; +import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.animal.Cow; +import net.minecraft.world.entity.monster.Slime; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +@Mixin(Slime.class) +public abstract class Slime_bugFixMixin extends Mob { + protected Slime_bugFixMixin(EntityType entityType, Level level) { + super(entityType, level); + } + + @Inject(method = "remove", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z"), locals = LocalCapture.CAPTURE_FAILSOFT) + private void mixin(RemovalReason removalReason, CallbackInfo ci, int i, Component component, boolean bl, float f, int j, int k, int l, float g, float h, Slime slime) { + if (CarpetSettings.mobConvertKeepNBTTags) { + this.getActiveEffects().forEach(slime::addEffect); + slime.getAttributes().assignValues(this.getAttributes()); + slime.setDeltaMovement(this.getDeltaMovement()); + // slime.setRemainingFireTicks(this.getRemainingFireTicks()); technically a newly spawned entity, not the same one converted + slime.setNoGravity(this.isNoGravity()); + // slime.setPortalCooldown(this.getPortalCooldown()); same here + slime.setSilent(this.isSilent()); + this.getTags().forEach(slime::addTag); + } + } +} diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index d49d870d4a..acecd8b542 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -31,6 +31,7 @@ "ZombieVillager_bugFixMixin", "AbstractPiglin_bugFixMixin", "Tadpole_bugFixMixin", + "Slime_bugFixMixin", "MinecraftServer_coreMixin", From 0a125e74e54f32e3c981b8ce60b6c0b0ff889735 Mon Sep 17 00:00:00 2001 From: Ghoulboy Date: Thu, 29 Jun 2023 22:55:41 +0200 Subject: [PATCH 08/12] Fixing zombie to drowned and husk to zombie conversion --- .../java/carpet/mixins/Slime_bugFixMixin.java | 3 -- .../mixins/ZombieVillager_bugFixMixin.java | 2 - .../carpet/mixins/Zombie_bugFixMixin.java | 39 +++++++++++++++++++ src/main/resources/carpet.mixins.json | 1 + 4 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 src/main/java/carpet/mixins/Zombie_bugFixMixin.java diff --git a/src/main/java/carpet/mixins/Slime_bugFixMixin.java b/src/main/java/carpet/mixins/Slime_bugFixMixin.java index 60f358afd0..1d03826d49 100644 --- a/src/main/java/carpet/mixins/Slime_bugFixMixin.java +++ b/src/main/java/carpet/mixins/Slime_bugFixMixin.java @@ -2,11 +2,8 @@ import carpet.CarpetSettings; import net.minecraft.network.chat.Component; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; -import net.minecraft.world.entity.animal.Cow; import net.minecraft.world.entity.monster.Slime; import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/carpet/mixins/ZombieVillager_bugFixMixin.java b/src/main/java/carpet/mixins/ZombieVillager_bugFixMixin.java index 59dbebf2b6..305b9a5f90 100644 --- a/src/main/java/carpet/mixins/ZombieVillager_bugFixMixin.java +++ b/src/main/java/carpet/mixins/ZombieVillager_bugFixMixin.java @@ -3,9 +3,7 @@ import carpet.CarpetSettings; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.LightningBolt; import net.minecraft.world.entity.Mob; -import net.minecraft.world.entity.monster.Witch; import net.minecraft.world.entity.monster.ZombieVillager; import net.minecraft.world.entity.npc.Villager; import net.minecraft.world.level.Level; diff --git a/src/main/java/carpet/mixins/Zombie_bugFixMixin.java b/src/main/java/carpet/mixins/Zombie_bugFixMixin.java new file mode 100644 index 0000000000..1173b72619 --- /dev/null +++ b/src/main/java/carpet/mixins/Zombie_bugFixMixin.java @@ -0,0 +1,39 @@ +package carpet.mixins; + +import carpet.CarpetSettings; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.monster.Zombie; +import net.minecraft.world.entity.npc.Villager; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +@Mixin(Zombie.class) +public abstract class Zombie_bugFixMixin extends Mob { + protected Zombie_bugFixMixin(EntityType entityType, Level level) { + super(entityType, level); + } + + @Inject(method = "convertToZombieType", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/monster/Zombie;canBreakDoors()Z"), locals = LocalCapture.CAPTURE_FAILSOFT) + private void mixin(EntityType entityType, CallbackInfo ci, Zombie zombie) { + if (CarpetSettings.mobConvertKeepNBTTags) { + this.getActiveEffects().forEach(zombie::addEffect); + zombie.setRemainingFireTicks(this.getRemainingFireTicks()); + zombie.setLeftHanded(this.isLeftHanded()); + zombie.setNoGravity(this.isNoGravity()); + zombie.setPortalCooldown(this.getPortalCooldown()); + zombie.setXRot(this.getXRot()); + zombie.setYRot(this.getYRot()); + zombie.setYBodyRot(this.getVisualRotationYInDegrees()); + zombie.setYHeadRot(this.getYHeadRot()); + zombie.setSilent(this.isSilent()); + this.getTags().forEach(zombie::addTag); + zombie.setUUID(this.getUUID()); + } + } +} diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index acecd8b542..a9ee273d69 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -32,6 +32,7 @@ "AbstractPiglin_bugFixMixin", "Tadpole_bugFixMixin", "Slime_bugFixMixin", + "Zombie_bugFixMixin", "MinecraftServer_coreMixin", From 6ce868e4e4336159e03cce8de81e4ddfebf4087d Mon Sep 17 00:00:00 2001 From: Ghoulboy Date: Thu, 29 Jun 2023 23:00:15 +0200 Subject: [PATCH 09/12] =?UTF-8?q?Ensuring=20cow=C3=ACs=20noAI=20tag=20is?= =?UTF-8?q?=20kept?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/carpet/mixins/MushroomCow_bugFixMixin.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/carpet/mixins/MushroomCow_bugFixMixin.java b/src/main/java/carpet/mixins/MushroomCow_bugFixMixin.java index 94eb3213e5..9033eb856b 100644 --- a/src/main/java/carpet/mixins/MushroomCow_bugFixMixin.java +++ b/src/main/java/carpet/mixins/MushroomCow_bugFixMixin.java @@ -1,14 +1,11 @@ package carpet.mixins; import carpet.CarpetSettings; -import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundSource; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.LightningBolt; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.animal.Cow; import net.minecraft.world.entity.animal.MushroomCow; -import net.minecraft.world.entity.monster.Witch; import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -30,6 +27,7 @@ private void mixin(SoundSource soundSource, CallbackInfo ci, Cow cow) { cow.getAttributes().assignValues(this.getAttributes()); cow.setDeltaMovement(this.getDeltaMovement()); cow.setRemainingFireTicks(this.getRemainingFireTicks()); + cow.setNoAi(this.isNoAi()); cow.setNoGravity(this.isNoGravity()); cow.setPortalCooldown(this.getPortalCooldown()); cow.setXRot(this.getXRot()); From 95ae0e5d11f8530bf5fc407980a0b7b21e0e303c Mon Sep 17 00:00:00 2001 From: Ghoulboy Date: Fri, 30 Jun 2023 10:06:36 +0200 Subject: [PATCH 10/12] Changing injection target for Zombie conversion fix --- src/main/java/carpet/mixins/Zombie_bugFixMixin.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/carpet/mixins/Zombie_bugFixMixin.java b/src/main/java/carpet/mixins/Zombie_bugFixMixin.java index 1173b72619..2b75e8c2ff 100644 --- a/src/main/java/carpet/mixins/Zombie_bugFixMixin.java +++ b/src/main/java/carpet/mixins/Zombie_bugFixMixin.java @@ -1,11 +1,9 @@ package carpet.mixins; import carpet.CarpetSettings; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.monster.Zombie; -import net.minecraft.world.entity.npc.Villager; import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -19,7 +17,7 @@ protected Zombie_bugFixMixin(EntityType entityType, Level level) super(entityType, level); } - @Inject(method = "convertToZombieType", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/monster/Zombie;canBreakDoors()Z"), locals = LocalCapture.CAPTURE_FAILSOFT) + @Inject(method = "convertToZombieType", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/monster/Zombie;supportsBreakDoorGoal()Z"), locals = LocalCapture.CAPTURE_FAILSOFT) private void mixin(EntityType entityType, CallbackInfo ci, Zombie zombie) { if (CarpetSettings.mobConvertKeepNBTTags) { this.getActiveEffects().forEach(zombie::addEffect); From 1c6b06d6a21a5e5d8dbb7a4cf87c3febdf379cc8 Mon Sep 17 00:00:00 2001 From: Ghoulboy Date: Fri, 30 Jun 2023 10:09:31 +0200 Subject: [PATCH 11/12] Can't set UUID of dead mob --- src/main/java/carpet/mixins/Villager_bugFixMixin.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/carpet/mixins/Villager_bugFixMixin.java b/src/main/java/carpet/mixins/Villager_bugFixMixin.java index 3e34fd28db..7e3b1eb85b 100644 --- a/src/main/java/carpet/mixins/Villager_bugFixMixin.java +++ b/src/main/java/carpet/mixins/Villager_bugFixMixin.java @@ -37,7 +37,6 @@ private void mixin(ServerLevel serverLevel, LightningBolt lightningBolt, Callbac witch.setYHeadRot(this.getYHeadRot()); witch.setSilent(this.isSilent()); this.getTags().forEach(witch::addTag); - witch.setUUID(this.getUUID()); } } } From 3b2d40681646a6c9e7a38ac56b7afb7162d73f41 Mon Sep 17 00:00:00 2001 From: Ghoulboy Date: Tue, 4 Jul 2023 21:41:29 +0200 Subject: [PATCH 12/12] Renaming rule to `mobConvertKeepNBTTagsFix` --- src/main/java/carpet/CarpetSettings.java | 2 +- src/main/java/carpet/mixins/AbstractPiglin_bugFixMixin.java | 4 +--- src/main/java/carpet/mixins/MushroomCow_bugFixMixin.java | 2 +- src/main/java/carpet/mixins/Slime_bugFixMixin.java | 2 +- src/main/java/carpet/mixins/Tadpole_bugFixMixin.java | 4 +--- src/main/java/carpet/mixins/Villager_bugFixMixin.java | 2 +- src/main/java/carpet/mixins/ZombieVillager_bugFixMixin.java | 2 +- src/main/java/carpet/mixins/Zombie_bugFixMixin.java | 2 +- 8 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/main/java/carpet/CarpetSettings.java b/src/main/java/carpet/CarpetSettings.java index e6b18f9e3d..2a2e546ce7 100644 --- a/src/main/java/carpet/CarpetSettings.java +++ b/src/main/java/carpet/CarpetSettings.java @@ -1076,7 +1076,7 @@ public String validate(CommandSourceStack source, CarpetRule currentRule extra = {"Setting to true will ensure NBT tags are kept when mobs convert (e.g Villager to Witch)", "Fixes [MC-88967](https://bugs.mojang.com/browse/MC-88967)."}, category = BUGFIX ) - public static boolean mobConvertKeepNBTTags = false; + public static boolean mobConvertKeepNBTTagsFix = false; @Rule( desc = "Placing an activator rail on top of a barrier block will fill the neighbor updater stack when the rail turns off.", diff --git a/src/main/java/carpet/mixins/AbstractPiglin_bugFixMixin.java b/src/main/java/carpet/mixins/AbstractPiglin_bugFixMixin.java index 9c7e660746..8cb78f56b5 100644 --- a/src/main/java/carpet/mixins/AbstractPiglin_bugFixMixin.java +++ b/src/main/java/carpet/mixins/AbstractPiglin_bugFixMixin.java @@ -2,10 +2,8 @@ import carpet.CarpetSettings; import net.minecraft.server.level.ServerLevel; -import net.minecraft.sounds.SoundSource; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; -import net.minecraft.world.entity.animal.Cow; import net.minecraft.world.entity.monster.ZombifiedPiglin; import net.minecraft.world.entity.monster.piglin.AbstractPiglin; import net.minecraft.world.level.Level; @@ -24,7 +22,7 @@ protected AbstractPiglin_bugFixMixin(EntityType entityType, Level @Inject(method = "finishConversion", at = @At(value = "TAIL"), locals = LocalCapture.CAPTURE_FAILSOFT) private void mixin(ServerLevel serverLevel, CallbackInfo ci, ZombifiedPiglin zombifiedPiglin) { - if (CarpetSettings.mobConvertKeepNBTTags) { + if (CarpetSettings.mobConvertKeepNBTTagsFix) { this.getActiveEffects().forEach(zombifiedPiglin::addEffect); zombifiedPiglin.getAttributes().assignValues(this.getAttributes()); zombifiedPiglin.setCanPickUpLoot(this.canPickUpLoot()); diff --git a/src/main/java/carpet/mixins/MushroomCow_bugFixMixin.java b/src/main/java/carpet/mixins/MushroomCow_bugFixMixin.java index 9033eb856b..1cf895101c 100644 --- a/src/main/java/carpet/mixins/MushroomCow_bugFixMixin.java +++ b/src/main/java/carpet/mixins/MushroomCow_bugFixMixin.java @@ -22,7 +22,7 @@ protected MushroomCow_bugFixMixin(EntityType entityType, Level le @Inject(method = "shear", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/animal/Cow;setInvulnerable(Z)V"), locals = LocalCapture.CAPTURE_FAILSOFT) private void mixin(SoundSource soundSource, CallbackInfo ci, Cow cow) { - if (CarpetSettings.mobConvertKeepNBTTags) { + if (CarpetSettings.mobConvertKeepNBTTagsFix) { this.getActiveEffects().forEach(cow::addEffect); cow.getAttributes().assignValues(this.getAttributes()); cow.setDeltaMovement(this.getDeltaMovement()); diff --git a/src/main/java/carpet/mixins/Slime_bugFixMixin.java b/src/main/java/carpet/mixins/Slime_bugFixMixin.java index 1d03826d49..94a8f15c72 100644 --- a/src/main/java/carpet/mixins/Slime_bugFixMixin.java +++ b/src/main/java/carpet/mixins/Slime_bugFixMixin.java @@ -20,7 +20,7 @@ protected Slime_bugFixMixin(EntityType entityType, Level level) { @Inject(method = "remove", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z"), locals = LocalCapture.CAPTURE_FAILSOFT) private void mixin(RemovalReason removalReason, CallbackInfo ci, int i, Component component, boolean bl, float f, int j, int k, int l, float g, float h, Slime slime) { - if (CarpetSettings.mobConvertKeepNBTTags) { + if (CarpetSettings.mobConvertKeepNBTTagsFix) { this.getActiveEffects().forEach(slime::addEffect); slime.getAttributes().assignValues(this.getAttributes()); slime.setDeltaMovement(this.getDeltaMovement()); diff --git a/src/main/java/carpet/mixins/Tadpole_bugFixMixin.java b/src/main/java/carpet/mixins/Tadpole_bugFixMixin.java index fd0c1e005d..6d9d875a34 100644 --- a/src/main/java/carpet/mixins/Tadpole_bugFixMixin.java +++ b/src/main/java/carpet/mixins/Tadpole_bugFixMixin.java @@ -2,10 +2,8 @@ import carpet.CarpetSettings; import net.minecraft.server.level.ServerLevel; -import net.minecraft.sounds.SoundSource; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; -import net.minecraft.world.entity.animal.Cow; import net.minecraft.world.entity.animal.frog.Frog; import net.minecraft.world.entity.animal.frog.Tadpole; import net.minecraft.world.level.Level; @@ -23,7 +21,7 @@ protected Tadpole_bugFixMixin(EntityType entityType, Level level) @Inject(method = "ageUp()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V"), locals = LocalCapture.CAPTURE_FAILSOFT) private void mixin(CallbackInfo ci, ServerLevel serverLevel, Frog frog) { - if (CarpetSettings.mobConvertKeepNBTTags) { + if (CarpetSettings.mobConvertKeepNBTTagsFix) { frog.setXRot(this.getXRot()); frog.setYRot(this.getYRot()); frog.setYBodyRot(this.getVisualRotationYInDegrees()); diff --git a/src/main/java/carpet/mixins/Villager_bugFixMixin.java b/src/main/java/carpet/mixins/Villager_bugFixMixin.java index 7e3b1eb85b..66cffadae3 100644 --- a/src/main/java/carpet/mixins/Villager_bugFixMixin.java +++ b/src/main/java/carpet/mixins/Villager_bugFixMixin.java @@ -24,7 +24,7 @@ protected Villager_bugFixMixin(EntityType entityType, Level level @Inject(method = "thunderHit", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/monster/Witch;setPersistenceRequired()V"), locals = LocalCapture.CAPTURE_FAILSOFT) private void mixin(ServerLevel serverLevel, LightningBolt lightningBolt, CallbackInfo ci, Witch witch) { - if (CarpetSettings.mobConvertKeepNBTTags) { + if (CarpetSettings.mobConvertKeepNBTTagsFix) { this.getActiveEffects().forEach(witch::addEffect); witch.getAttributes().assignValues(this.getAttributes()); witch.setCanPickUpLoot(this.canPickUpLoot()); diff --git a/src/main/java/carpet/mixins/ZombieVillager_bugFixMixin.java b/src/main/java/carpet/mixins/ZombieVillager_bugFixMixin.java index 305b9a5f90..8b26568cf7 100644 --- a/src/main/java/carpet/mixins/ZombieVillager_bugFixMixin.java +++ b/src/main/java/carpet/mixins/ZombieVillager_bugFixMixin.java @@ -23,7 +23,7 @@ protected ZombieVillager_bugFixMixin(EntityType entityType, Level @Inject(method = "finishConversion", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/EquipmentSlot;values()[Lnet/minecraft/world/entity/EquipmentSlot;"), locals = LocalCapture.CAPTURE_FAILSOFT) private void mixin(ServerLevel serverLevel, CallbackInfo ci, Villager villager) { - if (CarpetSettings.mobConvertKeepNBTTags) { + if (CarpetSettings.mobConvertKeepNBTTagsFix) { this.getActiveEffects().forEach(villager::addEffect); villager.setCanPickUpLoot(this.canPickUpLoot()); villager.setRemainingFireTicks(this.getRemainingFireTicks()); diff --git a/src/main/java/carpet/mixins/Zombie_bugFixMixin.java b/src/main/java/carpet/mixins/Zombie_bugFixMixin.java index 2b75e8c2ff..c32aaac38a 100644 --- a/src/main/java/carpet/mixins/Zombie_bugFixMixin.java +++ b/src/main/java/carpet/mixins/Zombie_bugFixMixin.java @@ -19,7 +19,7 @@ protected Zombie_bugFixMixin(EntityType entityType, Level level) @Inject(method = "convertToZombieType", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/monster/Zombie;supportsBreakDoorGoal()Z"), locals = LocalCapture.CAPTURE_FAILSOFT) private void mixin(EntityType entityType, CallbackInfo ci, Zombie zombie) { - if (CarpetSettings.mobConvertKeepNBTTags) { + if (CarpetSettings.mobConvertKeepNBTTagsFix) { this.getActiveEffects().forEach(zombie::addEffect); zombie.setRemainingFireTicks(this.getRemainingFireTicks()); zombie.setLeftHanded(this.isLeftHanded());