Neon cactus growing (WIP) & additional textures
|
@ -8,7 +8,8 @@ import ru.betterend.registry.EndPortals;
|
||||||
|
|
||||||
public class BlockProperties {
|
public class BlockProperties {
|
||||||
public static final EnumProperty<HydraluxShape> HYDRALUX_SHAPE = EnumProperty.create("shape", HydraluxShape.class);
|
public static final EnumProperty<HydraluxShape> HYDRALUX_SHAPE = EnumProperty.create("shape", HydraluxShape.class);
|
||||||
public final static EnumProperty<PedestalState> PEDESTAL_STATE = EnumProperty.create("state", PedestalState.class);
|
public static final EnumProperty<PedestalState> PEDESTAL_STATE = EnumProperty.create("state", PedestalState.class);
|
||||||
|
public static final EnumProperty<CactusBottom> CACTUS_BOTTOM = EnumProperty.create("bottom", CactusBottom.class);
|
||||||
public static final EnumProperty<TripleShape> TRIPLE_SHAPE = EnumProperty.create("shape", TripleShape.class);
|
public static final EnumProperty<TripleShape> TRIPLE_SHAPE = EnumProperty.create("shape", TripleShape.class);
|
||||||
public static final EnumProperty<PentaShape> PENTA_SHAPE = EnumProperty.create("shape", PentaShape.class);
|
public static final EnumProperty<PentaShape> PENTA_SHAPE = EnumProperty.create("shape", PentaShape.class);
|
||||||
|
|
||||||
|
@ -30,14 +31,16 @@ public class BlockProperties {
|
||||||
public static final IntegerProperty AGE = IntegerProperty.create("age", 0, 3);
|
public static final IntegerProperty AGE = IntegerProperty.create("age", 0, 3);
|
||||||
|
|
||||||
public static enum TripleShape implements StringRepresentable {
|
public static enum TripleShape implements StringRepresentable {
|
||||||
TOP("top"),
|
TOP("top", 0),
|
||||||
MIDDLE("middle"),
|
MIDDLE("middle", 1),
|
||||||
BOTTOM("bottom");
|
BOTTOM("bottom", 2);
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
|
private final int index;
|
||||||
|
|
||||||
TripleShape(String name) {
|
TripleShape(String name, int index) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
this.index = index;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -49,6 +52,14 @@ public class BlockProperties {
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getIndex() {
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TripleShape fromIndex(int index) {
|
||||||
|
return index > 1 ? BOTTOM : index == 1 ? MIDDLE : TOP;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static enum PedestalState implements StringRepresentable {
|
public static enum PedestalState implements StringRepresentable {
|
||||||
|
@ -162,4 +173,26 @@ public class BlockProperties {
|
||||||
return light;
|
return light;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static enum CactusBottom implements StringRepresentable {
|
||||||
|
EMPTY("empty"),
|
||||||
|
SAND("sand"),
|
||||||
|
MOSS("moss");
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
CactusBottom(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getSerializedName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,16 @@
|
||||||
package ru.betterend.blocks;
|
package ru.betterend.blocks;
|
||||||
|
|
||||||
import java.util.EnumMap;
|
import java.util.EnumMap;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
|
||||||
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
|
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.core.BlockPos.MutableBlockPos;
|
||||||
import net.minecraft.core.Direction;
|
import net.minecraft.core.Direction;
|
||||||
import net.minecraft.core.Direction.Axis;
|
import net.minecraft.core.Direction.Axis;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.world.item.context.BlockPlaceContext;
|
import net.minecraft.world.item.context.BlockPlaceContext;
|
||||||
import net.minecraft.world.level.BlockGetter;
|
import net.minecraft.world.level.BlockGetter;
|
||||||
import net.minecraft.world.level.LevelAccessor;
|
import net.minecraft.world.level.LevelAccessor;
|
||||||
|
@ -27,14 +30,18 @@ import net.minecraft.world.level.material.Fluids;
|
||||||
import net.minecraft.world.phys.shapes.CollisionContext;
|
import net.minecraft.world.phys.shapes.CollisionContext;
|
||||||
import net.minecraft.world.phys.shapes.Shapes;
|
import net.minecraft.world.phys.shapes.Shapes;
|
||||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||||
|
import ru.betterend.blocks.BlockProperties.CactusBottom;
|
||||||
import ru.betterend.blocks.BlockProperties.TripleShape;
|
import ru.betterend.blocks.BlockProperties.TripleShape;
|
||||||
import ru.betterend.blocks.basis.BlockBaseNotFull;
|
import ru.betterend.blocks.basis.BlockBaseNotFull;
|
||||||
import ru.betterend.client.render.ERenderLayer;
|
import ru.betterend.client.render.ERenderLayer;
|
||||||
import ru.betterend.interfaces.IRenderTypeable;
|
import ru.betterend.interfaces.IRenderTypeable;
|
||||||
|
import ru.betterend.registry.EndBlocks;
|
||||||
|
import ru.betterend.registry.EndTags;
|
||||||
import ru.betterend.util.BlocksHelper;
|
import ru.betterend.util.BlocksHelper;
|
||||||
|
|
||||||
public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterloggedBlock, IRenderTypeable {
|
public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterloggedBlock, IRenderTypeable {
|
||||||
public static final EnumProperty<TripleShape> SHAPE = BlockProperties.TRIPLE_SHAPE;
|
public static final EnumProperty<TripleShape> SHAPE = BlockProperties.TRIPLE_SHAPE;
|
||||||
|
public static final EnumProperty<CactusBottom> CACTUS_BOTTOM = BlockProperties.CACTUS_BOTTOM;
|
||||||
public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED;
|
public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED;
|
||||||
public static final DirectionProperty FACING = BlockStateProperties.FACING;
|
public static final DirectionProperty FACING = BlockStateProperties.FACING;
|
||||||
|
|
||||||
|
@ -44,20 +51,32 @@ public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterlogg
|
||||||
private static final EnumMap<Axis, VoxelShape> SMALL_SHAPES = Maps.newEnumMap(Axis.class);
|
private static final EnumMap<Axis, VoxelShape> SMALL_SHAPES = Maps.newEnumMap(Axis.class);
|
||||||
|
|
||||||
public NeonCactusBlock() {
|
public NeonCactusBlock() {
|
||||||
super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(15));
|
super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(15).randomTicks());
|
||||||
registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false).setValue(FACING, Direction.UP).setValue(SHAPE, TripleShape.TOP));
|
registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false).setValue(FACING, Direction.UP).setValue(SHAPE, TripleShape.TOP));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> stateManager) {
|
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> stateManager) {
|
||||||
stateManager.add(SHAPE, WATERLOGGED, FACING);
|
stateManager.add(SHAPE, CACTUS_BOTTOM, WATERLOGGED, FACING);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockState getStateForPlacement(BlockPlaceContext ctx) {
|
public BlockState getStateForPlacement(BlockPlaceContext ctx) {
|
||||||
LevelAccessor worldAccess = ctx.getLevel();
|
LevelAccessor world = ctx.getLevel();
|
||||||
BlockPos blockPos = ctx.getClickedPos();
|
BlockPos pos = ctx.getClickedPos();
|
||||||
return this.defaultBlockState().setValue(WATERLOGGED, worldAccess.getFluidState(blockPos).getType() == Fluids.WATER).setValue(FACING, ctx.getClickedFace());
|
Direction dir = ctx.getClickedFace();
|
||||||
|
BlockState down = world.getBlockState(pos.relative(dir.getOpposite()));
|
||||||
|
BlockState state = this.defaultBlockState().setValue(WATERLOGGED, world.getFluidState(pos).getType() == Fluids.WATER).setValue(FACING, ctx.getClickedFace());
|
||||||
|
if (down.is(Blocks.END_STONE) || down.is(EndBlocks.ENDSTONE_DUST)) {
|
||||||
|
state = state.setValue(CACTUS_BOTTOM, CactusBottom.SAND);
|
||||||
|
}
|
||||||
|
else if (down.is(EndBlocks.END_MOSS)) {
|
||||||
|
state = state.setValue(CACTUS_BOTTOM, CactusBottom.MOSS);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
state = state.setValue(CACTUS_BOTTOM, CactusBottom.EMPTY);
|
||||||
|
}
|
||||||
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -80,6 +99,17 @@ public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterlogg
|
||||||
if ((Boolean) state.getValue(WATERLOGGED)) {
|
if ((Boolean) state.getValue(WATERLOGGED)) {
|
||||||
world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world));
|
world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world));
|
||||||
}
|
}
|
||||||
|
Direction dir = state.getValue(FACING);
|
||||||
|
BlockState down = world.getBlockState(pos.relative(dir.getOpposite()));
|
||||||
|
if (down.is(Blocks.END_STONE) || down.is(EndBlocks.ENDSTONE_DUST)) {
|
||||||
|
state = state.setValue(CACTUS_BOTTOM, CactusBottom.SAND);
|
||||||
|
}
|
||||||
|
else if (down.is(EndBlocks.END_MOSS)) {
|
||||||
|
state = state.setValue(CACTUS_BOTTOM, CactusBottom.MOSS);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
state = state.setValue(CACTUS_BOTTOM, CactusBottom.EMPTY);
|
||||||
|
}
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,6 +136,87 @@ public class NeonCactusBlock extends BlockBaseNotFull implements SimpleWaterlogg
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) {
|
||||||
|
Direction dir = state.getValue(FACING);
|
||||||
|
if (!world.getBlockState(pos.relative(dir)).isAir() || world.getBlockState(pos.above()).is(this)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int length = getLength(state, world, pos, 10);
|
||||||
|
if (length < 0 || length > 9) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int horizontal = getHorizontal(state, world, pos, 5);
|
||||||
|
if (horizontal > random.nextInt(2)) {
|
||||||
|
dir = Direction.UP;
|
||||||
|
if (!world.getBlockState(pos.above()).isAir()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
BlockState placement = state.setValue(SHAPE, TripleShape.TOP).setValue(CACTUS_BOTTOM, CactusBottom.EMPTY).setValue(WATERLOGGED, false).setValue(FACING, dir);
|
||||||
|
BlocksHelper.setWithoutUpdate(world, pos.relative(dir), placement);
|
||||||
|
mutateStem(placement, world, pos, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getLength(BlockState state, ServerLevel world, BlockPos pos, int max) {
|
||||||
|
int length = 0;
|
||||||
|
Direction dir = state.getValue(FACING).getOpposite();
|
||||||
|
MutableBlockPos mut = new MutableBlockPos().set(pos);
|
||||||
|
for (int i = 0; i < max; i++) {
|
||||||
|
mut.move(dir);
|
||||||
|
state = world.getBlockState(mut);
|
||||||
|
if (!state.is(this)) {
|
||||||
|
if (!state.is(EndTags.END_GROUND)) {
|
||||||
|
length = -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
dir = state.getValue(FACING).getOpposite();
|
||||||
|
length ++;
|
||||||
|
}
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getHorizontal(BlockState state, ServerLevel world, BlockPos pos, int max) {
|
||||||
|
int count = 0;
|
||||||
|
Direction dir = state.getValue(FACING).getOpposite();
|
||||||
|
MutableBlockPos mut = new MutableBlockPos().set(pos);
|
||||||
|
for (int i = 0; i < max; i++) {
|
||||||
|
mut.move(dir);
|
||||||
|
state = world.getBlockState(mut);
|
||||||
|
if (!state.is(this)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
dir = state.getValue(FACING).getOpposite();
|
||||||
|
if (dir.getStepY() != 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
count ++;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void mutateStem(BlockState state, ServerLevel world, BlockPos pos, int max) {
|
||||||
|
Direction dir = state.getValue(FACING).getOpposite();
|
||||||
|
MutableBlockPos mut = new MutableBlockPos().set(pos);
|
||||||
|
for (int i = 0; i < max; i++) {
|
||||||
|
mut.move(dir);
|
||||||
|
state = world.getBlockState(mut);
|
||||||
|
if (!state.is(this)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int size = i * 3 / max;
|
||||||
|
int src = state.getValue(SHAPE).getIndex();
|
||||||
|
if (src < size) {
|
||||||
|
TripleShape shape = TripleShape.fromIndex(size);
|
||||||
|
BlocksHelper.setWithoutUpdate(world, pos, state.setValue(SHAPE, shape));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static {
|
static {
|
||||||
MEDIUM_SHAPES.put(Axis.X, Block.box(0, 2, 2, 16, 14, 14));
|
MEDIUM_SHAPES.put(Axis.X, Block.box(0, 2, 2, 16, 14, 14));
|
||||||
MEDIUM_SHAPES.put(Axis.Y, Block.box(2, 0, 2, 14, 16, 14));
|
MEDIUM_SHAPES.put(Axis.Y, Block.box(2, 0, 2, 14, 16, 14));
|
||||||
|
|
|
@ -1,18 +1,19 @@
|
||||||
package ru.betterend.mixin.common;
|
package ru.betterend.mixin.common;
|
||||||
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
|
||||||
import net.minecraft.tags.Tag;
|
|
||||||
import net.minecraft.tags.TagLoader;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.ModifyArg;
|
|
||||||
import ru.betterend.util.TagHelper;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.ModifyArg;
|
||||||
|
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import net.minecraft.tags.Tag;
|
||||||
|
import net.minecraft.tags.TagLoader;
|
||||||
|
import ru.betterend.util.TagHelper;
|
||||||
|
|
||||||
@Mixin(TagLoader.class)
|
@Mixin(TagLoader.class)
|
||||||
public class TagLoaderMixin {
|
public class TagLoaderMixin {
|
||||||
@Shadow
|
@Shadow
|
||||||
|
|
|
@ -6,10 +6,13 @@ import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.core.BlockPos.MutableBlockPos;
|
import net.minecraft.core.BlockPos.MutableBlockPos;
|
||||||
import net.minecraft.core.Direction;
|
import net.minecraft.core.Direction;
|
||||||
import net.minecraft.world.level.WorldGenLevel;
|
import net.minecraft.world.level.WorldGenLevel;
|
||||||
|
import net.minecraft.world.level.block.Blocks;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
|
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
|
||||||
import net.minecraft.world.level.chunk.ChunkGenerator;
|
import net.minecraft.world.level.chunk.ChunkGenerator;
|
||||||
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
|
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
|
||||||
import ru.betterend.blocks.BlockProperties;
|
import ru.betterend.blocks.BlockProperties;
|
||||||
|
import ru.betterend.blocks.BlockProperties.CactusBottom;
|
||||||
import ru.betterend.blocks.BlockProperties.TripleShape;
|
import ru.betterend.blocks.BlockProperties.TripleShape;
|
||||||
import ru.betterend.registry.EndBlocks;
|
import ru.betterend.registry.EndBlocks;
|
||||||
import ru.betterend.util.BlocksHelper;
|
import ru.betterend.util.BlocksHelper;
|
||||||
|
@ -31,9 +34,23 @@ public class NeonCactusFeature extends DefaultFeature {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
int size = (h - i) >> 2;
|
int size = (h - i) >> 2;
|
||||||
BlocksHelper.setWithUpdate(world, mut,
|
BlockState state = EndBlocks.NEON_CACTUS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, getBySize(size)).setValue(BlockStateProperties.FACING, Direction.UP);
|
||||||
EndBlocks.NEON_CACTUS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, getBySize(size))
|
if (i == 0) {
|
||||||
.setValue(BlockStateProperties.FACING, Direction.UP));
|
BlockState down = world.getBlockState(mut.below());
|
||||||
|
if (down.is(Blocks.END_STONE) || down.is(EndBlocks.ENDSTONE_DUST)) {
|
||||||
|
state = state.setValue(BlockProperties.CACTUS_BOTTOM, CactusBottom.SAND);
|
||||||
|
}
|
||||||
|
else if (down.is(EndBlocks.END_MOSS)) {
|
||||||
|
state = state.setValue(BlockProperties.CACTUS_BOTTOM, CactusBottom.MOSS);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
state = state.setValue(BlockProperties.CACTUS_BOTTOM, CactusBottom.EMPTY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
state = state.setValue(BlockProperties.CACTUS_BOTTOM, CactusBottom.EMPTY);
|
||||||
|
}
|
||||||
|
BlocksHelper.setWithUpdate(world, mut, state);
|
||||||
if (i > 2 && i < (h - 1) && random.nextBoolean()) {
|
if (i > 2 && i < (h - 1) && random.nextBoolean()) {
|
||||||
int length = h - i - MHelper.randRange(1, 2, random);
|
int length = h - i - MHelper.randRange(1, 2, random);
|
||||||
if (length > 0) {
|
if (length > 0) {
|
||||||
|
|
|
@ -25,8 +25,7 @@ public abstract class WallScatterFeature extends DefaultFeature {
|
||||||
public abstract void generate(WorldGenLevel world, Random random, BlockPos pos, Direction dir);
|
public abstract void generate(WorldGenLevel world, Random random, BlockPos pos, Direction dir);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center,
|
public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, NoneFeatureConfiguration featureConfig) {
|
||||||
NoneFeatureConfiguration featureConfig) {
|
|
||||||
int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE, center.getX(), center.getZ());
|
int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE, center.getX(), center.getZ());
|
||||||
int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY);
|
int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY);
|
||||||
if (maxY < 10 || maxY < minY) {
|
if (maxY < 10 || maxY < minY) {
|
||||||
|
|
|
@ -4,8 +4,7 @@ import java.util.Random;
|
||||||
|
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
|
|
||||||
public class BiomeChunk
|
public class BiomeChunk {
|
||||||
{
|
|
||||||
protected static final int WIDTH = 16;
|
protected static final int WIDTH = 16;
|
||||||
private static final int SM_WIDTH = WIDTH >> 1;
|
private static final int SM_WIDTH = WIDTH >> 1;
|
||||||
private static final int MASK_OFFSET = SM_WIDTH - 1;
|
private static final int MASK_OFFSET = SM_WIDTH - 1;
|
||||||
|
@ -13,8 +12,7 @@ public class BiomeChunk
|
||||||
|
|
||||||
private final EndBiome[][] biomes;
|
private final EndBiome[][] biomes;
|
||||||
|
|
||||||
public BiomeChunk(BiomeMap map, Random random, BiomePicker picker)
|
public BiomeChunk(BiomeMap map, Random random, BiomePicker picker) {
|
||||||
{
|
|
||||||
EndBiome[][] PreBio = new EndBiome[SM_WIDTH][SM_WIDTH];
|
EndBiome[][] PreBio = new EndBiome[SM_WIDTH][SM_WIDTH];
|
||||||
biomes = new EndBiome[WIDTH][WIDTH];
|
biomes = new EndBiome[WIDTH][WIDTH];
|
||||||
|
|
||||||
|
@ -27,13 +25,11 @@ public class BiomeChunk
|
||||||
biomes[x][z] = PreBio[offsetXZ(x, random)][offsetXZ(z, random)].getSubBiome(random);
|
biomes[x][z] = PreBio[offsetXZ(x, random)][offsetXZ(z, random)].getSubBiome(random);
|
||||||
}
|
}
|
||||||
|
|
||||||
public EndBiome getBiome(int x, int z)
|
public EndBiome getBiome(int x, int z) {
|
||||||
{
|
|
||||||
return biomes[x & MASK_WIDTH][z & MASK_WIDTH];
|
return biomes[x & MASK_WIDTH][z & MASK_WIDTH];
|
||||||
}
|
}
|
||||||
|
|
||||||
private int offsetXZ(int x, Random random)
|
private int offsetXZ(int x, Random random) {
|
||||||
{
|
|
||||||
return ((x + random.nextInt(2)) >> 1) & MASK_OFFSET;
|
return ((x + random.nextInt(2)) >> 1) & MASK_OFFSET;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,24 +1,66 @@
|
||||||
{
|
{
|
||||||
"variants": {
|
"variants": {
|
||||||
"shape=bottom,facing=up": { "model": "betterend:block/neon_cactus_big" },
|
"bottom=empty,shape=bottom,facing=up": { "model": "betterend:block/neon_cactus_big" },
|
||||||
"shape=bottom,facing=down": { "model": "betterend:block/neon_cactus_big", "x": 180 },
|
"bottom=empty,shape=bottom,facing=down": { "model": "betterend:block/neon_cactus_big", "x": 180 },
|
||||||
"shape=bottom,facing=north": { "model": "betterend:block/neon_cactus_big", "x": 90 },
|
"bottom=empty,shape=bottom,facing=north": { "model": "betterend:block/neon_cactus_big", "x": 90 },
|
||||||
"shape=bottom,facing=south": { "model": "betterend:block/neon_cactus_big", "x": 90, "y": 180 },
|
"bottom=empty,shape=bottom,facing=south": { "model": "betterend:block/neon_cactus_big", "x": 90, "y": 180 },
|
||||||
"shape=bottom,facing=east": { "model": "betterend:block/neon_cactus_big", "x": 90, "y": 90 },
|
"bottom=empty,shape=bottom,facing=east": { "model": "betterend:block/neon_cactus_big", "x": 90, "y": 90 },
|
||||||
"shape=bottom,facing=west": { "model": "betterend:block/neon_cactus_big", "x": 90, "y": 270 },
|
"bottom=empty,shape=bottom,facing=west": { "model": "betterend:block/neon_cactus_big", "x": 90, "y": 270 },
|
||||||
|
|
||||||
"shape=middle,facing=up": { "model": "betterend:block/neon_cactus_medium" },
|
"bottom=sand,shape=bottom,facing=up": { "model": "betterend:block/neon_cactus_big_sand" },
|
||||||
"shape=middle,facing=down": { "model": "betterend:block/neon_cactus_medium", "x": 180 },
|
"bottom=sand,shape=bottom,facing=down": { "model": "betterend:block/neon_cactus_big_sand", "x": 180 },
|
||||||
"shape=middle,facing=north": { "model": "betterend:block/neon_cactus_medium", "x": 90 },
|
"bottom=sand,shape=bottom,facing=north": { "model": "betterend:block/neon_cactus_big_sand", "x": 90 },
|
||||||
"shape=middle,facing=south": { "model": "betterend:block/neon_cactus_medium", "x": 90, "y": 180 },
|
"bottom=sand,shape=bottom,facing=south": { "model": "betterend:block/neon_cactus_big_sand", "x": 90, "y": 180 },
|
||||||
"shape=middle,facing=east": { "model": "betterend:block/neon_cactus_medium", "x": 90, "y": 90 },
|
"bottom=sand,shape=bottom,facing=east": { "model": "betterend:block/neon_cactus_big_sand", "x": 90, "y": 90 },
|
||||||
"shape=middle,facing=west": { "model": "betterend:block/neon_cactus_medium", "x": 90, "y": 270 },
|
"bottom=sand,shape=bottom,facing=west": { "model": "betterend:block/neon_cactus_big_sand", "x": 90, "y": 270 },
|
||||||
|
|
||||||
"shape=top,facing=up": { "model": "betterend:block/neon_cactus_small" },
|
"bottom=moss,shape=bottom,facing=up": { "model": "betterend:block/neon_cactus_big_moss" },
|
||||||
"shape=top,facing=down": { "model": "betterend:block/neon_cactus_small", "x": 180 },
|
"bottom=moss,shape=bottom,facing=down": { "model": "betterend:block/neon_cactus_big_moss", "x": 180 },
|
||||||
"shape=top,facing=north": { "model": "betterend:block/neon_cactus_small", "x": 90 },
|
"bottom=moss,shape=bottom,facing=north": { "model": "betterend:block/neon_cactus_big_moss", "x": 90 },
|
||||||
"shape=top,facing=south": { "model": "betterend:block/neon_cactus_small", "x": 90, "y": 180 },
|
"bottom=moss,shape=bottom,facing=south": { "model": "betterend:block/neon_cactus_big_moss", "x": 90, "y": 180 },
|
||||||
"shape=top,facing=east": { "model": "betterend:block/neon_cactus_small", "x": 90, "y": 90 },
|
"bottom=moss,shape=bottom,facing=east": { "model": "betterend:block/neon_cactus_big_moss", "x": 90, "y": 90 },
|
||||||
"shape=top,facing=west": { "model": "betterend:block/neon_cactus_small", "x": 90, "y": 270 }
|
"bottom=moss,shape=bottom,facing=west": { "model": "betterend:block/neon_cactus_big_moss", "x": 90, "y": 270 },
|
||||||
|
|
||||||
|
"bottom=empty,shape=middle,facing=up": { "model": "betterend:block/neon_cactus_medium" },
|
||||||
|
"bottom=empty,shape=middle,facing=down": { "model": "betterend:block/neon_cactus_medium", "x": 180 },
|
||||||
|
"bottom=empty,shape=middle,facing=north": { "model": "betterend:block/neon_cactus_medium", "x": 90 },
|
||||||
|
"bottom=empty,shape=middle,facing=south": { "model": "betterend:block/neon_cactus_medium", "x": 90, "y": 180 },
|
||||||
|
"bottom=empty,shape=middle,facing=east": { "model": "betterend:block/neon_cactus_medium", "x": 90, "y": 90 },
|
||||||
|
"bottom=empty,shape=middle,facing=west": { "model": "betterend:block/neon_cactus_medium", "x": 90, "y": 270 },
|
||||||
|
|
||||||
|
"bottom=sand,shape=middle,facing=up": { "model": "betterend:block/neon_cactus_medium_sand" },
|
||||||
|
"bottom=sand,shape=middle,facing=down": { "model": "betterend:block/neon_cactus_medium_sand", "x": 180 },
|
||||||
|
"bottom=sand,shape=middle,facing=north": { "model": "betterend:block/neon_cactus_medium_sand", "x": 90 },
|
||||||
|
"bottom=sand,shape=middle,facing=south": { "model": "betterend:block/neon_cactus_medium_sand", "x": 90, "y": 180 },
|
||||||
|
"bottom=sand,shape=middle,facing=east": { "model": "betterend:block/neon_cactus_medium_sand", "x": 90, "y": 90 },
|
||||||
|
"bottom=sand,shape=middle,facing=west": { "model": "betterend:block/neon_cactus_medium_sand", "x": 90, "y": 270 },
|
||||||
|
|
||||||
|
"bottom=moss,shape=middle,facing=up": { "model": "betterend:block/neon_cactus_medium_moss" },
|
||||||
|
"bottom=moss,shape=middle,facing=down": { "model": "betterend:block/neon_cactus_medium_moss", "x": 180 },
|
||||||
|
"bottom=moss,shape=middle,facing=north": { "model": "betterend:block/neon_cactus_medium_moss", "x": 90 },
|
||||||
|
"bottom=moss,shape=middle,facing=south": { "model": "betterend:block/neon_cactus_medium_moss", "x": 90, "y": 180 },
|
||||||
|
"bottom=moss,shape=middle,facing=east": { "model": "betterend:block/neon_cactus_medium_moss", "x": 90, "y": 90 },
|
||||||
|
"bottom=moss,shape=middle,facing=west": { "model": "betterend:block/neon_cactus_medium_moss", "x": 90, "y": 270 },
|
||||||
|
|
||||||
|
"bottom=empty,shape=top,facing=up": { "model": "betterend:block/neon_cactus_small" },
|
||||||
|
"bottom=empty,shape=top,facing=down": { "model": "betterend:block/neon_cactus_small", "x": 180 },
|
||||||
|
"bottom=empty,shape=top,facing=north": { "model": "betterend:block/neon_cactus_small", "x": 90 },
|
||||||
|
"bottom=empty,shape=top,facing=south": { "model": "betterend:block/neon_cactus_small", "x": 90, "y": 180 },
|
||||||
|
"bottom=empty,shape=top,facing=east": { "model": "betterend:block/neon_cactus_small", "x": 90, "y": 90 },
|
||||||
|
"bottom=empty,shape=top,facing=west": { "model": "betterend:block/neon_cactus_small", "x": 90, "y": 270 },
|
||||||
|
|
||||||
|
"bottom=sand,shape=top,facing=up": { "model": "betterend:block/neon_cactus_small_sand" },
|
||||||
|
"bottom=sand,shape=top,facing=down": { "model": "betterend:block/neon_cactus_small_sand", "x": 180 },
|
||||||
|
"bottom=sand,shape=top,facing=north": { "model": "betterend:block/neon_cactus_small_sand", "x": 90 },
|
||||||
|
"bottom=sand,shape=top,facing=south": { "model": "betterend:block/neon_cactus_small_sand", "x": 90, "y": 180 },
|
||||||
|
"bottom=sand,shape=top,facing=east": { "model": "betterend:block/neon_cactus_small_sand", "x": 90, "y": 90 },
|
||||||
|
"bottom=sand,shape=top,facing=west": { "model": "betterend:block/neon_cactus_small_sand", "x": 90, "y": 270 },
|
||||||
|
|
||||||
|
"bottom=moss,shape=top,facing=up": { "model": "betterend:block/neon_cactus_small_moss" },
|
||||||
|
"bottom=moss,shape=top,facing=down": { "model": "betterend:block/neon_cactus_small_moss", "x": 180 },
|
||||||
|
"bottom=moss,shape=top,facing=north": { "model": "betterend:block/neon_cactus_small_moss", "x": 90 },
|
||||||
|
"bottom=moss,shape=top,facing=south": { "model": "betterend:block/neon_cactus_small_moss", "x": 90, "y": 180 },
|
||||||
|
"bottom=moss,shape=top,facing=east": { "model": "betterend:block/neon_cactus_small_moss", "x": 90, "y": 90 },
|
||||||
|
"bottom=moss,shape=top,facing=west": { "model": "betterend:block/neon_cactus_small_moss", "x": 90, "y": 270 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
{
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"end": "betterend:block/neon_cactus_big_top",
|
||||||
|
"side": "betterend:block/neon_cactus_big_side_moss",
|
||||||
|
"overlay": "betterend:block/neon_cactus_big_side_moss_overlay",
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [ 0, 0, 0 ],
|
||||||
|
"to": [ 16, 16, 16 ],
|
||||||
|
"shade": false,
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 0, 0, 16, 16 ], "texture": "#end", "cullface": "down" },
|
||||||
|
"up": { "uv": [ 0, 0, 16, 16 ], "texture": "#end", "cullface": "up" },
|
||||||
|
"north": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "north" },
|
||||||
|
"south": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "south" },
|
||||||
|
"west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "west" },
|
||||||
|
"east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "east" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": [ 0, 0, 0 ],
|
||||||
|
"to": [ 16, 16, 16 ],
|
||||||
|
"faces": {
|
||||||
|
"north": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "north" },
|
||||||
|
"south": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "south" },
|
||||||
|
"west": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "west" },
|
||||||
|
"east": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "east" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
{
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"end": "betterend:block/neon_cactus_big_top",
|
||||||
|
"side": "betterend:block/neon_cactus_big_side_dust",
|
||||||
|
"overlay": "betterend:block/neon_cactus_big_side_dust_overlay",
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [ 0, 0, 0 ],
|
||||||
|
"to": [ 16, 16, 16 ],
|
||||||
|
"shade": false,
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 0, 0, 16, 16 ], "texture": "#end", "cullface": "down" },
|
||||||
|
"up": { "uv": [ 0, 0, 16, 16 ], "texture": "#end", "cullface": "up" },
|
||||||
|
"north": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "north" },
|
||||||
|
"south": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "south" },
|
||||||
|
"west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "west" },
|
||||||
|
"east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "east" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": [ 0, 0, 0 ],
|
||||||
|
"to": [ 16, 16, 16 ],
|
||||||
|
"faces": {
|
||||||
|
"north": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "north" },
|
||||||
|
"south": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "south" },
|
||||||
|
"west": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "west" },
|
||||||
|
"east": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "east" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
{
|
||||||
|
"__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio",
|
||||||
|
"textures": {
|
||||||
|
"particle": "betterend:block/neon_cactus_small_side",
|
||||||
|
"overlay": "betterend:block/neon_cactus_medium_side_moss_overlay",
|
||||||
|
"side": "betterend:block/neon_cactus_medium_side_moss",
|
||||||
|
"top": "betterend:block/neon_cactus_medium_top"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"__comment": "Box1",
|
||||||
|
"from": [ 2, -2, 2 ],
|
||||||
|
"to": [ 14, 14, 14 ],
|
||||||
|
"shade": false,
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" },
|
||||||
|
"up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" },
|
||||||
|
"north": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" },
|
||||||
|
"south": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" },
|
||||||
|
"west": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" },
|
||||||
|
"east": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__comment": "Box1",
|
||||||
|
"from": [ 2, -2, 2 ],
|
||||||
|
"to": [ 14, 14, 14 ],
|
||||||
|
"faces": {
|
||||||
|
"north": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" },
|
||||||
|
"south": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" },
|
||||||
|
"west": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" },
|
||||||
|
"east": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__comment": "PlaneX2",
|
||||||
|
"from": [ 0, -2, 0 ],
|
||||||
|
"to": [ 0.001, 14, 22.5 ],
|
||||||
|
"rotation": { "origin": [ 0, -2, 0 ], "axis": "y", "angle": 45 },
|
||||||
|
"shade": false,
|
||||||
|
"faces": {
|
||||||
|
"west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" },
|
||||||
|
"east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__comment": "PlaneX2",
|
||||||
|
"from": [ 16, -2, 0 ],
|
||||||
|
"to": [ 16.001, 14, 22.5 ],
|
||||||
|
"rotation": { "origin": [ 16, -2, 0 ], "axis": "y", "angle": -45 },
|
||||||
|
"shade": false,
|
||||||
|
"faces": {
|
||||||
|
"west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" },
|
||||||
|
"east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
{
|
||||||
|
"__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio",
|
||||||
|
"textures": {
|
||||||
|
"particle": "betterend:block/neon_cactus_small_side",
|
||||||
|
"overlay": "betterend:block/neon_cactus_medium_side_dust_overlay",
|
||||||
|
"side": "betterend:block/neon_cactus_medium_side_dust",
|
||||||
|
"top": "betterend:block/neon_cactus_medium_top"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"__comment": "Box1",
|
||||||
|
"from": [ 2, -2, 2 ],
|
||||||
|
"to": [ 14, 14, 14 ],
|
||||||
|
"shade": false,
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" },
|
||||||
|
"up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" },
|
||||||
|
"north": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" },
|
||||||
|
"south": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" },
|
||||||
|
"west": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" },
|
||||||
|
"east": { "uv": [ 2, 0, 14, 16 ], "texture": "#side" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__comment": "Box1",
|
||||||
|
"from": [ 2, -2, 2 ],
|
||||||
|
"to": [ 14, 14, 14 ],
|
||||||
|
"faces": {
|
||||||
|
"north": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" },
|
||||||
|
"south": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" },
|
||||||
|
"west": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" },
|
||||||
|
"east": { "uv": [ 2, 0, 14, 16 ], "texture": "#overlay" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__comment": "PlaneX2",
|
||||||
|
"from": [ 0, -2, 0 ],
|
||||||
|
"to": [ 0.001, 14, 22.5 ],
|
||||||
|
"rotation": { "origin": [ 0, -2, 0 ], "axis": "y", "angle": 45 },
|
||||||
|
"shade": false,
|
||||||
|
"faces": {
|
||||||
|
"west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" },
|
||||||
|
"east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__comment": "PlaneX2",
|
||||||
|
"from": [ 16, -2, 0 ],
|
||||||
|
"to": [ 16.001, 14, 22.5 ],
|
||||||
|
"rotation": { "origin": [ 16, -2, 0 ], "axis": "y", "angle": -45 },
|
||||||
|
"shade": false,
|
||||||
|
"faces": {
|
||||||
|
"west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" },
|
||||||
|
"east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
{
|
||||||
|
"__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "betterend:block/neon_cactus_small_side",
|
||||||
|
"overlay": "betterend:block/neon_cactus_small_side_moss_overlay",
|
||||||
|
"side": "betterend:block/neon_cactus_small_side",
|
||||||
|
"top": "betterend:block/neon_cactus_small_top"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"__comment": "Box1",
|
||||||
|
"from": [ 4, -4, 4 ],
|
||||||
|
"to": [ 12, 12, 12 ],
|
||||||
|
"shade": false,
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" },
|
||||||
|
"up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" },
|
||||||
|
"north": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" },
|
||||||
|
"south": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" },
|
||||||
|
"west": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" },
|
||||||
|
"east": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": [ 4, -4, 4 ],
|
||||||
|
"to": [ 12, 12, 12 ],
|
||||||
|
"faces": {
|
||||||
|
"north": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" },
|
||||||
|
"south": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" },
|
||||||
|
"west": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" },
|
||||||
|
"east": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__comment": "PlaneX2",
|
||||||
|
"from": [ 0, -4, 0 ],
|
||||||
|
"to": [ 0.001, 12, 22.5 ],
|
||||||
|
"rotation": { "origin": [ 0, -4, 0 ], "axis": "y", "angle": 45 },
|
||||||
|
"shade": false,
|
||||||
|
"faces": {
|
||||||
|
"west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" },
|
||||||
|
"east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__comment": "PlaneX2",
|
||||||
|
"from": [ 16, -4, 0 ],
|
||||||
|
"to": [ 16.001, 12, 22.5 ],
|
||||||
|
"rotation": { "origin": [ 16, -4, 0 ], "axis": "y", "angle": -45 },
|
||||||
|
"shade": false,
|
||||||
|
"faces": {
|
||||||
|
"west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" },
|
||||||
|
"east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
{
|
||||||
|
"__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "betterend:block/neon_cactus_small_side",
|
||||||
|
"overlay": "betterend:block/neon_cactus_small_side_dust_overlay",
|
||||||
|
"side": "betterend:block/neon_cactus_small_side_dust",
|
||||||
|
"top": "betterend:block/neon_cactus_small_top"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"__comment": "Box1",
|
||||||
|
"from": [ 4, -4, 4 ],
|
||||||
|
"to": [ 12, 12, 12 ],
|
||||||
|
"shade": false,
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" },
|
||||||
|
"up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top" },
|
||||||
|
"north": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" },
|
||||||
|
"south": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" },
|
||||||
|
"west": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" },
|
||||||
|
"east": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": [ 4, -4, 4 ],
|
||||||
|
"to": [ 12, 12, 12 ],
|
||||||
|
"faces": {
|
||||||
|
"north": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" },
|
||||||
|
"south": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" },
|
||||||
|
"west": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" },
|
||||||
|
"east": { "uv": [ 4, 0, 12, 16 ], "texture": "#overlay" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__comment": "PlaneX2",
|
||||||
|
"from": [ 0, -4, 0 ],
|
||||||
|
"to": [ 0.001, 12, 22.5 ],
|
||||||
|
"rotation": { "origin": [ 0, -4, 0 ], "axis": "y", "angle": 45 },
|
||||||
|
"shade": false,
|
||||||
|
"faces": {
|
||||||
|
"west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" },
|
||||||
|
"east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__comment": "PlaneX2",
|
||||||
|
"from": [ 16, -4, 0 ],
|
||||||
|
"to": [ 16.001, 12, 22.5 ],
|
||||||
|
"rotation": { "origin": [ 16, -4, 0 ], "axis": "y", "angle": -45 },
|
||||||
|
"shade": false,
|
||||||
|
"faces": {
|
||||||
|
"west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" },
|
||||||
|
"east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
Before Width: | Height: | Size: 645 B After Width: | Height: | Size: 298 B |
Before Width: | Height: | Size: 720 B After Width: | Height: | Size: 234 B |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 331 B |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 303 B |
After Width: | Height: | Size: 164 B |
After Width: | Height: | Size: 324 B |
After Width: | Height: | Size: 185 B |
Before Width: | Height: | Size: 256 B After Width: | Height: | Size: 257 B |
After Width: | Height: | Size: 282 B |
After Width: | Height: | Size: 157 B |
After Width: | Height: | Size: 304 B |
After Width: | Height: | Size: 186 B |