Surface rule builder fixes

This commit is contained in:
paulevsGitch 2021-12-04 11:52:58 +03:00
parent 8809fa7dbc
commit 3a06c128ed
5 changed files with 22 additions and 28 deletions

View file

@ -4,10 +4,15 @@ import net.fabricmc.api.EnvType;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.biome.Biomes;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.levelgen.Noises;
import net.minecraft.world.level.levelgen.SurfaceRules;
import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource;
import ru.bclib.api.TagAPI;
import ru.bclib.api.WorldDataAPI;
import ru.bclib.api.biomes.BiomeAPI;
import ru.bclib.api.biomes.SurfaceRuleBuilder;
import ru.bclib.api.dataexchange.DataExchangeAPI;
import ru.bclib.api.dataexchange.handler.autosync.Chunker;
import ru.bclib.api.dataexchange.handler.autosync.HelloClient;
@ -51,6 +56,16 @@ public class BCLib implements ModInitializer {
BCLibPatch.register();
Configs.save();
RuleSource rule = SurfaceRuleBuilder
.start()
.biome(Biomes.END_HIGHLANDS)
.filler(Blocks.STONE.defaultBlockState())
.subsurface(Blocks.DIRT.defaultBlockState(), 3)
.surface(Blocks.GRASS_BLOCK.defaultBlockState())
.ceil(Blocks.DEEPSLATE.defaultBlockState())
.build();
BiomeAPI.addSurfaceRule(Biomes.END_HIGHLANDS.location(), rule);
}
public static boolean isDevEnvironment() {
@ -64,9 +79,4 @@ public class BCLib implements ModInitializer {
public static ResourceLocation makeID(String path) {
return new ResourceLocation(MOD_ID, path);
}
private static SurfaceRules.ConditionSource surfaceNoiseAbove(double d) {
return SurfaceRules.noiseCondition(Noises.SURFACE, d / 8.25, Double.MAX_VALUE);
}
}

View file

@ -21,7 +21,6 @@ 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;
@ -93,8 +92,8 @@ public class PostInitAPI {
}
if (block instanceof TagProvider) {
TagProvider.class.cast(block).addTags(blockTags, itemTags);
TagAPI.addTags(block, CollectionsUtil.toArray(blockTags));
TagAPI.addTags(block, CollectionsUtil.toArray(itemTags));
blockTags.forEach(tag -> TagAPI.addTag(tag, block));
itemTags.forEach(tag -> TagAPI.addTag(tag, block));
blockTags.clear();
itemTags.clear();
}

View file

@ -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(CollectionsUtil.toArray(rules)));
provider.setSurfaceRule(SurfaceRules.sequence(rules.toArray(new SurfaceRules.RuleSource[rules.size()])));
}
else {
provider.setSurfaceRule(null);

View file

@ -8,7 +8,6 @@ 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;
@ -57,7 +56,8 @@ public class SurfaceRuleBuilder {
public SurfaceRuleBuilder surface(BlockState state) {
entryInstance = getFromCache("surface_" + state.toString(), () -> {
RuleSource rule = SurfaceRules.state(state);
return new SurfaceRuleEntry(1, SurfaceRules.ifTrue(SurfaceRules.ON_FLOOR, rule));
rule = SurfaceRules.ifTrue(SurfaceRules.ON_FLOOR, rule);
return new SurfaceRuleEntry(1, rule);
});
rules.add(entryInstance);
return this;
@ -73,7 +73,7 @@ public class SurfaceRuleBuilder {
entryInstance = getFromCache("subsurface_" + depth + "_" + state.toString(), () -> {
RuleSource rule = SurfaceRules.state(state);
rule = SurfaceRules.ifTrue(SurfaceRules.stoneDepthCheck(depth, false, false, CaveSurface.FLOOR), rule);
return new SurfaceRuleEntry(2, SurfaceRules.ifTrue(SurfaceRules.ON_FLOOR, rule));
return new SurfaceRuleEntry(2, rule);
});
rules.add(entryInstance);
return this;
@ -131,7 +131,7 @@ public class SurfaceRuleBuilder {
public SurfaceRules.RuleSource build() {
Collections.sort(rules);
List<SurfaceRules.RuleSource> ruleList = rules.stream().map(entry -> entry.getRule()).toList();
SurfaceRules.RuleSource[] ruleArray = CollectionsUtil.toArray(ruleList);
SurfaceRules.RuleSource[] ruleArray = ruleList.toArray(new SurfaceRules.RuleSource[ruleList.size()]);
SurfaceRules.RuleSource rule = SurfaceRules.sequence(ruleArray);
if (biomeKey != null) {
rule = SurfaceRules.ifTrue(SurfaceRules.isBiome(biomeKey), rule);

View file

@ -1,6 +1,5 @@
package ru.bclib.util;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@ -44,18 +43,4 @@ public class CollectionsUtil {
}
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> E[] toArray(List<E> 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;
};
}