diff --git a/src/main/java/ru/bclib/api/tag/CommonBlockTags.java b/src/main/java/ru/bclib/api/tag/CommonBlockTags.java index 1f18172d..e6b42095 100644 --- a/src/main/java/ru/bclib/api/tag/CommonBlockTags.java +++ b/src/main/java/ru/bclib/api/tag/CommonBlockTags.java @@ -1,23 +1,23 @@ package ru.bclib.api.tag; +import net.minecraft.tags.TagKey; import net.minecraft.world.level.block.Block; -import ru.bclib.api.tag.TagAPI.TagNamed; public class CommonBlockTags { - public static final TagNamed BARREL = TagAPI.makeCommonBlockTag("barrel"); - public static final TagNamed BOOKSHELVES = TagAPI.makeCommonBlockTag("bookshelves"); - public static final TagNamed CHEST = TagAPI.makeCommonBlockTag("chest"); - public static final TagNamed END_STONES = TagAPI.makeCommonBlockTag("end_stones"); - public static final TagNamed GEN_END_STONES = END_STONES; - public static final TagNamed IMMOBILE = TagAPI.makeCommonBlockTag("immobile"); - public static final TagNamed LEAVES = TagAPI.makeCommonBlockTag("leaves"); - public static final TagNamed NETHERRACK = TagAPI.makeCommonBlockTag("netherrack"); - public static final TagNamed NETHER_MYCELIUM = TagAPI.makeCommonBlockTag("nether_mycelium"); - public static final TagNamed NETHER_PORTAL_FRAME = TagAPI.makeCommonBlockTag("nether_pframe"); - public static final TagNamed NETHER_STONES = TagAPI.makeCommonBlockTag("nether_stones"); - public static final TagNamed SAPLINGS = TagAPI.makeCommonBlockTag("saplings"); - public static final TagNamed SOUL_GROUND = TagAPI.makeCommonBlockTag("soul_ground"); - public static final TagNamed WOODEN_BARREL = TagAPI.makeCommonBlockTag("wooden_barrels"); - public static final TagNamed WOODEN_CHEST = TagAPI.makeCommonBlockTag("wooden_chests"); - public static final TagNamed WORKBENCHES = TagAPI.makeCommonBlockTag("workbench"); + public static final TagKey BARREL = TagAPI.makeCommonBlockTag("barrel"); + public static final TagKey BOOKSHELVES = TagAPI.makeCommonBlockTag("bookshelves"); + public static final TagKey CHEST = TagAPI.makeCommonBlockTag("chest"); + public static final TagKey END_STONES = TagAPI.makeCommonBlockTag("end_stones"); + public static final TagKey GEN_END_STONES = END_STONES; + public static final TagKey IMMOBILE = TagAPI.makeCommonBlockTag("immobile"); + public static final TagKey LEAVES = TagAPI.makeCommonBlockTag("leaves"); + public static final TagKey NETHERRACK = TagAPI.makeCommonBlockTag("netherrack"); + public static final TagKey NETHER_MYCELIUM = TagAPI.makeCommonBlockTag("nether_mycelium"); + public static final TagKey NETHER_PORTAL_FRAME = TagAPI.makeCommonBlockTag("nether_pframe"); + public static final TagKey NETHER_STONES = TagAPI.makeCommonBlockTag("nether_stones"); + public static final TagKey SAPLINGS = TagAPI.makeCommonBlockTag("saplings"); + public static final TagKey SOUL_GROUND = TagAPI.makeCommonBlockTag("soul_ground"); + public static final TagKey WOODEN_BARREL = TagAPI.makeCommonBlockTag("wooden_barrels"); + public static final TagKey WOODEN_CHEST = TagAPI.makeCommonBlockTag("wooden_chests"); + public static final TagKey WORKBENCHES = TagAPI.makeCommonBlockTag("workbench"); } diff --git a/src/main/java/ru/bclib/api/tag/CommonItemTags.java b/src/main/java/ru/bclib/api/tag/CommonItemTags.java index 9fb7bfd4..eb96d373 100644 --- a/src/main/java/ru/bclib/api/tag/CommonItemTags.java +++ b/src/main/java/ru/bclib/api/tag/CommonItemTags.java @@ -1,19 +1,19 @@ package ru.bclib.api.tag; +import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; -import ru.bclib.api.tag.TagAPI.TagNamed; public class CommonItemTags { - public final static TagNamed HAMMERS = TagAPI.makeCommonItemTag("hammers"); - public static final TagNamed BARREL = TagAPI.makeCommonItemTag("barrel"); - public static final TagNamed CHEST = TagAPI.makeCommonItemTag("chest"); - public static final TagNamed SHEARS = TagAPI.makeCommonItemTag("shears"); - public static final TagNamed FURNACES = TagAPI.makeCommonItemTag("furnaces"); - public static final TagNamed IRON_INGOTS = TagAPI.makeCommonItemTag("iron_ingots"); - public static final TagNamed LEAVES = TagAPI.makeCommonItemTag("leaves"); - public static final TagNamed SAPLINGS = TagAPI.makeCommonItemTag("saplings"); - public static final TagNamed SOUL_GROUND = TagAPI.makeCommonItemTag("soul_ground"); - public static final TagNamed WOODEN_BARREL = TagAPI.makeCommonItemTag("wooden_barrels"); - public static final TagNamed WOODEN_CHEST = TagAPI.makeCommonItemTag("wooden_chests"); - public static final TagNamed WORKBENCHES = TagAPI.makeCommonItemTag("workbench"); + public final static TagKey HAMMERS = TagAPI.makeCommonItemTag("hammers"); + public static final TagKey BARREL = TagAPI.makeCommonItemTag("barrel"); + public static final TagKey CHEST = TagAPI.makeCommonItemTag("chest"); + public static final TagKey SHEARS = TagAPI.makeCommonItemTag("shears"); + public static final TagKey FURNACES = TagAPI.makeCommonItemTag("furnaces"); + public static final TagKey IRON_INGOTS = TagAPI.makeCommonItemTag("iron_ingots"); + public static final TagKey LEAVES = TagAPI.makeCommonItemTag("leaves"); + public static final TagKey SAPLINGS = TagAPI.makeCommonItemTag("saplings"); + public static final TagKey SOUL_GROUND = TagAPI.makeCommonItemTag("soul_ground"); + public static final TagKey WOODEN_BARREL = TagAPI.makeCommonItemTag("wooden_barrels"); + public static final TagKey WOODEN_CHEST = TagAPI.makeCommonItemTag("wooden_chests"); + public static final TagKey WORKBENCHES = TagAPI.makeCommonItemTag("workbench"); } diff --git a/src/main/java/ru/bclib/api/tag/TagAPI.java b/src/main/java/ru/bclib/api/tag/TagAPI.java index 126a8b7e..a1977efd 100644 --- a/src/main/java/ru/bclib/api/tag/TagAPI.java +++ b/src/main/java/ru/bclib/api/tag/TagAPI.java @@ -5,10 +5,8 @@ import com.google.common.collect.Sets; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.ResourceManager; -import net.minecraft.tags.BlockTags; -import net.minecraft.tags.ItemTags; -import net.minecraft.tags.TagKey; import net.minecraft.tags.Tag; +import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; @@ -17,94 +15,83 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import ru.bclib.mixin.common.DiggerItemAccessor; -import java.util.List; import java.util.Map; -import java.util.Random; import java.util.Set; -import java.util.function.Supplier; +import java.util.function.BiConsumer; public class TagAPI { private static final Map> TAGS_BLOCK = Maps.newConcurrentMap(); private static final Map> TAGS_ITEM = Maps.newConcurrentMap(); /** - * Get or create {@link TagNamed}. + * Get or create {@link TagKey}. * - * @param containerSupplier - {@link TagCollection} {@link Supplier} tag collection; + * @param registry - {@link Registry} tag collection; * @param id - {@link ResourceLocation} tag id. - * @return {@link TagNamed}. + * @return {@link TagKey}. */ - public static TagNamed makeTag(Supplier> containerSupplier, TagLocation id) { - Tag tag = containerSupplier.get().getTag(id); - return tag == null ? new Delegate<>(id, containerSupplier) : CommonDelegate.proxy((TagKey) tag); + public static TagKey makeTag(Registry registry, TagLocation id) { + //TODO: 1.18.2 check if registry.key() gets the correct result + return registry + .getTagNames() + .filter(tagKey -> tagKey.location().equals(id)) + .findAny() + .orElse(TagKey.create(registry.key(), id)); } /** - * Get or create {@link Block} {@link TagNamed} with mod namespace. + * Get or create {@link Block} {@link TagKey} with mod namespace. * * @param modID - {@link String} mod namespace (mod id); * @param name - {@link String} tag name. - * @return {@link Block} {@link TagNamed}. + * @return {@link Block} {@link TagKey}. */ - public static TagNamed makeBlockTag(String modID, String name) { - return makeTag(BlockTags::getAllTags, new TagLocation<>(modID, name)); + public static TagKey makeBlockTag(String modID, String name) { + return makeTag(Registry.BLOCK, new TagLocation<>(modID, name)); } /** - * Get or create {@link Item} {@link TagNamed} with mod namespace. + * Get or create {@link Item} {@link TagKey} with mod namespace. * * @param modID - {@link String} mod namespace (mod id); * @param name - {@link String} tag name. - * @return {@link Item} {@link TagNamed}. + * @return {@link Item} {@link TagKey}. */ - public static TagNamed makeItemTag(String modID, String name) { - return makeTag(ItemTags::getAllTags, new TagLocation<>(modID, name)); + public static TagKey makeItemTag(String modID, String name) { + return makeTag(Registry.ITEM, new TagLocation<>(modID, name)); } /** - * Get or create {@link Block} {@link TagNamed}. + * Get or create {@link Block} {@link TagKey}. * * @param name - {@link String} tag name. - * @return {@link Block} {@link TagNamed}. + * @return {@link Block} {@link TagKey}. * @see Fabric Wiki (Tags) */ - public static TagNamed makeCommonBlockTag(String name) { - return makeTag(BlockTags::getAllTags, new TagLocation<>("c", name)); + public static TagKey makeCommonBlockTag(String name) { + return makeTag(Registry.BLOCK, new TagLocation<>("c", name)); } /** - * Get or create {@link Item} {@link TagNamed}. + * Get or create {@link Item} {@link TagKey}. * * @param name - {@link String} tag name. - * @return {@link Item} {@link TagNamed}. + * @return {@link Item} {@link TagKey}. * @see Fabric Wiki (Tags) */ - public static TagNamed makeCommonItemTag(String name) { - return makeTag(ItemTags::getAllTags, new TagLocation<>("c", name)); - } - - /** - * Get or create Minecraft {@link Block} {@link TagNamed}. - * - * @param name - {@link String} tag name. - * @return {@link Block} {@link TagNamed}. - */ - @Deprecated(forRemoval = true) - public static TagNamed getMCBlockTag(String name) { - ResourceLocation id = new ResourceLocation(name); - Tag tag = BlockTags.getAllTags().getTag(id); - return CommonDelegate.proxy(tag == null ? (TagKey) TagFactory.BLOCK.create(id): (TagKey) tag); + public static TagKey makeCommonItemTag(String name) { + return makeTag(Registry.ITEM, new TagLocation<>("c", name)); } /** * Initializes basic tags. Should be called only in BCLib main class. */ public static void init() { - addBlockTag(CommonBlockTags.BOOKSHELVES.getName(), Blocks.BOOKSHELF); - addBlockTag(CommonBlockTags.CHEST.getName(), Blocks.CHEST); - addItemTag(CommonItemTags.CHEST.getName(), Items.CHEST); - addItemTag(CommonItemTags.IRON_INGOTS.getName(), Items.IRON_INGOT); - addItemTag(CommonItemTags.FURNACES.getName(), Blocks.FURNACE); + addBlockTag(CommonBlockTags.BOOKSHELVES, Blocks.BOOKSHELF); + addBlockTag(CommonBlockTags.CHEST, Blocks.CHEST); + addItemTag(CommonItemTags.CHEST, Items.CHEST); + addItemTag(CommonItemTags.IRON_INGOTS, Items.IRON_INGOT); + addItemTag(CommonItemTags.FURNACES, Blocks.FURNACE); } /** @@ -127,6 +114,15 @@ public class TagAPI { public static void addBlockTag(TagLocation tagID, Block... blocks) { addBlockTagUntyped(tagID, blocks); } + + /** + * Adds one Tag to multiple Blocks. + * @param tagID {@link TagKey} tag ID. + * @param blocks array of {@link Block} to add into tag. + */ + public static void addBlockTag(TagKey tagID, Block... blocks) { + addBlockTagUntyped(tagID.location(), blocks); + } /** * Adds one Tag to multiple Blocks. @@ -163,6 +159,15 @@ public class TagAPI { public static void addItemTag(TagLocation tagID, ItemLike... items) { addItemTagUntyped(tagID, items); } + + /** + * Adds one Tag to multiple Items. + * @param tagID {@link TagKey} tag ID. + * @param items array of {@link ItemLike} to add into tag. + */ + public static void addItemTag(TagKey tagID, ItemLike... items) { + addItemTagUntyped(tagID.location(), items); + } /** * Adds one Tag to multiple Items. @@ -189,16 +194,14 @@ public class TagAPI { * @param tagsMap The map that will hold the registered Tags * @return The {@code tagsMap} Parameter. */ - public static Map apply(String directory, Map tagsMap) { - Map> tagMap = null; + public static Map apply(String directory, Map tagsMap) { + final BiConsumer> consumer; + consumer = (id, ids) -> apply(tagsMap.computeIfAbsent(id, key -> Tag.Builder.tag()), ids); if ("tags/blocks".equals(directory)) { - tagMap = TAGS_BLOCK; + TAGS_BLOCK.forEach(consumer); } else if ("tags/items".equals(directory)) { - tagMap = TAGS_ITEM; - } - if (tagMap != null) { - tagMap.forEach((id, ids) -> apply(tagsMap.computeIfAbsent(id, key -> Tag.Builder.tag()), ids)); + TAGS_ITEM.forEach(consumer); } return tagsMap; } @@ -214,16 +217,8 @@ public class TagAPI { ids.forEach(value -> builder.addElement(value, "BCLib Code")); return builder; } - - /** - * Extends {@link TagNamed} to return a type safe {@link TagLocation}. This Type was introduced to - * allow type-safe definition of Tags using their ResourceLocation. - * @param The Type of the underlying {@link Tag} - */ - public interface TagNamed extends TagKey{ - TagLocation getName(); - } - + + /** * Extends (without changing) {@link ResourceLocation}. This Type was introduced to allow type-safe definition af * Tags using their ResourceLocation. @@ -233,68 +228,17 @@ public class TagAPI { public TagLocation(String string) { super(string); } - + public TagLocation(String string, String string2) { super(string, string2); } - + public TagLocation(ResourceLocation location) { super(location.getNamespace(), location.getPath()); } public static TagLocation of(TagKey tag){ - return new TagLocation(tag.getName()); - } - } - - private abstract static class CommonDelegate implements TagNamed { - protected final TagKey delegate; - protected CommonDelegate(TagKey source){ - this.delegate = source; - } - - public static TagNamed proxy(TagKey source){ - if (source instanceof TagNamed typed) return typed; - return new ProxyDelegate<>(source); - } - - @Override - public boolean contains(T object) { - return delegate.contains(object); - } - - @Override - public List getValues() { - return delegate.getValues(); - } - - @Override - public T getRandomElement(Random random) { - return delegate.getRandomElement(random); - } - } - - private static final class ProxyDelegate extends CommonDelegate{ - private final TagLocation id; - private ProxyDelegate(Tag.Named source) { - super( source); - id = new TagLocation<>(source.getName() - .getNamespace(), source.getName() - .getPath()); - } - @Override - public TagLocation getName(){ - return id; - } - } - - private static final class Delegate extends CommonDelegate{ - public Delegate(TagLocation id, Supplier> containerSupplier) { - super( new TagDelegate<>(id, containerSupplier)); - } - @Override - public TagLocation getName(){ - return (TagLocation)delegate.getName(); + return new TagLocation(tag.location()); } } diff --git a/src/main/java/ru/bclib/mixin/common/TagLoaderMixin.java b/src/main/java/ru/bclib/mixin/common/TagLoaderMixin.java index a5fd7f45..cf5722e8 100644 --- a/src/main/java/ru/bclib/mixin/common/TagLoaderMixin.java +++ b/src/main/java/ru/bclib/mixin/common/TagLoaderMixin.java @@ -3,6 +3,7 @@ package ru.bclib.mixin.common; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.Tag; import net.minecraft.tags.TagLoader; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -13,11 +14,13 @@ import java.util.Map; @Mixin(TagLoader.class) public class TagLoaderMixin { + @Final @Shadow private String directory; - @ModifyArg(method = "loadAndBuild", at = @At(value = "INVOKE", target = "Lnet/minecraft/tags/TagLoader;build(Ljava/util/Map;)Lnet/minecraft/tags/TagCollection;")) + @ModifyArg(method = "loadAndBuild", at = @At(value = "INVOKE", target = "Lnet/minecraft/tags/TagLoader;build(Ljava/util/Map;)Ljava/util/Map;")) public Map be_modifyTags(Map tagsMap) { + //TODO: 1.18.2 Check if this still works as expected return TagAPI.apply(directory, tagsMap); } }