From bc0c89ff699f4bf742dbad9a5a110792acc97862 Mon Sep 17 00:00:00 2001 From: LexManos Date: Thu, 13 Jun 2024 14:40:46 -0700 Subject: [PATCH] Fix Bogged and Wolf armor not being shearable by custom shears. Closes #10005 --- .teamcity/settings.kts | 2 +- .../world/entity/Shearable.java.patch | 14 +++-- .../entity/animal/MushroomCow.java.patch | 16 +----- .../world/entity/animal/Sheep.java.patch | 16 +----- .../world/entity/animal/SnowGolem.java.patch | 7 +-- .../world/entity/animal/Wolf.java.patch | 53 +++++++++++++++++++ .../world/entity/monster/Bogged.java.patch | 49 +++++++++++++++++ .../world/item/ShearsItem.java.patch | 5 +- .../common/IForgeShearable.java | 9 ++-- .../minecraftforge/common/ToolActions.java | 2 +- 10 files changed, 124 insertions(+), 49 deletions(-) create mode 100644 patches/minecraft/net/minecraft/world/entity/monster/Bogged.java.patch diff --git a/.teamcity/settings.kts b/.teamcity/settings.kts index b1445beaf3..6666a8ef8c 100644 --- a/.teamcity/settings.kts +++ b/.teamcity/settings.kts @@ -38,7 +38,7 @@ project { params { text("docker_jdk_version", "21", label = "Gradle version", description = "The version of the JDK to use during execution of tasks in a JDK.", display = ParameterDisplay.HIDDEN, allowEmpty = false) text("docker_gradle_version", "8.7", label = "Gradle version", description = "The version of Gradle to use during execution of Gradle tasks.", display = ParameterDisplay.HIDDEN, allowEmpty = false) - text("git_main_branch", "1.20.x", label = "Git Main Branch", description = "The git main or default branch to use in VCS operations.", display = ParameterDisplay.HIDDEN, allowEmpty = false) + text("git_main_branch", "1.21.x", label = "Git Main Branch", description = "The git main or default branch to use in VCS operations.", display = ParameterDisplay.HIDDEN, allowEmpty = false) text("git_branch_spec", """ +:refs/heads/(main*) +:refs/heads/(master*) diff --git a/patches/minecraft/net/minecraft/world/entity/Shearable.java.patch b/patches/minecraft/net/minecraft/world/entity/Shearable.java.patch index c68ac8e5b5..4b46f86f3f 100644 --- a/patches/minecraft/net/minecraft/world/entity/Shearable.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/Shearable.java.patch @@ -1,10 +1,18 @@ --- a/net/minecraft/world/entity/Shearable.java +++ b/net/minecraft/world/entity/Shearable.java -@@ -2,6 +_,7 @@ +@@ -2,8 +_,14 @@ import net.minecraft.sounds.SoundSource; -+/** @deprecated Use {@link net.minecraftforge.common.IForgeShearable} */ - public interface Shearable { +-public interface Shearable { ++public interface Shearable extends net.minecraftforge.common.IForgeShearable { ++ /** @deprecated Use {@link net.minecraftforge.common.IForgeShearable#onSheared} */ void shear(SoundSource p_21749_); ++ /** @deprecated Use {@link net.minecraftforge.common.IForgeShearable#isShearable} */ + boolean readyForShearing(); ++ ++ default boolean isShearable(net.minecraft.world.item.ItemStack item, net.minecraft.world.level.Level level, net.minecraft.core.BlockPos pos) { ++ return readyForShearing(); ++ } + } diff --git a/patches/minecraft/net/minecraft/world/entity/animal/MushroomCow.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/MushroomCow.java.patch index a247273dbb..0560a476ba 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/MushroomCow.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/MushroomCow.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/world/entity/animal/MushroomCow.java +++ b/net/minecraft/world/entity/animal/MushroomCow.java -@@ -42,7 +_,7 @@ - import net.minecraft.world.level.block.state.BlockState; - import net.minecraft.world.level.gameevent.GameEvent; - --public class MushroomCow extends Cow implements Shearable, VariantHolder { -+public class MushroomCow extends Cow implements Shearable, VariantHolder, net.minecraftforge.common.IForgeShearable { - private static final EntityDataAccessor DATA_TYPE = SynchedEntityData.defineId(MushroomCow.class, EntityDataSerializers.STRING); - private static final int MUTATE_CHANCE = 1024; - private static final String TAG_STEW_EFFECTS = "stew_effects"; @@ -108,7 +_,7 @@ this.playSound(soundevent, 1.0F, 1.0F); @@ -55,7 +46,7 @@ } @Override -@@ -255,6 +_,17 @@ +@@ -255,6 +_,12 @@ } return mushroomcow$mushroomtype2; @@ -65,11 +56,6 @@ + public java.util.List onSheared(@org.jetbrains.annotations.Nullable Player player, @org.jetbrains.annotations.NotNull ItemStack item, Level world, BlockPos pos, int fortune) { + this.gameEvent(GameEvent.SHEAR, player); + return shearInternal(player == null ? SoundSource.BLOCKS : SoundSource.PLAYERS); -+ } -+ -+ @Override -+ public boolean isShearable(ItemStack item, Level world, BlockPos pos) { -+ return readyForShearing(); } public static enum MushroomType implements StringRepresentable { diff --git a/patches/minecraft/net/minecraft/world/entity/animal/Sheep.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/Sheep.java.patch index 6256c7059d..c8548266ae 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/Sheep.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/Sheep.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/world/entity/animal/Sheep.java +++ b/net/minecraft/world/entity/animal/Sheep.java -@@ -62,7 +_,7 @@ - import net.minecraft.world.level.storage.loot.BuiltInLootTables; - import net.minecraft.world.level.storage.loot.LootTable; - --public class Sheep extends Animal implements Shearable { -+public class Sheep extends Animal implements Shearable, net.minecraftforge.common.IForgeShearable { - private static final int EAT_ANIMATION_TICKS = 40; - private static final EntityDataAccessor DATA_WOOL_ID = SynchedEntityData.defineId(Sheep.class, EntityDataSerializers.BYTE); - private static final Map ITEM_BY_DYE = Util.make(Maps.newEnumMap(DyeColor.class), p_29841_ -> { @@ -208,7 +_,7 @@ @Override public InteractionResult mobInteract(Player p_29853_, InteractionHand p_29854_) { @@ -44,18 +35,13 @@ if (itementity != null) { itementity.setDeltaMovement( itementity.getDeltaMovement() -@@ -375,5 +_,15 @@ +@@ -375,5 +_,10 @@ craftingcontainer.setItem(0, new ItemStack(DyeItem.byColor(p_29832_))); craftingcontainer.setItem(1, new ItemStack(DyeItem.byColor(p_29833_))); return craftingcontainer; + } + + @Override -+ public boolean isShearable(@org.jetbrains.annotations.NotNull ItemStack item, Level world, BlockPos pos) { -+ return readyForShearing(); -+ } -+ -+ @Override + public java.util.List onSheared(@Nullable Player player, ItemStack item, Level world, BlockPos pos, int fortune) { + return shearInternal(player == null ? SoundSource.BLOCKS : SoundSource.PLAYERS); } diff --git a/patches/minecraft/net/minecraft/world/entity/animal/SnowGolem.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/SnowGolem.java.patch index aa2f33beca..001d9e9f03 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/SnowGolem.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/SnowGolem.java.patch @@ -36,16 +36,11 @@ this.shear(SoundSource.PLAYERS); this.gameEvent(GameEvent.SHEAR, p_29920_); if (!this.level().isClientSide) { -@@ -189,4 +_,21 @@ +@@ -189,4 +_,16 @@ public Vec3 getLeashOffset() { return new Vec3(0.0, (double)(0.75F * this.getEyeHeight()), (double)(this.getBbWidth() * 0.4F)); } + -+ @Override -+ public boolean isShearable(@org.jetbrains.annotations.NotNull ItemStack item, Level world, BlockPos pos) { -+ return readyForShearing(); -+ } -+ + @org.jetbrains.annotations.NotNull + @Override + public java.util.List onSheared(@Nullable Player player, @org.jetbrains.annotations.NotNull ItemStack item, Level world, BlockPos pos, int fortune) { diff --git a/patches/minecraft/net/minecraft/world/entity/animal/Wolf.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/Wolf.java.patch index 2fb58ca9c3..f082169734 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/Wolf.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/Wolf.java.patch @@ -1,5 +1,33 @@ --- a/net/minecraft/world/entity/animal/Wolf.java +++ b/net/minecraft/world/entity/animal/Wolf.java +@@ -86,7 +_,7 @@ + import net.minecraft.world.level.pathfinder.PathType; + import net.minecraft.world.phys.Vec3; + +-public class Wolf extends TamableAnimal implements NeutralMob, VariantHolder> { ++public class Wolf extends TamableAnimal implements NeutralMob, VariantHolder>, net.minecraftforge.common.IForgeShearable { + private static final EntityDataAccessor DATA_INTERESTED_ID = SynchedEntityData.defineId(Wolf.class, EntityDataSerializers.BOOLEAN); + private static final EntityDataAccessor DATA_COLLAR_COLOR = SynchedEntityData.defineId(Wolf.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_REMAINING_ANGER_TIME = SynchedEntityData.defineId(Wolf.class, EntityDataSerializers.INT); +@@ -450,16 +_,11 @@ + this.setBodyArmorItem(itemstack.copyWithCount(1)); + itemstack.consume(1, p_30412_); + return InteractionResult.SUCCESS; +- } else if (itemstack.is(Items.SHEARS) ++ } else if (itemstack.canPerformAction(net.minecraftforge.common.ToolActions.SHEARS_HARVEST) + && this.isOwnedBy(p_30412_) + && this.hasArmor() + && (!EnchantmentHelper.hasBindingCurse(this.getBodyArmorItem()) || p_30412_.isCreative())) { +- itemstack.hurtAndBreak(1, p_30412_, getSlotForHand(p_30413_)); +- this.playSound(SoundEvents.ARMOR_UNEQUIP_WOLF); +- ItemStack itemstack1 = this.getBodyArmorItem(); +- this.setBodyArmorItem(ItemStack.EMPTY); +- this.spawnAtLocation(itemstack1); +- return InteractionResult.SUCCESS; ++ return InteractionResult.PASS; + } else if (ArmorMaterials.ARMADILLO.value().repairIngredient().get().test(itemstack) + && this.isInSittingPose() + && this.hasArmor() @@ -498,7 +_,7 @@ } @@ -9,3 +37,28 @@ this.tame(p_336244_); this.navigation.stop(); this.setTarget(null); +@@ -650,6 +_,24 @@ + + return true; + } ++ } ++ ++ @Override ++ public boolean isShearable(ItemStack item, Level world, BlockPos pos) { ++ return this.hasArmor(); ++ } ++ ++ @Override ++ public java.util.List onSheared(@org.jetbrains.annotations.Nullable Player player, @org.jetbrains.annotations.NotNull ItemStack item, Level world, BlockPos pos, int fortune) { ++ if (!this.hasArmor() || (player != null && !this.isOwnedBy(player)) || ++ (EnchantmentHelper.hasBindingCurse(this.getBodyArmorItem()) && (player == null || !player.isCreative())) ++ ) ++ return java.util.Collections.emptyList(); ++ ++ this.playSound(SoundEvents.ARMOR_UNEQUIP_WOLF); ++ var armor = this.getBodyArmorItem(); ++ this.setBodyArmorItem(ItemStack.EMPTY); ++ return java.util.List.of(armor); + } + + @Override diff --git a/patches/minecraft/net/minecraft/world/entity/monster/Bogged.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/Bogged.java.patch new file mode 100644 index 0000000000..eca98e9fdb --- /dev/null +++ b/patches/minecraft/net/minecraft/world/entity/monster/Bogged.java.patch @@ -0,0 +1,49 @@ +--- a/net/minecraft/world/entity/monster/Bogged.java ++++ b/net/minecraft/world/entity/monster/Bogged.java +@@ -74,7 +_,7 @@ + @Override + protected InteractionResult mobInteract(Player p_335303_, InteractionHand p_335145_) { + ItemStack itemstack = p_335303_.getItemInHand(p_335145_); +- if (itemstack.is(Items.SHEARS) && this.readyForShearing()) { ++ if (false && itemstack.is(Items.SHEARS) && this.readyForShearing()) { // Forge: move to onSheared + this.shear(SoundSource.PLAYERS); + this.gameEvent(GameEvent.SHEAR, p_335303_); + if (!this.level().isClientSide) { +@@ -129,12 +_,20 @@ + + @Override + public void shear(SoundSource p_332421_) { +- this.level().playSound(null, this, SoundEvents.BOGGED_SHEAR, p_332421_, 1.0F, 1.0F); +- this.spawnShearedMushrooms(); ++ shearInternal(p_332421_).stream().forEach(stack -> this.spawnAtLocation(stack, this.getBbHeight())); ++ } ++ ++ @Override ++ public java.util.List onSheared(@org.jetbrains.annotations.Nullable Player player, @org.jetbrains.annotations.NotNull ItemStack item, Level world, net.minecraft.core.BlockPos pos, int fortune) { ++ this.gameEvent(GameEvent.SHEAR, player); ++ return shearInternal(player == null ? SoundSource.BLOCKS : SoundSource.PLAYERS); ++ } ++ ++ private java.util.List shearInternal(SoundSource sound) { ++ this.level().playSound(null, this, SoundEvents.BOGGED_SHEAR, sound, 1.0F, 1.0F); + this.setSheared(true); +- } + +- private void spawnShearedMushrooms() { ++ var ret = new java.util.ArrayList(); + if (this.level() instanceof ServerLevel serverlevel && serverlevel.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { + LootTable loottable = serverlevel.getServer().reloadableRegistries().getLootTable(BuiltInLootTables.BOGGED_SHEAR); + LootParams lootparams = new LootParams.Builder(serverlevel) +@@ -143,9 +_,11 @@ + .create(LootContextParamSets.SHEARING); + + for (ItemStack itemstack : loottable.getRandomItems(lootparams)) { +- this.spawnAtLocation(itemstack); ++ ret.add(itemstack); + } + } ++ ++ return ret; + } + + @Override diff --git a/patches/minecraft/net/minecraft/world/item/ShearsItem.java.patch b/patches/minecraft/net/minecraft/world/item/ShearsItem.java.patch index 7c6bee2ef2..9896d0d213 100644 --- a/patches/minecraft/net/minecraft/world/item/ShearsItem.java.patch +++ b/patches/minecraft/net/minecraft/world/item/ShearsItem.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/ShearsItem.java +++ b/net/minecraft/world/item/ShearsItem.java -@@ -79,4 +_,31 @@ +@@ -79,4 +_,32 @@ return super.useOn(p_186371_); } @@ -20,7 +20,8 @@ + var ent = entity.spawnAtLocation(d, 1.0F); + ent.setDeltaMovement(ent.getDeltaMovement().add((double)((rand.nextFloat() - rand.nextFloat()) * 0.1F), (double)(rand.nextFloat() * 0.05F), (double)((rand.nextFloat() - rand.nextFloat()) * 0.1F))); + }); -+ stack.hurtAndBreak(1, playerIn, LivingEntity.getSlotForHand(hand)); ++ if (!drops.isEmpty()) ++ stack.hurtAndBreak(1, playerIn, LivingEntity.getSlotForHand(hand)); + } + return InteractionResult.SUCCESS; + } diff --git a/src/main/java/net/minecraftforge/common/IForgeShearable.java b/src/main/java/net/minecraftforge/common/IForgeShearable.java index 5e7e34021a..8e671d63db 100644 --- a/src/main/java/net/minecraftforge/common/IForgeShearable.java +++ b/src/main/java/net/minecraftforge/common/IForgeShearable.java @@ -23,8 +23,7 @@ import org.jetbrains.annotations.Nullable; * to support mod-shears as well. * */ -public interface IForgeShearable -{ +public interface IForgeShearable { /** * Checks if the object is currently shearable * Example: Sheep return false when they have no wool @@ -34,8 +33,7 @@ public interface IForgeShearable * @param pos Block's position in level. * @return If this is shearable, and onSheared should be called. */ - default boolean isShearable(@NotNull ItemStack item, Level level, BlockPos pos) - { + default boolean isShearable(@NotNull ItemStack item, Level level, BlockPos pos) { return true; } @@ -58,8 +56,7 @@ public interface IForgeShearable * @return A List containing all items from this shearing. May be empty. */ @NotNull - default List onSheared(@Nullable Player player, @NotNull ItemStack item, Level level, BlockPos pos, int fortune) - { + default List onSheared(@Nullable Player player, @NotNull ItemStack item, Level level, BlockPos pos, int fortune) { return Collections.emptyList(); } } diff --git a/src/main/java/net/minecraftforge/common/ToolActions.java b/src/main/java/net/minecraftforge/common/ToolActions.java index 0603027bb0..7f6debc832 100644 --- a/src/main/java/net/minecraftforge/common/ToolActions.java +++ b/src/main/java/net/minecraftforge/common/ToolActions.java @@ -67,7 +67,7 @@ public class ToolActions /** * Used during player attack to figure out if a sweep attack should be performed - * + * * @see IForgeItem#getSweepHitBox */ public static final ToolAction SWORD_SWEEP = ToolAction.get("sword_sweep");