Mosses, fixes

This commit is contained in:
paulevsGitch 2020-10-01 01:39:06 +03:00
parent 4eb7105e33
commit 72b173a9e3
28 changed files with 354 additions and 53 deletions

View file

@ -0,0 +1,30 @@
package ru.betterend.blocks;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.BlockView;
import ru.betterend.blocks.basis.BlockPlant;
import ru.betterend.registry.BlockRegistry;
public class BlockGlowingMoss extends BlockPlant {
public BlockGlowingMoss(int light) {
super(light);
}
@Override
protected boolean isTerrain(BlockState state) {
return state.getBlock() == BlockRegistry.END_MOSS || state.getBlock() == BlockRegistry.END_MYCELIUM;
}
@Environment(EnvType.CLIENT)
public boolean hasEmissiveLighting(BlockView world, BlockPos pos) {
return true;
}
@Environment(EnvType.CLIENT)
public float getAmbientOcclusionLightLevel(BlockView world, BlockPos pos) {
return 1F;
}
}

View file

@ -1,9 +0,0 @@
package ru.betterend.blocks;
import ru.betterend.blocks.basis.BlockPlant;
public class BlockUmbrellaMoss extends BlockPlant {
public BlockUmbrellaMoss() {
super(12);
}
}

View file

@ -2,23 +2,15 @@ package ru.betterend.blocks;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.state.StateManager;
import net.minecraft.state.property.IntProperty;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import ru.betterend.blocks.basis.BlockDoublePlant;
import ru.betterend.registry.BlockRegistry;
import ru.betterend.util.BlocksHelper;
public class BlockUmbrellaMossTall extends BlockDoublePlant {
public static final IntProperty ROTATION = IntProperty.of("rotation", 0, 3);
public BlockUmbrellaMossTall() {
super(12);
}
@ -30,15 +22,7 @@ public class BlockUmbrellaMossTall extends BlockDoublePlant {
}
@Override
public void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) {
int rot = world.random.nextInt(4);
BlocksHelper.setWithoutUpdate(world, pos, this.getDefaultState().with(ROTATION, rot));
BlocksHelper.setWithoutUpdate(world, pos.up(), this.getDefaultState().with(ROTATION, rot).with(TOP, true));
}
@Override
protected void appendProperties(StateManager.Builder<Block, BlockState> stateManager) {
super.appendProperties(stateManager);
stateManager.add(ROTATION);
protected boolean isTerrain(BlockState state) {
return state.getBlock() == BlockRegistry.END_MOSS || state.getBlock() == BlockRegistry.END_MYCELIUM;
}
}

View file

