Better Shears Integration

This commit is contained in:
Frank 2021-10-25 15:32:17 +02:00
parent 1195bcf4c3
commit 7f7e4bfa4c
11 changed files with 169 additions and 3 deletions

View file

@ -61,6 +61,8 @@ public class TagAPI {
public final static Tag.Named<Item> ITEM_HAMMERS = makeCommonItemTag("hammers");
public static final Tag.Named<Item> ITEM_SAPLINGS = makeCommonItemTag("saplings");
public static final Tag.Named<Item> ITEM_LEAVES = makeCommonItemTag("leaves");
public static final Tag.Named<Item> ITEM_SHEARS = getMCItemTag("shears");
public static final Tag.Named<Item> ITEM_COMMON_SHEARS = makeCommonItemTag("shears");
/**
@ -131,6 +133,18 @@ public class TagAPI {
return tag == null ? (Named<Block>) TagRegistry.block(id) : (Named<Block>) 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<Item> getMCItemTag(String name) {
ResourceLocation id = new ResourceLocation(name);
Tag<Item> tag = ItemTags.getAllTags().getTag(id);
return tag == null ? (Named<Item>) TagRegistry.item(id) : (Named<Item>) tag;
}
/**
* Adds {@link Block} to NETHER_GROUND and GEN_TERRAIN tags to process it properly in terrain generators and block logic.
*

View file

@ -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);
}
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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<Item> {
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<Item> {
else if (item instanceof BaseHoeItem) {
TagAPI.addTag((Tag.Named<Item>) FabricToolTags.HOES, item);
}
else if (item instanceof BaseShearsItem) {
TagAPI.addTags(item, (Tag.Named<Item>) FabricToolTags.SHEARS, TagAPI.ITEM_SHEARS, TagAPI.ITEM_COMMON_SHEARS);
DispenserBlock.registerBehavior(item.asItem(), new ShearsDispenseItemBehavior());
}
return item;
}

View file

@ -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