From 7f17e1261c00ee47dfeb055bcf1cdb611c62b181 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 4 Dec 2021 11:16:13 +0300 Subject: [PATCH] Tag Provider, list to array function, surface builder fix --- src/main/java/ru/bclib/api/PostInitAPI.java | 15 +++++++++++++ .../java/ru/bclib/api/biomes/BiomeAPI.java | 2 +- .../bclib/api/biomes/SurfaceRuleBuilder.java | 4 +++- .../java/ru/bclib/interfaces/TagProvider.java | 12 +++++++++++ .../registry/BaseBlockEntityRenders.java | 6 +++--- .../java/ru/bclib/util/CollectionsUtil.java | 21 ++++++++++++++++--- 6 files changed, 52 insertions(+), 8 deletions(-) create mode 100644 src/main/java/ru/bclib/interfaces/TagProvider.java diff --git a/src/main/java/ru/bclib/api/PostInitAPI.java b/src/main/java/ru/bclib/api/PostInitAPI.java index 58f97714..4f0db942 100644 --- a/src/main/java/ru/bclib/api/PostInitAPI.java +++ b/src/main/java/ru/bclib/api/PostInitAPI.java @@ -6,6 +6,8 @@ import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; import net.minecraft.client.renderer.RenderType; import net.minecraft.core.Registry; +import net.minecraft.tags.Tag; +import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.blocks.BaseBarrelBlock; @@ -17,13 +19,17 @@ import ru.bclib.client.render.BaseChestBlockEntityRenderer; import ru.bclib.client.render.BaseSignBlockEntityRenderer; import ru.bclib.interfaces.PostInitable; import ru.bclib.interfaces.RenderLayerProvider; +import ru.bclib.interfaces.TagProvider; import ru.bclib.registry.BaseBlockEntities; +import ru.bclib.util.CollectionsUtil; import java.util.List; import java.util.function.Consumer; public class PostInitAPI { private static List> postInitFunctions = Lists.newArrayList(); + private static List> blockTags = Lists.newArrayList(); + private static List> itemTags = Lists.newArrayList(); /** * Register a new function which will be called after all mods are initiated. Will be called on both client and server. @@ -49,6 +55,8 @@ public class PostInitAPI { } }); postInitFunctions = null; + blockTags = null; + itemTags = null; BiomeAPI.loadFabricAPIBiomes(); } @@ -83,5 +91,12 @@ public class PostInitAPI { else if (block instanceof BaseFurnaceBlock) { BaseBlockEntities.FURNACE.registerBlock(block); } + if (block instanceof TagProvider) { + TagProvider.class.cast(block).addTags(blockTags, itemTags); + TagAPI.addTags(block, CollectionsUtil.toArray(blockTags)); + TagAPI.addTags(block, CollectionsUtil.toArray(itemTags)); + blockTags.clear(); + itemTags.clear(); + } } } diff --git a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java index 9bad5eee..0367f9a4 100644 --- a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java +++ b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java @@ -439,7 +439,7 @@ public class BiomeAPI { SurfaceRuleProvider provider = SurfaceRuleProvider.class.cast(generator); if (rules.size() > 0) { rules.add(provider.getSurfaceRule()); - provider.setSurfaceRule(SurfaceRules.sequence(rules.toArray(new SurfaceRules.RuleSource[rules.size()]))); + provider.setSurfaceRule(SurfaceRules.sequence(CollectionsUtil.toArray(rules))); } else { provider.setSurfaceRule(null); diff --git a/src/main/java/ru/bclib/api/biomes/SurfaceRuleBuilder.java b/src/main/java/ru/bclib/api/biomes/SurfaceRuleBuilder.java index 767a2e6f..44ec50ee 100644 --- a/src/main/java/ru/bclib/api/biomes/SurfaceRuleBuilder.java +++ b/src/main/java/ru/bclib/api/biomes/SurfaceRuleBuilder.java @@ -8,6 +8,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.SurfaceRules; import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource; import net.minecraft.world.level.levelgen.placement.CaveSurface; +import ru.bclib.util.CollectionsUtil; import java.util.Collections; import java.util.List; @@ -129,7 +130,8 @@ public class SurfaceRuleBuilder { */ public SurfaceRules.RuleSource build() { Collections.sort(rules); - SurfaceRules.RuleSource[] ruleArray = rules.toArray(new SurfaceRules.RuleSource[rules.size()]); + List ruleList = rules.stream().map(entry -> entry.getRule()).toList(); + SurfaceRules.RuleSource[] ruleArray = CollectionsUtil.toArray(ruleList); SurfaceRules.RuleSource rule = SurfaceRules.sequence(ruleArray); if (biomeKey != null) { rule = SurfaceRules.ifTrue(SurfaceRules.isBiome(biomeKey), rule); diff --git a/src/main/java/ru/bclib/interfaces/TagProvider.java b/src/main/java/ru/bclib/interfaces/TagProvider.java new file mode 100644 index 00000000..3f0ede66 --- /dev/null +++ b/src/main/java/ru/bclib/interfaces/TagProvider.java @@ -0,0 +1,12 @@ +package ru.bclib.interfaces; + +import net.minecraft.tags.Tag; +import net.minecraft.tags.Tag.Named; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; + +import java.util.List; + +public interface TagProvider { + void addTags(List> blockTags, List> itemTags); +} diff --git a/src/main/java/ru/bclib/registry/BaseBlockEntityRenders.java b/src/main/java/ru/bclib/registry/BaseBlockEntityRenders.java index 5b8050ba..98994667 100644 --- a/src/main/java/ru/bclib/registry/BaseBlockEntityRenders.java +++ b/src/main/java/ru/bclib/registry/BaseBlockEntityRenders.java @@ -2,14 +2,14 @@ package ru.bclib.registry; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.client.rendereregistry.v1.BlockEntityRendererRegistry; +import net.fabricmc.fabric.api.client.rendering.v1.BlockEntityRendererRegistry; import ru.bclib.client.render.BaseChestBlockEntityRenderer; import ru.bclib.client.render.BaseSignBlockEntityRenderer; @Environment(EnvType.CLIENT) public class BaseBlockEntityRenders { public static void register() { - BlockEntityRendererRegistry.INSTANCE.register(BaseBlockEntities.CHEST, BaseChestBlockEntityRenderer::new); - BlockEntityRendererRegistry.INSTANCE.register(BaseBlockEntities.SIGN, BaseSignBlockEntityRenderer::new); + BlockEntityRendererRegistry.register(BaseBlockEntities.CHEST, BaseChestBlockEntityRenderer::new); + BlockEntityRendererRegistry.register(BaseBlockEntities.SIGN, BaseSignBlockEntityRenderer::new); } } diff --git a/src/main/java/ru/bclib/util/CollectionsUtil.java b/src/main/java/ru/bclib/util/CollectionsUtil.java index 609d392a..a7309cab 100644 --- a/src/main/java/ru/bclib/util/CollectionsUtil.java +++ b/src/main/java/ru/bclib/util/CollectionsUtil.java @@ -1,5 +1,6 @@ package ru.bclib.util; +import java.lang.reflect.Array; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -13,7 +14,7 @@ public class CollectionsUtil { * @param list {@link List} to make mutable. * @return {@link ArrayList} or original {@link List} if it is mutable. */ - public static List getMutable(List list) { + public static List getMutable(List list) { if (list instanceof ArrayList) { return list; } @@ -25,7 +26,7 @@ public class CollectionsUtil { * @param set {@link Set} to make mutable. * @return {@link HashSet} or original {@link Set} if it is mutable. */ - public static Set getMutable(Set set) { + public static Set getMutable(Set set) { if (set instanceof HashSet) { return set; } @@ -37,10 +38,24 @@ public class CollectionsUtil { * @param map {@link Map} to make mutable. * @return {@link HashMap} or original {@link Map} if it is mutable. */ - public static Map getMutable(Map map) { + public static Map getMutable(Map map) { if (map instanceof HashMap) { return map; } return new HashMap<>(map); } + + /** + * Converts list into array. + * @param list {@link List} to convert. + * @return array of list elements. If list is empty will return empty {@link Object} array. + */ + public static E[] toArray(List list) { + if (list.isEmpty()) { + return (E[]) new Object[0]; + } + E[] result = (E[]) Array.newInstance(list.get(0).getClass(), list.size()); + result = list.toArray(result); + return result; + }; }