@ -25,6 +25,7 @@ import net.minecraft.server.world.ServerWorld;
import net.minecraft.sound.BlockSoundGroup;
import net.minecraft.state.StateManager;
import net.minecraft.state.property.BooleanProperty;
import net.minecraft.state.property.IntProperty;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.Vec3d;
@ -40,6 +41,7 @@ import ru.betterend.util.BlocksHelper;
public class BlockDoublePlant extends BlockBaseNotFull implements IRenderTypeable, Fertilizable {
private static final VoxelShape SHAPE = Block.createCuboidShape(4, 2, 4, 12, 16, 12);
public static final IntProperty ROTATION = IntProperty.of("rotation", 0, 3);
public static final BooleanProperty TOP = BooleanProperty.of("top");
public BlockDoublePlant() {
@ -63,7 +65,7 @@ public class BlockDoublePlant extends BlockBaseNotFull implements IRenderTypeabl
@Override
protected void appendProperties(StateManager.Builder<Block, BlockState> stateManager) {
stateManager.add(TOP);
stateManager.add(TOP, ROTATION);
}
@Override
@ -81,15 +83,19 @@ public class BlockDoublePlant extends BlockBaseNotFull implements IRenderTypeabl
public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) {
BlockState down = world.getBlockState(pos.down());
BlockState up = world.getBlockState(pos.up());
return state.get(TOP) ? down.getBlock() == this : down.isIn(BlockTagRegistry.END_GROUND) && (up.getMaterial().isReplaceable());
return state.get(TOP) ? down.getBlock() == this : isTerrain(down) && (up.getMaterial().isReplaceable());
}
public boolean canStayAt(BlockState state, WorldView world, BlockPos pos) {
BlockState down = world.getBlockState(pos.down());
BlockState up = world.getBlockState(pos.up());
return state.get(TOP) ? down.getBlock() == this : down.isIn(BlockTagRegistry.END_GROUND) && (up.getBlock() == this);
return state.get(TOP) ? down.getBlock() == this : isTerrain(down) && (up.getBlock() == this);
}
protected boolean isTerrain(BlockState state) {
return state.isIn(BlockTagRegistry.END_GROUND);
}
@Override
public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) {
if (!canStayAt(state, world, pos)) {
@ -138,6 +144,9 @@ public class BlockDoublePlant extends BlockBaseNotFull implements IRenderTypeabl
@Override
public void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) {
BlocksHelper.setWithoutUpdate(world, pos.up(), this.getDefaultState().with(TOP, true));
int rot = world.random.nextInt(4);
BlockState bs = this.getDefaultState().with(ROTATION, rot);
BlocksHelper.setWithoutUpdate(world, pos, bs);
BlocksHelper.setWithoutUpdate(world, pos.up(), bs.with(TOP, true));
}
}

View file

@ -68,7 +68,11 @@ public class BlockPlant extends BlockBaseNotFull implements IRenderTypeable, Fer
@Override
public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) {
BlockState down = world.getBlockState(pos.down());
return down.isIn(BlockTagRegistry.END_GROUND);
return isTerrain(down);
}
protected boolean isTerrain(BlockState state) {
return state.isIn(BlockTagRegistry.END_GROUND);
}
@Override

View file

