This commit is contained in:
paulevsGitch 2020-10-07 03:12:44 +03:00
parent 178836965d
commit 20bb6379bf
22 changed files with 161 additions and 56 deletions

View file

@ -8,7 +8,6 @@ import org.jetbrains.annotations.NotNull;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import it.unimi.dsi.fastutil.ints.IntList; import it.unimi.dsi.fastutil.ints.IntList;
import me.shedaniel.math.Point; import me.shedaniel.math.Point;
import me.shedaniel.math.Rectangle; import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.EntryStack;
@ -17,12 +16,10 @@ import me.shedaniel.rei.api.widgets.Widgets;
import me.shedaniel.rei.gui.entries.RecipeEntry; import me.shedaniel.rei.gui.entries.RecipeEntry;
import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; import me.shedaniel.rei.gui.entries.SimpleRecipeEntry;
import me.shedaniel.rei.gui.widget.Widget; import me.shedaniel.rei.gui.widget.Widget;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.gui.DrawableHelper;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import ru.betterend.util.LangUtil; import ru.betterend.util.LangUtil;
public class REIAnvilCategory implements TransferRecipeCategory<REIAnvilDisplay> { public class REIAnvilCategory implements TransferRecipeCategory<REIAnvilDisplay> {

View file

@ -9,11 +9,9 @@ import org.jetbrains.annotations.NotNull;
import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.EntryStack;
import me.shedaniel.rei.api.TransferRecipeDisplay; import me.shedaniel.rei.api.TransferRecipeDisplay;
import me.shedaniel.rei.server.ContainerInfo; import me.shedaniel.rei.server.ContainerInfo;
import net.minecraft.recipe.Recipe; import net.minecraft.recipe.Recipe;
import net.minecraft.screen.ScreenHandler; import net.minecraft.screen.ScreenHandler;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import ru.betterend.recipe.AnvilSmithingRecipe; import ru.betterend.recipe.AnvilSmithingRecipe;
public class REIAnvilDisplay implements TransferRecipeDisplay { public class REIAnvilDisplay implements TransferRecipeDisplay {

View file

@ -3,14 +3,11 @@ package ru.betterend.compat;
import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.EntryStack;
import me.shedaniel.rei.api.RecipeHelper; import me.shedaniel.rei.api.RecipeHelper;
import me.shedaniel.rei.api.plugins.REIPluginV0; import me.shedaniel.rei.api.plugins.REIPluginV0;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.recipe.BlastingRecipe; import net.minecraft.recipe.BlastingRecipe;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import ru.betterend.BetterEnd; import ru.betterend.BetterEnd;
import ru.betterend.recipe.AlloyingRecipe; import ru.betterend.recipe.AlloyingRecipe;
import ru.betterend.recipe.AnvilSmithingRecipe; import ru.betterend.recipe.AnvilSmithingRecipe;

View file

@ -8,7 +8,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import net.minecraft.client.recipebook.ClientRecipeBook; import net.minecraft.client.recipebook.ClientRecipeBook;
import net.minecraft.client.recipebook.RecipeBookGroup; import net.minecraft.client.recipebook.RecipeBookGroup;
import net.minecraft.recipe.Recipe; import net.minecraft.recipe.Recipe;
import ru.betterend.recipe.AlloyingRecipe; import ru.betterend.recipe.AlloyingRecipe;
@Mixin(ClientRecipeBook.class) @Mixin(ClientRecipeBook.class)

View file

@ -16,6 +16,7 @@ import net.minecraft.client.sound.MusicType;
import net.minecraft.client.world.ClientWorld; import net.minecraft.client.world.ClientWorld;
import net.minecraft.sound.MusicSound; import net.minecraft.sound.MusicSound;
import net.minecraft.world.World; import net.minecraft.world.World;
import ru.betterend.util.MHelper;
@Mixin(MinecraftClient.class) @Mixin(MinecraftClient.class)
public class MinecraftClientMixin { public class MinecraftClientMixin {
@ -36,7 +37,7 @@ public class MinecraftClientMixin {
private void getEndMusic(CallbackInfoReturnable<MusicSound> info) { private void getEndMusic(CallbackInfoReturnable<MusicSound> info) {
if (!(this.currentScreen instanceof CreditsScreen) && this.player != null) { if (!(this.currentScreen instanceof CreditsScreen) && this.player != null) {
if (this.player.world.getRegistryKey() == World.END) { if (this.player.world.getRegistryKey() == World.END) {
if (this.inGameHud.getBossBarHud().shouldPlayDragonMusic()) { if (this.inGameHud.getBossBarHud().shouldPlayDragonMusic() && MHelper.lengthSqr(this.player.getX(), this.player.getZ()) < 250000) {
info.setReturnValue(MusicType.DRAGON); info.setReturnValue(MusicType.DRAGON);
} }
else { else {

View file

@ -19,7 +19,6 @@ import net.minecraft.screen.ScreenHandlerContext;
import net.minecraft.screen.ScreenHandlerType; import net.minecraft.screen.ScreenHandlerType;
import net.minecraft.tag.BlockTags; import net.minecraft.tag.BlockTags;
import net.minecraft.world.World; import net.minecraft.world.World;
import ru.betterend.recipe.AnvilSmithingRecipe; import ru.betterend.recipe.AnvilSmithingRecipe;
@Mixin(AnvilScreenHandler.class) @Mixin(AnvilScreenHandler.class)

View file

@ -1,15 +1,8 @@
package ru.betterend.mixin.common; package ru.betterend.mixin.common;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.At;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.ChunkRegion;
import net.minecraft.world.gen.StructureAccessor;
import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGenerator;
import ru.betterend.registry.DefaultBiomeFeatures;
@Mixin(ChunkGenerator.class) @Mixin(ChunkGenerator.class)
public class ChunkGeneratorMixin { public class ChunkGeneratorMixin {

View file

@ -1,17 +1,11 @@
package ru.betterend.mixin.common; package ru.betterend.mixin.common;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.DefaultBiomeCreator; import net.minecraft.world.biome.DefaultBiomeCreator;
import net.minecraft.world.biome.GenerationSettings; import net.minecraft.world.biome.GenerationSettings;
import net.minecraft.world.gen.GenerationStep;
import net.minecraft.world.gen.feature.ConfiguredFeatures;
import net.minecraft.world.gen.feature.ConfiguredStructureFeatures;
import net.minecraft.world.gen.surfacebuilder.ConfiguredSurfaceBuilders;
import ru.betterend.registry.DefaultBiomeFeatures;
@Mixin(DefaultBiomeCreator.class) @Mixin(DefaultBiomeCreator.class)
public class DefaultBiomeCreatorMixin { public class DefaultBiomeCreatorMixin {
@ -20,13 +14,13 @@ public class DefaultBiomeCreatorMixin {
return null; return null;
}; };
@Overwrite /*@Overwrite
public static Biome createEndHighlands() { public static Biome createEndHighlands() {
GenerationSettings.Builder builder = (new GenerationSettings.Builder()) GenerationSettings.Builder builder = (new GenerationSettings.Builder())
.surfaceBuilder(ConfiguredSurfaceBuilders.END).structureFeature(ConfiguredStructureFeatures.END_CITY) .surfaceBuilder(ConfiguredSurfaceBuilders.END).structureFeature(ConfiguredStructureFeatures.END_CITY)
.feature(GenerationStep.Feature.SURFACE_STRUCTURES, ConfiguredFeatures.END_GATEWAY) .feature(GenerationStep.Feature.SURFACE_STRUCTURES, ConfiguredFeatures.END_GATEWAY)
.feature(GenerationStep.Feature.VEGETAL_DECORATION, ConfiguredFeatures.CHORUS_PLANT) .feature(GenerationStep.Feature.VEGETAL_DECORATION, ConfiguredFeatures.CHORUS_PLANT)
.feature(DefaultBiomeFeatures.MOUNTAINS.getFeatureStep(), DefaultBiomeFeatures.MOUNTAINS.getFeatureConfigured()); .structureFeature(DefaultBiomeFeatureRegistry.MOUNTAINS.getFeatureConfigured());
return composeEndSpawnSettings(builder); return composeEndSpawnSettings(builder);
} }*/
} }

View file

@ -0,0 +1,59 @@
package ru.betterend.noise;
import java.util.Random;
import net.minecraft.util.math.MathHelper;
import ru.betterend.util.MHelper;
public class VoronoiNoise {
private static final Random RANDOM = new Random();
final int seed;
final double scale;
final double separation;
public VoronoiNoise(int seed, double side, double separation) {
this.seed = seed;
this.scale = 1.0 / side;
this.separation = MathHelper.clamp(separation, 0, 1);
}
private int getSeed(int x, int y, int z) {
int h = seed + x * 374761393 + y * 668265263 + z;
h = (h ^ (h >> 13)) * 1274126177;
return h ^ (h >> 16);
}
public double sample(float x, float y, float z) {
return sample(MHelper.floor(x), MHelper.floor(y), MHelper.floor(z));
}
public double sample(int x, int y, int z) {
double posX = x * scale;
double posY = y * scale;
double posZ = z * scale;
int posXI = MHelper.floor(posX);
int posYI = MHelper.floor(posY);
int posZI = MHelper.floor(posZ);
double distance = Double.MAX_VALUE;
for (int px = -1; px < 2; px++) {
double pointX = posXI + px;
for (int py = -1; py < 2; py++) {
double pointY = posYI + py;
for (int pz = -1; pz < 2; pz++) {
double pointZ = posZI + pz;
RANDOM.setSeed(getSeed(posXI + px, posYI + py, posZI + pz));
double posXN = pointX + RANDOM.nextDouble() * separation;
double posYN = pointY + RANDOM.nextDouble() * separation;
double posZN = pointZ + RANDOM.nextDouble() * separation;
double dist2 = MHelper.lengthSqr(posXN - posX, posYN - posY, posZN - posZ);
if (dist2 < distance) {
distance = dist2;
}
}
}
}
return distance;
}
}

View file

@ -4,7 +4,6 @@ import com.google.gson.JsonObject;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.Inventory; import net.minecraft.inventory.Inventory;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@ -19,7 +18,6 @@ import net.minecraft.util.JsonHelper;
import net.minecraft.util.collection.DefaultedList; import net.minecraft.util.collection.DefaultedList;
import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.Registry;
import net.minecraft.world.World; import net.minecraft.world.World;
import ru.betterend.BetterEnd; import ru.betterend.BetterEnd;
import ru.betterend.registry.ItemTagRegistry; import ru.betterend.registry.ItemTagRegistry;

View file

@ -0,0 +1,10 @@
package ru.betterend.registry;
import net.minecraft.world.gen.GenerationStep.Feature;
import ru.betterend.world.structures.EndStructureFeature;
import ru.betterend.world.structures.features.StructureMountain;
public class DefaultBiomeFeatureRegistry {
//public static final EndFeature MOUNTAINS = EndFeature.makeChunkFeature("mountains", new MountainFeature());
public static final EndStructureFeature MOUNTAINS = new EndStructureFeature("mountains", new StructureMountain(), Feature.RAW_GENERATION, 6, 3);
}

View file

@ -1,8 +0,0 @@
package ru.betterend.registry;
import ru.betterend.world.features.EndFeature;
import ru.betterend.world.features.MountainFeature;
public class DefaultBiomeFeatures {
public static final EndFeature MOUNTAINS = EndFeature.makeChunkFeature("mountains", new MountainFeature());
}

View file

@ -5,7 +5,6 @@ import ru.betterend.world.features.DoublePlantFeature;
import ru.betterend.world.features.EndFeature; import ru.betterend.world.features.EndFeature;
import ru.betterend.world.features.EndLakeFeature; import ru.betterend.world.features.EndLakeFeature;
import ru.betterend.world.features.MossyGlowshroomFeature; import ru.betterend.world.features.MossyGlowshroomFeature;
import ru.betterend.world.features.MountainFeature;
import ru.betterend.world.features.SinglePlantFeature; import ru.betterend.world.features.SinglePlantFeature;
import ru.betterend.world.features.VineFeature; import ru.betterend.world.features.VineFeature;

View file

@ -5,11 +5,9 @@ import java.util.Arrays;
import net.fabricmc.fabric.api.tag.TagRegistry; import net.fabricmc.fabric.api.tag.TagRegistry;
import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl; import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl;
import net.fabricmc.fabric.impl.tool.attribute.handlers.ModdedToolsVanillaBlocksToolHandler; import net.fabricmc.fabric.impl.tool.attribute.handlers.ModdedToolsVanillaBlocksToolHandler;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.tag.Tag; import net.minecraft.tag.Tag;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import ru.betterend.BetterEnd; import ru.betterend.BetterEnd;
public class ItemTagRegistry { public class ItemTagRegistry {

View file

@ -69,12 +69,28 @@ public class MHelper {
return a > b ? a : b; return a > b ? a : b;
} }
public static float lengthSqr(float x, float y, float z) {
return x * x + y * y + z * z;
}
public static double lengthSqr(double x, double y, double z) {
return x * x + y * y + z * z;
}
public static float length(float x, float y, float z) { public static float length(float x, float y, float z) {
return (float) Math.sqrt(x * x + y * y + z * z); return (float) Math.sqrt(lengthSqr(x, y, z));
}
public static float lengthSqr(float x, float y) {
return x * x + y * y;
}
public static double lengthSqr(double x, double y) {
return x * x + y * y;
} }
public static float length(float x, float y) { public static float length(float x, float y) {
return (float) Math.sqrt(x * x + y * y); return (float) Math.sqrt(lengthSqr(x, y));
} }
public static float dot(float x1, float y1, float z1, float x2, float y2, float z2) { public static float dot(float x1, float y1, float z1, float x2, float y2, float z2) {

View file

@ -12,6 +12,7 @@ import com.google.common.collect.Sets;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockPos.Mutable;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
import net.minecraft.world.ServerWorldAccess; import net.minecraft.world.ServerWorldAccess;
import ru.betterend.util.BlocksHelper; import ru.betterend.util.BlocksHelper;
@ -39,6 +40,7 @@ public abstract class SDF {
return this; return this;
} }
@Deprecated
public void fillRecursive(ServerWorldAccess world, BlockPos start, int dx, int dy, int dz) { public void fillRecursive(ServerWorldAccess world, BlockPos start, int dx, int dy, int dz) {
Map<BlockPos, PosInfo> mapWorld = Maps.newHashMap(); Map<BlockPos, PosInfo> mapWorld = Maps.newHashMap();
Map<BlockPos, PosInfo> addInfo = Maps.newHashMap(); Map<BlockPos, PosInfo> addInfo = Maps.newHashMap();
@ -107,17 +109,19 @@ public abstract class SDF {
ends.add(new BlockPos(0, 0, 0)); ends.add(new BlockPos(0, 0, 0));
boolean run = true; boolean run = true;
Mutable bPos = new Mutable();
while (run) { while (run) {
for (BlockPos center: ends) { for (BlockPos center: ends) {
for (Direction dir: Direction.values()) { for (Direction dir: Direction.values()) {
BlockPos pos = center.offset(dir); bPos.set(center).move(dir);
BlockPos wpos = pos.add(start); BlockPos wpos = bPos.add(start);
if (!blocks.contains(pos) && canReplace.apply(world.getBlockState(wpos))) { if (!blocks.contains(bPos) && canReplace.apply(world.getBlockState(wpos))) {
if (this.getDistance(pos.getX(), pos.getY(), pos.getZ()) < 0) { if (this.getDistance(bPos.getX(), bPos.getY(), bPos.getZ()) < 0) {
BlockState state = getBlockState(wpos); BlockState state = getBlockState(wpos);
PosInfo.create(mapWorld, addInfo, wpos).setState(state); PosInfo.create(mapWorld, addInfo, wpos).setState(state);
add.add(pos); add.add(bPos.toImmutable());
} }
} }
} }
@ -152,6 +156,8 @@ public abstract class SDF {
} }
public void fillRecursive(StructureWorld world, BlockPos start) { public void fillRecursive(StructureWorld world, BlockPos start) {
long t = System.currentTimeMillis();
Map<BlockPos, PosInfo> mapWorld = Maps.newHashMap(); Map<BlockPos, PosInfo> mapWorld = Maps.newHashMap();
Map<BlockPos, PosInfo> addInfo = Maps.newHashMap(); Map<BlockPos, PosInfo> addInfo = Maps.newHashMap();
Set<BlockPos> blocks = Sets.newHashSet(); Set<BlockPos> blocks = Sets.newHashSet();
@ -160,17 +166,19 @@ public abstract class SDF {
ends.add(new BlockPos(0, 0, 0)); ends.add(new BlockPos(0, 0, 0));
boolean run = true; boolean run = true;
Mutable bPos = new Mutable();
while (run) { while (run) {
for (BlockPos center: ends) { for (BlockPos center: ends) {
for (Direction dir: Direction.values()) { for (Direction dir: Direction.values()) {
BlockPos pos = center.offset(dir); bPos.set(center).move(dir);
BlockPos wpos = pos.add(start); BlockPos wpos = bPos.add(start);
if (!blocks.contains(pos)) { if (!blocks.contains(bPos)) {
if (this.getDistance(pos.getX(), pos.getY(), pos.getZ()) < 0) { if (this.getDistance(bPos.getX(), bPos.getY(), bPos.getZ()) < 0) {
BlockState state = getBlockState(wpos); BlockState state = getBlockState(wpos);
PosInfo.create(mapWorld, addInfo, wpos).setState(state); PosInfo.create(mapWorld, addInfo, wpos).setState(state);
add.add(pos); add.add(bPos.toImmutable());
} }
} }
} }
@ -198,5 +206,8 @@ public abstract class SDF {
BlockState state = postProcess.apply(info); BlockState state = postProcess.apply(info);
world.setBlock(info.getPos(), state); world.setBlock(info.getPos(), state);
}); });
t = System.currentTimeMillis() - t;
System.out.println("SDF " + t + " ms");
} }
} }

View file

@ -11,6 +11,7 @@ import net.minecraft.world.gen.feature.DefaultFeatureConfig;
import ru.betterend.registry.BiomeRegistry; import ru.betterend.registry.BiomeRegistry;
import ru.betterend.util.BlocksHelper; import ru.betterend.util.BlocksHelper;
@Deprecated
public class MountainFeature extends DefaultFeature { public class MountainFeature extends DefaultFeature {
private static final Mutable POS = new Mutable(); private static final Mutable POS = new Mutable();

View file

@ -17,6 +17,8 @@ import net.minecraft.world.chunk.Chunk;
public class StructureWorld { public class StructureWorld {
private Map<ChunkPos, Part> parts = Maps.newHashMap(); private Map<ChunkPos, Part> parts = Maps.newHashMap();
private ChunkPos lastPos;
private Part lastPart;
private int minX = Integer.MAX_VALUE; private int minX = Integer.MAX_VALUE;
private int minY = Integer.MAX_VALUE; private int minY = Integer.MAX_VALUE;
private int minZ = Integer.MAX_VALUE; private int minZ = Integer.MAX_VALUE;
@ -46,6 +48,12 @@ public class StructureWorld {
public void setBlock(BlockPos pos, BlockState state) { public void setBlock(BlockPos pos, BlockState state) {
ChunkPos cPos = new ChunkPos(pos); ChunkPos cPos = new ChunkPos(pos);
if (cPos.equals(lastPos)) {
lastPart.addBlock(pos, state);
return;
}
Part part = parts.get(cPos); Part part = parts.get(cPos);
if (part == null) { if (part == null) {
part = new Part(); part = new Part();
@ -59,6 +67,9 @@ public class StructureWorld {
if (pos.getY() < minY) minY = pos.getY(); if (pos.getY() < minY) minY = pos.getY();
if (pos.getY() > maxY) maxY = pos.getY(); if (pos.getY() > maxY) maxY = pos.getY();
part.addBlock(pos, state); part.addBlock(pos, state);
lastPos = cPos;
lastPart = part;
} }
public boolean placeChunk(StructureWorldAccess world, ChunkPos chunkPos) { public boolean placeChunk(StructureWorldAccess world, ChunkPos chunkPos) {

View file

@ -37,7 +37,10 @@ public abstract class SDFStructureFeature extends StructureFeatureBase {
int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG); int y = chunkGenerator.getHeight(x, z, Type.WORLD_SURFACE_WG);
if (y > 5) { if (y > 5) {
BlockPos start = new BlockPos(x, y, z); BlockPos start = new BlockPos(x, y, z);
long t = System.currentTimeMillis();
VoxelPiece piece = new VoxelPiece((world) -> { ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); }, random.nextInt()); VoxelPiece piece = new VoxelPiece((world) -> { ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); }, random.nextInt());
t = System.currentTimeMillis() - t;
System.out.println("Structure " + t + " ms");
this.children.add(piece); this.children.add(piece);
} }
this.setBoundingBoxFromChildren(); this.setBoundingBoxFromChildren();

View file

@ -31,8 +31,6 @@ import ru.betterend.util.sdf.primitive.SDFSphere;
public class StructureGiantMossyGlowshroom extends SDFStructureFeature { public class StructureGiantMossyGlowshroom extends SDFStructureFeature {
@Override @Override
protected SDF getSDF(BlockPos center, Random random) { protected SDF getSDF(BlockPos center, Random random) {
System.out.println(center);
SDFCapedCone cone1 = new SDFCapedCone().setHeight(2.5F).setRadius1(1.5F).setRadius2(2.5F); SDFCapedCone cone1 = new SDFCapedCone().setHeight(2.5F).setRadius1(1.5F).setRadius2(2.5F);
SDFCapedCone cone2 = new SDFCapedCone().setHeight(3F).setRadius1(2.5F).setRadius2(13F); SDFCapedCone cone2 = new SDFCapedCone().setHeight(3F).setRadius1(2.5F).setRadius2(13F);
SDF posedCone2 = new SDFTranslate().setTranslate(0, 5, 0).setSource(cone2); SDF posedCone2 = new SDFTranslate().setTranslate(0, 5, 0).setSource(cone2);

View file

@ -0,0 +1,33 @@
package ru.betterend.world.structures.features;
import java.util.Random;
import net.minecraft.block.Blocks;
import net.minecraft.util.math.BlockPos;
import ru.betterend.noise.VoronoiNoise;
import ru.betterend.util.MHelper;
import ru.betterend.util.sdf.SDF;
import ru.betterend.util.sdf.operator.SDFDisplacement;
import ru.betterend.util.sdf.operator.SDFScale;
import ru.betterend.util.sdf.operator.SDFSmoothUnion;
import ru.betterend.util.sdf.operator.SDFTranslate;
import ru.betterend.util.sdf.primitive.SDFCapedCone;
public class StructureMountain extends SDFStructureFeature {
@Override
protected SDF getSDF(BlockPos center, Random random) {
SDFCapedCone cone1 = new SDFCapedCone().setHeight(20F).setRadius1(40F).setRadius2(0F);
SDFCapedCone cone2 = new SDFCapedCone().setHeight(10F).setRadius1(0F).setRadius2(40F);
cone1.setBlock(Blocks.END_STONE);
cone2.setBlock(Blocks.END_STONE);
SDF mountain = new SDFSmoothUnion().setRadius(15)
.setSourceA(new SDFTranslate().setTranslate(0, 20, 1).setSource(cone1))
.setSourceB(new SDFTranslate().setTranslate(0, -10, 1).setSource(cone2));
mountain = new SDFScale().setScale(MHelper.randRange(1F, 2.5F, random)).setSource(mountain);
VoronoiNoise noise = new VoronoiNoise(random.nextInt(), 20, 0.75);
mountain = new SDFDisplacement().setFunction((pos) -> {
return (float) noise.sample(pos.getX(), pos.getY(), pos.getZ()) * 15F;
}).setSource(mountain);
return mountain;
}
}

View file

@ -22,13 +22,11 @@ public class VoxelPiece extends BasePiece {
world = new StructureWorld(); world = new StructureWorld();
function.accept(world); function.accept(world);
this.boundingBox = world.getBounds(); this.boundingBox = world.getBounds();
System.out.println(this.boundingBox);
} }
public VoxelPiece(StructureManager manager, CompoundTag tag) { public VoxelPiece(StructureManager manager, CompoundTag tag) {
super(StructureRegistry.VOXEL_PIECE, tag); super(StructureRegistry.VOXEL_PIECE, tag);
this.boundingBox = world.getBounds(); this.boundingBox = world.getBounds();
System.out.println(this.boundingBox);
} }
@Override @Override