diff --git a/src/main/java/ru/bclib/api/TagAPI.java b/src/main/java/ru/bclib/api/TagAPI.java index 215c060b..f27570f4 100644 --- a/src/main/java/ru/bclib/api/TagAPI.java +++ b/src/main/java/ru/bclib/api/TagAPI.java @@ -61,6 +61,8 @@ public class TagAPI { public final static Tag.Named ITEM_HAMMERS = makeCommonItemTag("hammers"); public static final Tag.Named ITEM_SAPLINGS = makeCommonItemTag("saplings"); public static final Tag.Named ITEM_LEAVES = makeCommonItemTag("leaves"); + public static final Tag.Named ITEM_SHEARS = getMCItemTag("shears"); + public static final Tag.Named ITEM_COMMON_SHEARS = makeCommonItemTag("shears"); /** @@ -131,6 +133,18 @@ public class TagAPI { return tag == null ? (Named) TagRegistry.block(id) : (Named) tag; } + /** + * Get or create Minecraft {@link Item} {@link Tag.Named}. + * + * @param name - {@link String} tag name. + * @return {@link Item} {@link Tag.Named}. + */ + public static Tag.Named getMCItemTag(String name) { + ResourceLocation id = new ResourceLocation(name); + Tag tag = ItemTags.getAllTags().getTag(id); + return tag == null ? (Named) TagRegistry.item(id) : (Named) tag; + } + /** * Adds {@link Block} to NETHER_GROUND and GEN_TERRAIN tags to process it properly in terrain generators and block logic. * diff --git a/src/main/java/ru/bclib/blocks/BaseOreBlock.java b/src/main/java/ru/bclib/blocks/BaseOreBlock.java index 168c5bce..f529c082 100644 --- a/src/main/java/ru/bclib/blocks/BaseOreBlock.java +++ b/src/main/java/ru/bclib/blocks/BaseOreBlock.java @@ -9,6 +9,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.OreBlock; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockState; @@ -28,11 +29,16 @@ public class BaseOreBlock extends OreBlock implements BlockModelProvider { private final int maxCount; public BaseOreBlock(Item drop, int minCount, int maxCount, int experience) { - super(FabricBlockSettings.of(Material.STONE, MaterialColor.SAND) + this(drop, minCount, maxCount, experience, FabricBlockSettings.of(Material.STONE, MaterialColor.SAND) .hardness(3F) .resistance(9F) .requiresCorrectToolForDrops() - .sound(SoundType.STONE), UniformInt.of(1, experience)); + .sound(SoundType.STONE)); + + } + + public BaseOreBlock(Item drop, int minCount, int maxCount, int experience, Properties properties) { + super(properties, UniformInt.of(experience>0?1:0, experience)); this.dropItem = drop; this.minCount = minCount; this.maxCount = maxCount; @@ -41,10 +47,14 @@ public class BaseOreBlock extends OreBlock implements BlockModelProvider { @Override @SuppressWarnings("deprecation") public List getDrops(BlockState state, LootContext.Builder builder) { + return getDroppedItems(this, dropItem, maxCount, minCount, state, builder); + } + + public static List getDroppedItems(ItemLike block, Item dropItem, int maxCount, int minCount, BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); if (tool != null && tool.isCorrectToolForDrops(state)) { if (EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { - return Collections.singletonList(new ItemStack(this)); + return Collections.singletonList(new ItemStack(block)); } int count; int enchantment = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool); diff --git a/src/main/java/ru/bclib/items/tool/BaseShearsItem.java b/src/main/java/ru/bclib/items/tool/BaseShearsItem.java new file mode 100644 index 00000000..90af703f --- /dev/null +++ b/src/main/java/ru/bclib/items/tool/BaseShearsItem.java @@ -0,0 +1,21 @@ +package ru.bclib.items.tool; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.ShearsItem; +import ru.bclib.api.TagAPI; + +public class BaseShearsItem extends ShearsItem { + public BaseShearsItem(Properties properties) { + super(properties); + } + + public static boolean isShear(ItemStack itemStack, Item item){ + if (item == Items.SHEARS){ + return itemStack.is(item) | itemStack.is(TagAPI.ITEM_COMMON_SHEARS) || itemStack.is(TagAPI.ITEM_SHEARS); + } else { + return itemStack.is(item); + } + } +} diff --git a/src/main/java/ru/bclib/mixin/common/shears/BeehiveBlockMixin.java b/src/main/java/ru/bclib/mixin/common/shears/BeehiveBlockMixin.java new file mode 100644 index 00000000..9dc7ed3f --- /dev/null +++ b/src/main/java/ru/bclib/mixin/common/shears/BeehiveBlockMixin.java @@ -0,0 +1,17 @@ +package ru.bclib.mixin.common.shears; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.BeehiveBlock; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import ru.bclib.items.tool.BaseShearsItem; + +@Mixin(BeehiveBlock.class) +public class BeehiveBlockMixin { + @Redirect(method="use", at=@At(value="INVOKE", target="Lnet/minecraft/world/item/ItemStack;is(Lnet/minecraft/world/item/Item;)Z")) + public boolean bn_useProxy(ItemStack itemStack, Item item){ + return BaseShearsItem.isShear(itemStack, item); + } +} diff --git a/src/main/java/ru/bclib/mixin/common/shears/DiggingEnchantmentMixin.java b/src/main/java/ru/bclib/mixin/common/shears/DiggingEnchantmentMixin.java new file mode 100644 index 00000000..47354537 --- /dev/null +++ b/src/main/java/ru/bclib/mixin/common/shears/DiggingEnchantmentMixin.java @@ -0,0 +1,17 @@ +package ru.bclib.mixin.common.shears; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.DiggingEnchantment; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import ru.bclib.items.tool.BaseShearsItem; + +@Mixin(DiggingEnchantment.class) +public class DiggingEnchantmentMixin { + @Redirect(method="canEnchant", at=@At(value="INVOKE", target="Lnet/minecraft/world/item/ItemStack;is(Lnet/minecraft/world/item/Item;)Z")) + public boolean bn_mobInteractProxy(ItemStack itemStack, Item item){ + return BaseShearsItem.isShear(itemStack, item); + } +} diff --git a/src/main/java/ru/bclib/mixin/common/shears/MushroomCowMixin.java b/src/main/java/ru/bclib/mixin/common/shears/MushroomCowMixin.java new file mode 100644 index 00000000..d58d93c1 --- /dev/null +++ b/src/main/java/ru/bclib/mixin/common/shears/MushroomCowMixin.java @@ -0,0 +1,17 @@ +package ru.bclib.mixin.common.shears; + +import net.minecraft.world.entity.animal.MushroomCow; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import ru.bclib.items.tool.BaseShearsItem; + +@Mixin(MushroomCow.class) +public class MushroomCowMixin { + @Redirect(method="mobInteract", at=@At(value="INVOKE", target="Lnet/minecraft/world/item/ItemStack;is(Lnet/minecraft/world/item/Item;)Z")) + public boolean bn_mobInteractProxy(ItemStack itemStack, Item item){ + return BaseShearsItem.isShear(itemStack, item); + } +} diff --git a/src/main/java/ru/bclib/mixin/common/shears/PumpkinBlockMixin.java b/src/main/java/ru/bclib/mixin/common/shears/PumpkinBlockMixin.java new file mode 100644 index 00000000..deb7fc08 --- /dev/null +++ b/src/main/java/ru/bclib/mixin/common/shears/PumpkinBlockMixin.java @@ -0,0 +1,17 @@ +package ru.bclib.mixin.common.shears; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.PumpkinBlock; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import ru.bclib.items.tool.BaseShearsItem; + +@Mixin(PumpkinBlock.class) +public abstract class PumpkinBlockMixin { + @Redirect(method="use", at=@At(value="INVOKE", target="Lnet/minecraft/world/item/ItemStack;is(Lnet/minecraft/world/item/Item;)Z")) + public boolean bn_useProxy(ItemStack itemStack, Item item){ + return BaseShearsItem.isShear(itemStack, item); + } +} diff --git a/src/main/java/ru/bclib/mixin/common/shears/SheepMixin.java b/src/main/java/ru/bclib/mixin/common/shears/SheepMixin.java new file mode 100644 index 00000000..77e42736 --- /dev/null +++ b/src/main/java/ru/bclib/mixin/common/shears/SheepMixin.java @@ -0,0 +1,17 @@ +package ru.bclib.mixin.common.shears; + +import net.minecraft.world.entity.animal.Sheep; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import ru.bclib.items.tool.BaseShearsItem; + +@Mixin(Sheep.class) +public class SheepMixin { + @Redirect(method="mobInteract", at=@At(value="INVOKE", target="Lnet/minecraft/world/item/ItemStack;is(Lnet/minecraft/world/item/Item;)Z")) + public boolean bn_mobInteractProxy(ItemStack itemStack, Item item){ + return BaseShearsItem.isShear(itemStack, item); + } +} diff --git a/src/main/java/ru/bclib/mixin/common/shears/SnowGolemMixin.java b/src/main/java/ru/bclib/mixin/common/shears/SnowGolemMixin.java new file mode 100644 index 00000000..f6fc2f6a --- /dev/null +++ b/src/main/java/ru/bclib/mixin/common/shears/SnowGolemMixin.java @@ -0,0 +1,17 @@ +package ru.bclib.mixin.common.shears; + +import net.minecraft.world.entity.animal.SnowGolem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import ru.bclib.items.tool.BaseShearsItem; + +@Mixin(SnowGolem.class) +public class SnowGolemMixin { + @Redirect(method="mobInteract", at=@At(value="INVOKE", target="Lnet/minecraft/world/item/ItemStack;is(Lnet/minecraft/world/item/Item;)Z")) + public boolean bn_mobInteractProxy(ItemStack itemStack, Item item){ + return BaseShearsItem.isShear(itemStack, item); + } +} diff --git a/src/main/java/ru/bclib/mixin/common/shears/TripWireBlockMixi.java b/src/main/java/ru/bclib/mixin/common/shears/TripWireBlockMixi.java new file mode 100644 index 00000000..1f3bfb1c --- /dev/null +++ b/src/main/java/ru/bclib/mixin/common/shears/TripWireBlockMixi.java @@ -0,0 +1,17 @@ +package ru.bclib.mixin.common.shears; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.TripWireBlock; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import ru.bclib.items.tool.BaseShearsItem; + +@Mixin(TripWireBlock.class) +public class TripWireBlockMixi { + @Redirect(method="playerWillDestroy", at=@At(value="INVOKE", target="Lnet/minecraft/world/item/ItemStack;is(Lnet/minecraft/world/item/Item;)Z")) + public boolean bn_useProxy(ItemStack itemStack, Item item){ + return BaseShearsItem.isShear(itemStack, item); + } +} diff --git a/src/main/java/ru/bclib/registry/ItemRegistry.java b/src/main/java/ru/bclib/registry/ItemRegistry.java index 270e06da..c406faf3 100644 --- a/src/main/java/ru/bclib/registry/ItemRegistry.java +++ b/src/main/java/ru/bclib/registry/ItemRegistry.java @@ -4,6 +4,7 @@ import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockSource; import net.minecraft.core.Direction; import net.minecraft.core.dispenser.DefaultDispenseItemBehavior; +import net.minecraft.core.dispenser.ShearsDispenseItemBehavior; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; import net.minecraft.tags.Tag; @@ -18,11 +19,11 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ShovelItem; import net.minecraft.world.item.SpawnEggItem; import net.minecraft.world.item.SwordItem; -import net.minecraft.world.item.TieredItem; import net.minecraft.world.level.block.DispenserBlock; import ru.bclib.api.TagAPI; import ru.bclib.items.BaseDiscItem; import ru.bclib.items.BaseDrinkItem; +import ru.bclib.items.tool.BaseShearsItem; import ru.bclib.items.BaseSpawnEggItem; import ru.bclib.items.ModelProviderItem; import ru.bclib.items.tool.BaseAxeItem; @@ -49,7 +50,7 @@ public abstract class ItemRegistry extends BaseRegistry { return item; } - public TieredItem registerTool(String name, TieredItem item) { + public Item registerTool(String name, Item item) { ResourceLocation id = createModId(name); registerItem(id, item, BaseRegistry.getModItems(id.getNamespace())); @@ -68,6 +69,10 @@ public abstract class ItemRegistry extends BaseRegistry { else if (item instanceof BaseHoeItem) { TagAPI.addTag((Tag.Named) FabricToolTags.HOES, item); } + else if (item instanceof BaseShearsItem) { + TagAPI.addTags(item, (Tag.Named) FabricToolTags.SHEARS, TagAPI.ITEM_SHEARS, TagAPI.ITEM_COMMON_SHEARS); + DispenserBlock.registerBehavior(item.asItem(), new ShearsDispenseItemBehavior()); + } return item; } diff --git a/src/main/resources/bclib.mixins.common.json b/src/main/resources/bclib.mixins.common.json index f430772b..978e39a7 100644 --- a/src/main/resources/bclib.mixins.common.json +++ b/src/main/resources/bclib.mixins.common.json @@ -20,7 +20,14 @@ "AnvilMenuMixin", "TagLoaderMixin", "BiomeMixin", - "MainMixin" + "MainMixin", + "shears.BeehiveBlockMixin", + "shears.DiggingEnchantmentMixin", + "shears.MushroomCowMixin", + "shears.PumpkinBlockMixin", + "shears.SheepMixin", + "shears.SnowGolemMixin", + "shears.TripWireBlockMixi" ], "injectors": { "defaultRequire": 1