@ -2,7 +2,6 @@ package ru.betterend.recipe;
import net.minecraft.block.Blocks;
import net.minecraft.item.Items;
import ru.betterend.registry.ItemRegistry;
public class AlloyingRecipes {

View file

@ -5,7 +5,6 @@ import net.minecraft.block.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.Items;
import net.minecraft.util.registry.Registry;
import ru.betterend.registry.BlockRegistry;
public class CraftingRecipes {

View file

@ -12,7 +12,6 @@ import net.minecraft.util.registry.RegistryKey;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.Biome.Category;
import net.minecraft.world.biome.BiomeKeys;
import ru.betterend.world.biome.BiomeFoggyMushroomland;
import ru.betterend.world.biome.EndBiome;
import ru.betterend.world.generator.BiomePicker;

View file

@ -8,13 +8,13 @@ import net.minecraft.util.registry.Registry;
import ru.betterend.BetterEnd;
import ru.betterend.blocks.AeterniumBlock;
import ru.betterend.blocks.BlockEndstoneDust;
import ru.betterend.blocks.BlockGlowingMoss;
import ru.betterend.blocks.BlockMossyGlowshroomCap;
import ru.betterend.blocks.BlockMossyGlowshroomFur;
import ru.betterend.blocks.BlockMossyGlowshroomHymenophore;
import ru.betterend.blocks.BlockMossyGlowshroomSapling;
import ru.betterend.blocks.BlockOre;
import ru.betterend.blocks.BlockTerrain;
import ru.betterend.blocks.BlockUmbrellaMoss;
import ru.betterend.blocks.BlockUmbrellaMossTall;
import ru.betterend.blocks.EndStoneSmelter;
import ru.betterend.blocks.EnderBlock;
@ -36,8 +36,9 @@ public class BlockRegistry {
public static final WoodenMaterial MOSSY_GLOWSHROOM = new WoodenMaterial("mossy_glowshroom", MaterialColor.GRAY, MaterialColor.WOOD);
// Small Plants //
public static final Block UMBRELLA_MOSS = registerBlock("umbrella_moss", new BlockUmbrellaMoss());
public static final Block UMBRELLA_MOSS = registerBlock("umbrella_moss", new BlockGlowingMoss(10));
public static final Block UMBRELLA_MOSS_TALL = registerBlock("umbrella_moss_tall", new BlockUmbrellaMossTall());
public static final Block CREEPING_MOSS = registerBlock("creeping_moss", new BlockGlowingMoss(10));
// Ores //
public static final Block ENDER_ORE = registerBlock("ender_ore", new BlockOre(ItemRegistry.ENDER_DUST, 1, 3));

View file

@ -1,11 +1,9 @@
package ru.betterend.registry;
import net.fabricmc.fabric.api.tag.TagRegistry;
import net.minecraft.block.Block;
import net.minecraft.tag.Tag;
import net.minecraft.tag.Tag.Identified;
import ru.betterend.BetterEnd;
import ru.betterend.util.TagHelper;

View file

@ -1,12 +1,23 @@
package ru.betterend.registry;
import ru.betterend.world.features.DoublePlantFeature;
import ru.betterend.world.features.EndFeature;
import ru.betterend.world.features.EndLakeFeature;
import ru.betterend.world.features.MossyGlowshroomFeature;
import ru.betterend.world.features.SinglePlantFeature;
public class FeatureRegistry {
// Trees //
public static final EndFeature MOSSY_GLOWSHROOM = new EndFeature("mossy_glowshroom", new MossyGlowshroomFeature(), 1);
// Plants //
public static final EndFeature UMBRELLA_MOSS = new EndFeature("umbrella_moss", new DoublePlantFeature(BlockRegistry.UMBRELLA_MOSS, BlockRegistry.UMBRELLA_MOSS_TALL, 5), 5);
public static final EndFeature CREEPING_MOSS = new EndFeature("creeping_moss", new SinglePlantFeature(BlockRegistry.CREEPING_MOSS, 5), 5);
// Features //
public static final EndFeature END_LAKE = EndFeature.makeLakeFeature("end_lake", new EndLakeFeature(), 100);
// Ores //
public static final EndFeature ENDER_ORE = EndFeature.makeOreFeature("ender_ore", BlockRegistry.ENDER_ORE, 6, 3, 0, 4, 96);
public static void register() {}

View file

@ -9,7 +9,6 @@ import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.Items;
import net.minecraft.util.registry.Registry;
import ru.betterend.BetterEnd;
public class ItemRegistry {

View file

@ -1,17 +1,17 @@
package ru.betterend.tab;
import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder;
import net.minecraft.block.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Identifier;
import ru.betterend.BetterEnd;
import ru.betterend.registry.BlockRegistry;
import ru.betterend.registry.ItemRegistry;
public class CreativeTab {
public static final ItemGroup END_TAB = FabricItemGroupBuilder.create(new Identifier(BetterEnd.MOD_ID, "items"))
.icon(() -> new ItemStack(Blocks.END_STONE)).appendItems(stacks -> {
.icon(() -> new ItemStack(BlockRegistry.END_MYCELIUM)).appendItems(stacks -> {
for (Item i : ItemRegistry.getModBlocks()) {
stacks.add(new ItemStack(i));
}

View file

@ -13,6 +13,8 @@ public class BiomeFoggyMushroomland extends EndBiome {
.setSurface(BlockRegistry.END_MOSS, BlockRegistry.END_MYCELIUM)
.addFeature(FeatureRegistry.ENDER_ORE)
.addFeature(FeatureRegistry.END_LAKE)
.addFeature(FeatureRegistry.MOSSY_GLOWSHROOM));
.addFeature(FeatureRegistry.MOSSY_GLOWSHROOM)
.addFeature(FeatureRegistry.UMBRELLA_MOSS)
.addFeature(FeatureRegistry.CREEPING_MOSS));
}
}

View file

@ -16,7 +16,7 @@ public abstract class DefaultFeature extends Feature<DefaultFeatureConfig> {
super(DefaultFeatureConfig.CODEC);
}
protected BlockPos getTopPos(StructureWorldAccess world, BlockPos pos) {
protected BlockPos getPosOnSurface(StructureWorldAccess world, BlockPos pos) {
return world.getTopPosition(Type.WORLD_SURFACE, pos);
}
}

View file

@ -0,0 +1,72 @@
package ru.betterend.world.features;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockPos.Mutable;
import net.minecraft.world.StructureWorldAccess;
import net.minecraft.world.gen.chunk.ChunkGenerator;
import net.minecraft.world.gen.feature.DefaultFeatureConfig;
import ru.betterend.blocks.basis.BlockDoublePlant;
import ru.betterend.registry.BlockTagRegistry;
import ru.betterend.util.BlocksHelper;
import ru.betterend.util.MHelper;
public class DoublePlantFeature extends DefaultFeature {
private static final Mutable POS = new Mutable();
private final Block smallPlant;
private final Block largePlant;
private final int radius;
public DoublePlantFeature(Block smallPlant, Block largePlant, int radius) {
this.smallPlant = smallPlant;
this.largePlant = largePlant;
this.radius = radius;
}
@Override
public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, DefaultFeatureConfig featureConfig) {
blockPos = getPosOnSurface(world, blockPos);
if (blockPos.getY() < 5) {
return false;
}
if (!world.getBlockState(blockPos.down()).isIn(BlockTagRegistry.END_GROUND)) {
return false;
}
float r = MHelper.randRange(radius * 0.5F, radius, random);
int count = MHelper.floor(r * r * MHelper.randRange(1.5F, 3F, random));
Block block;
for (int i = 0; i < count; i++) {
float pr = r * (float) Math.sqrt(random.nextFloat());
float theta = random.nextFloat() * MHelper.PI2;
float x = pr * (float) Math.cos(theta);
float z = pr * (float) Math.sin(theta);
POS.set(blockPos.getX() + x, blockPos.getY() + 5, blockPos.getZ() + z);
int down = BlocksHelper.downRay(world, POS, 16);
if (down > 10) continue;
POS.setY(POS.getY() - down);
float d = MHelper.length(x, z) / r * 0.6F + random.nextFloat() * 0.4F;
block = d < 0.5F ? largePlant : smallPlant;
if (block.canPlaceAt(block.getDefaultState(), world, POS)) {
if (block instanceof BlockDoublePlant) {
int rot = random.nextInt(4);
BlockState state = block.getDefaultState().with(BlockDoublePlant.ROTATION, rot);
BlocksHelper.setWithoutUpdate(world, POS, state);
BlocksHelper.setWithoutUpdate(world, POS.up(), state.with(BlockDoublePlant.TOP, true));
}
else {
BlocksHelper.setWithoutUpdate(world, POS, block);
}
}
}
return true;
}
}

View file

@ -27,24 +27,24 @@ public class EndLakeFeature extends DefaultFeature {
int dist = MHelper.floor(radius);
int dist2 = MHelper.floor(radius * 1.5);
int bott = MHelper.floor(depth);
blockPos = getTopPos(world, blockPos);
blockPos = getPosOnSurface(world, blockPos);
if (blockPos.getY() < 10) return false;
int waterLevel = blockPos.getY();
BlockPos pos = getTopPos(world, blockPos.north(dist));
BlockPos pos = getPosOnSurface(world, blockPos.north(dist));
if (pos.getY() < 10) return false;
waterLevel = MHelper.min(pos.getY(), waterLevel);
pos = getTopPos(world, blockPos.south(dist));
pos = getPosOnSurface(world, blockPos.south(dist));
if (pos.getY() < 10) return false;
waterLevel = MHelper.min(pos.getY(), waterLevel);
pos = getTopPos(world, blockPos.east(dist));
pos = getPosOnSurface(world, blockPos.east(dist));
if (pos.getY() < 10) return false;
waterLevel = MHelper.min(pos.getY(), waterLevel);
pos = getTopPos(world, blockPos.west(dist));
pos = getPosOnSurface(world, blockPos.west(dist));
if (pos.getY() < 10) return false;
waterLevel = MHelper.min(pos.getY(), waterLevel);

View file

@ -51,7 +51,7 @@ public class MossyGlowshroomFeature extends DefaultFeature {
@Override
public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, DefaultFeatureConfig featureConfig) {
blockPos = getTopPos(world, blockPos);
blockPos = getPosOnSurface(world, blockPos);
if (blockPos.getY() < 5) {
return false;
}

View file

@ -0,0 +1,66 @@
package ru.betterend.world.features;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockPos.Mutable;
import net.minecraft.world.StructureWorldAccess;
import net.minecraft.world.gen.chunk.ChunkGenerator;
import net.minecraft.world.gen.feature.DefaultFeatureConfig;
import ru.betterend.blocks.basis.BlockDoublePlant;
import ru.betterend.registry.BlockTagRegistry;
import ru.betterend.util.BlocksHelper;
import ru.betterend.util.MHelper;
public class SinglePlantFeature extends DefaultFeature {
private static final Mutable POS = new Mutable();
private final Block plant;
private final int radius;
public SinglePlantFeature(Block plant, int radius) {
this.plant = plant;
this.radius = radius;
}
@Override
public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, DefaultFeatureConfig featureConfig) {
blockPos = getPosOnSurface(world, blockPos);
if (blockPos.getY() < 5) {
return false;
}
if (!world.getBlockState(blockPos.down()).isIn(BlockTagRegistry.END_GROUND)) {
return false;
}
float r = MHelper.randRange(radius * 0.5F, radius, random);
int count = MHelper.floor(r * r * MHelper.randRange(1.5F, 3F, random));
for (int i = 0; i < count; i++) {
float pr = r * (float) Math.sqrt(random.nextFloat());
float theta = random.nextFloat() * MHelper.PI2;
float x = pr * (float) Math.cos(theta);
float z = pr * (float) Math.sin(theta);
POS.set(blockPos.getX() + x, blockPos.getY() + 5, blockPos.getZ() + z);
int down = BlocksHelper.downRay(world, POS, 16);
if (down > 10) continue;
POS.setY(POS.getY() - down);
if (plant.canPlaceAt(plant.getDefaultState(), world, POS)) {
if (plant instanceof BlockDoublePlant) {
int rot = random.nextInt(4);
BlockState state = plant.getDefaultState().with(BlockDoublePlant.ROTATION, rot);
BlocksHelper.setWithoutUpdate(world, POS, state);
BlocksHelper.setWithoutUpdate(world, POS.up(), state.with(BlockDoublePlant.TOP, true));
}
else {
BlocksHelper.setWithoutUpdate(world, POS, plant);
}
}
}
return true;
}
}

View file

@ -10,7 +10,6 @@ import net.minecraft.world.biome.Biome;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder;
import net.minecraft.world.gen.surfacebuilder.TernarySurfaceConfig;
import ru.betterend.noise.OpenSimplexNoise;
import ru.betterend.util.MHelper;

View file

@ -0,0 +1,10 @@
{
"variants": {
"": [
{ "model": "betterend:block/creeping_moss" },
{ "model": "betterend:block/creeping_moss", "y": 90 },
{ "model": "betterend:block/creeping_moss", "y": 180 },
{ "model": "betterend:block/creeping_moss", "y": 270 }
]
}
}

View file

@ -38,5 +38,6 @@
"block.betterend.mossy_glowshroom_trapdoor": "Mossy Glowshroom Trapdoor",
"block.betterend.umbrella_moss": "Umbrella Moss",
"block.betterend.umbrella_moss_tall": "Tall Umbrella Moss"
"block.betterend.umbrella_moss_tall": "Tall Umbrella Moss",
"block.betterend.creeping_moss": "Creeping Moss"
}

View file

@ -38,5 +38,6 @@
"block.betterend.mossy_glowshroom_trapdoor": "Люк из мшистого светогриба",
"block.betterend.umbrella_moss": "Зонтичный мох",
"block.betterend.umbrella_moss_tall": "Высокий зонтичный мох"
"block.betterend.umbrella_moss_tall": "Высокий зонтичный мох",
"block.betterend.creeping_moss": "Стелющийся мох"
}

View file

@ -0,0 +1,120 @@
{
"__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio",
"textures": {
"particle": "betterend:block/creeping_moss_leaves",
"texture": "betterend:block/creeping_moss_leaves",
"spore": "betterend:block/creeping_moss_spores"
},
"elements": [
{
"__comment": "PlaneY1",
"from": [ 0, -0.001, -10 ],
"to": [ 16, 0, 6 ],
"rotation": { "origin": [ 0, 0, 6 ], "axis": "x", "angle": 22.5 },
"shade": false,
"faces": {
"down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 },
"up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }
}
},
{
"__comment": "PlaneY1",
"from": [ 0, 0, 10 ],
"to": [ 16, 0.001, 26 ],
"rotation": { "origin": [ 0, 0, 10 ], "axis": "x", "angle": -22.5 },
"shade": false,
"faces": {
"down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" },
"up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 180 }
}
},
{
"__comment": "PlaneY4",
"from": [ 10, -0.001, 0 ],
"to": [ 26, 0, 16 ],
"rotation": { "origin": [ 10, 0, 16 ], "axis": "z", "angle": 22.5 },
"shade": false,
"faces": {
"down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 90 },
"up": { "uv": [ 0, 16, 16, 0 ], "texture": "#texture", "rotation": 270 }
}
},
{
"__comment": "PlaneY4",
"from": [ -10, 0, 2 ],
"to": [ 6, 0.001, 18 ],
"rotation": { "origin": [ 6, 0, 18 ], "axis": "z", "angle": -22.5 },
"shade": false,
"faces": {
"down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 270 },
"up": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 270 }
}
},
{
"__comment": "PlaneX6",
"from": [ 0, 0, -6.5 ],
"to": [ 0.001, 16, 16 ],
"rotation": { "origin": [ 0, 16, 16 ], "axis": "y", "angle": -45 },
"shade": false,
"faces": {
"west": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" },
"east": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" }
}
},
{
"__comment": "PlaneX6",
"from": [ -6.5, 0, 15.999 ],
"to": [ 16, 16, 16 ],
"rotation": { "origin": [ 16, 16, 16 ], "axis": "y", "angle": -45 },
"shade": false,
"faces": {
"north": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" },
"south": { "uv": [ 0, 0, 16, 16 ], "texture": "#spore" }
}
},
{
"__comment": "PlaneY1",
"from": [ 0, -0.001, -9 ],
"to": [ 16, 0, 7 ],
"rotation": { "origin": [ 0, 0, 7 ], "axis": "x", "angle": 45 },
"shade": false,
"faces": {
"down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 180 },
"up": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }
}
},
{
"__comment": "PlaneY1",
"from": [ 0, 0, 9 ],
"to": [ 16, 0.001, 25 ],
"rotation": { "origin": [ 0, 0, 9 ], "axis": "x", "angle": -45 },
"shade": false,
"faces": {
"down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" },
"up": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 180 }
}
},
{
"__comment": "PlaneY4",
"from": [ 9, -0.001, 0 ],
"to": [ 25, 0, 16 ],
"rotation": { "origin": [ 9, 0, 16 ], "axis": "z", "angle": 45 },
"shade": false,
"faces": {
"down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 90 },
"up": { "uv": [ 16, 16, 0, 0 ], "texture": "#texture", "rotation": 270 }
}
},
{
"__comment": "PlaneY4",
"from": [ -9, 0, 2 ],
"to": [ 7, 0.001, 18 ],
"rotation": { "origin": [ 7, 0, 18 ], "axis": "z", "angle": -45 },
"shade": false,
"faces": {
"down": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "rotation": 270 },
"up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "rotation": 270 }
}
}
]
}

View file

@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "betterend:item/creeping_moss"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB