From 3691e4b67edcb57edfd4c5b6fa950fe071e90d1c Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 1 Nov 2020 00:49:29 +0300 Subject: [PATCH] Dragon tree prototype (WIP) --- .../blocks/BlockDragonTreeSapling.java | 2 +- .../ru/betterend/blocks/BlockShadowGrass.java | 25 +++ .../ru/betterend/blocks/BlockTerrain.java | 11 +- .../java/ru/betterend/registry/EndBiomes.java | 2 + .../java/ru/betterend/registry/EndBlocks.java | 5 +- .../ru/betterend/registry/EndFeatures.java | 2 + .../java/ru/betterend/util/SplineHelper.java | 11 ++ .../betterend/util/sdf/primitive/SDFPie.java | 31 ++++ .../world/biome/BiomeShadowForest.java | 25 +++ .../world/features/DragonTreeFeature.java | 151 ++++++++++++++++++ .../world/features/LacugroveFeature.java | 8 +- .../betterend/blockstates/shadow_grass.json | 21 +++ .../blockstates/shadow_grass_path.json | 10 ++ .../assets/betterend/lang/ru_ru.json | 10 +- .../betterend/models/block/shadow_grass.json | 12 ++ .../models/block/shadow_grass_path.json | 7 + .../betterend/models/item/shadow_grass.json | 3 + .../models/item/shadow_grass_path.json | 3 + .../textures/block/shadow_grass_path_top.png | Bin 0 -> 2163 bytes .../textures/block/shadow_grass_side.png | Bin 0 -> 2321 bytes .../textures/block/shadow_grass_top.png | Bin 0 -> 1785 bytes 21 files changed, 324 insertions(+), 15 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/BlockShadowGrass.java create mode 100644 src/main/java/ru/betterend/util/sdf/primitive/SDFPie.java create mode 100644 src/main/java/ru/betterend/world/biome/BiomeShadowForest.java create mode 100644 src/main/java/ru/betterend/world/features/DragonTreeFeature.java create mode 100644 src/main/resources/assets/betterend/blockstates/shadow_grass.json create mode 100644 src/main/resources/assets/betterend/blockstates/shadow_grass_path.json create mode 100644 src/main/resources/assets/betterend/models/block/shadow_grass.json create mode 100644 src/main/resources/assets/betterend/models/block/shadow_grass_path.json create mode 100644 src/main/resources/assets/betterend/models/item/shadow_grass.json create mode 100644 src/main/resources/assets/betterend/models/item/shadow_grass_path.json create mode 100644 src/main/resources/assets/betterend/textures/block/shadow_grass_path_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/shadow_grass_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/shadow_grass_top.png diff --git a/src/main/java/ru/betterend/blocks/BlockDragonTreeSapling.java b/src/main/java/ru/betterend/blocks/BlockDragonTreeSapling.java index 72d0581f..0e5e9985 100644 --- a/src/main/java/ru/betterend/blocks/BlockDragonTreeSapling.java +++ b/src/main/java/ru/betterend/blocks/BlockDragonTreeSapling.java @@ -11,6 +11,6 @@ public class BlockDragonTreeSapling extends BlockFeatureSapling { @Override protected Feature getFeature() { - return EndFeatures.PYTHADENDRON_TREE.getFeature(); + return EndFeatures.DRAGON_TREE.getFeature(); } } diff --git a/src/main/java/ru/betterend/blocks/BlockShadowGrass.java b/src/main/java/ru/betterend/blocks/BlockShadowGrass.java new file mode 100644 index 00000000..819526e9 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BlockShadowGrass.java @@ -0,0 +1,25 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.block.BlockState; +import net.minecraft.block.MaterialColor; +import net.minecraft.particle.ParticleTypes; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class BlockShadowGrass extends BlockTerrain { + public BlockShadowGrass() { + super(MaterialColor.BLACK); + } + + @Environment(EnvType.CLIENT) + public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { + super.randomDisplayTick(state, world, pos, random); + if (random.nextInt(32) == 0) { + world.addParticle(ParticleTypes.SMOKE, (double) pos.getX() + random.nextDouble(), (double) pos.getY() + 1.1D, (double) pos.getZ() + random.nextDouble(), 0.0D, 0.0D, 0.0D); + } + } +} diff --git a/src/main/java/ru/betterend/blocks/BlockTerrain.java b/src/main/java/ru/betterend/blocks/BlockTerrain.java index d8336784..d97c8938 100644 --- a/src/main/java/ru/betterend/blocks/BlockTerrain.java +++ b/src/main/java/ru/betterend/blocks/BlockTerrain.java @@ -2,6 +2,7 @@ package ru.betterend.blocks; import java.util.Collections; import java.util.List; +import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; @@ -16,6 +17,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.loot.context.LootContext; import net.minecraft.loot.context.LootContextParameters; import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvents; import net.minecraft.util.ActionResult; @@ -29,7 +31,7 @@ public class BlockTerrain extends BlockBase { private Block pathBlock; public BlockTerrain(MaterialColor color) { - super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color).sounds(BlockSounds.TERRAIN_SOUND)); + super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color).sounds(BlockSounds.TERRAIN_SOUND).ticksRandomly()); } public void setPathBlock(Block roadBlock) { @@ -59,4 +61,11 @@ public class BlockTerrain extends BlockBase { } return Collections.singletonList(new ItemStack(Blocks.END_STONE)); } + + @Override + public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + if (random.nextInt(16) == 0 && world.getBlockState(pos.up()).getMaterial().blocksLight()) { + world.setBlockState(pos, Blocks.END_STONE.getDefaultState()); + } + } } diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 5434af5a..08dbe403 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -25,6 +25,7 @@ import ru.betterend.world.biome.BiomeFoggyMushroomland; import ru.betterend.world.biome.BiomeMegalake; import ru.betterend.world.biome.BiomeMegalakeGrove; import ru.betterend.world.biome.BiomePaintedMountains; +import ru.betterend.world.biome.BiomeShadowForest; import ru.betterend.world.biome.EndBiome; import ru.betterend.world.generator.BiomePicker; import ru.betterend.world.generator.BiomeType; @@ -58,6 +59,7 @@ public class EndBiomes { public static final EndBiome MEGALAKE_GROVE = registerSubBiome(new BiomeMegalakeGrove(), MEGALAKE); public static final EndBiome CRYSTAL_MOUNTAINS = registerBiome(new BiomeCrystalMountains(), BiomeType.LAND); public static final EndBiome PAINTED_MOUNTAINS = registerSubBiome(new BiomePaintedMountains(), DUST_WASTELANDS); + public static final EndBiome SHADOW_FOREST = registerBiome(new BiomeShadowForest(), BiomeType.LAND); public static void register() {} diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 805d2c43..93506d33 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -31,6 +31,7 @@ import ru.betterend.blocks.BlockMossyGlowshroomSapling; import ru.betterend.blocks.BlockOre; import ru.betterend.blocks.BlockPath; import ru.betterend.blocks.BlockPythadendronSapling; +import ru.betterend.blocks.BlockShadowGrass; import ru.betterend.blocks.BlockTerrain; import ru.betterend.blocks.BlockTerrainPlant; import ru.betterend.blocks.BlockUmbrellaMoss; @@ -59,13 +60,15 @@ public class EndBlocks { public static final Block CHORUS_NYLIUM = registerBlock("chorus_nylium", new BlockTerrain(MaterialColor.MAGENTA)); public static final Block CAVE_MOSS = registerBlock("cave_moss", new BlockTerrain(MaterialColor.PURPLE)); public static final Block CRYSTAL_MOSS = registerBlock("crystal_moss", new BlockTerrain(MaterialColor.PINK)); + public static final Block SHADOW_GRASS = registerBlock("shadow_grass", new BlockShadowGrass()); // Roads // public static final Block END_MYCELIUM_PATH = registerBlock("end_mycelium_path", new BlockPath(END_MYCELIUM)); public static final Block END_MOSS_PATH = registerBlock("end_moss_path", new BlockPath(END_MOSS)); public static final Block CHORUS_NYLIUM_PATH = registerBlock("chorus_nylium_path", new BlockPath(CHORUS_NYLIUM)); public static final Block CAVE_MOSS_PATH = registerBlock("cave_moss_path", new BlockPath(CAVE_MOSS)); - public static final Block CRYSTAL_MOSS_PATH = registerBlock("crystal_moss_path", new BlockPath(CAVE_MOSS)); + public static final Block CRYSTAL_MOSS_PATH = registerBlock("crystal_moss_path", new BlockPath(CRYSTAL_MOSS)); + public static final Block SHADOW_GRASS_PATH = registerBlock("shadow_grass_path", new BlockPath(SHADOW_GRASS)); // Rocks // public static final StoneMaterial FLAVOLITE = new StoneMaterial("flavolite", MaterialColor.SAND); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 852ca17c..41f5d3ed 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -12,6 +12,7 @@ import net.minecraft.world.gen.feature.ConfiguredFeature; import ru.betterend.world.features.BlueVineFeature; import ru.betterend.world.features.CavePlantFeature; import ru.betterend.world.features.DoublePlantFeature; +import ru.betterend.world.features.DragonTreeFeature; import ru.betterend.world.features.EndFeature; import ru.betterend.world.features.EndLakeFeature; import ru.betterend.world.features.EndLilyFeature; @@ -32,6 +33,7 @@ public class EndFeatures { public static final EndFeature MOSSY_GLOWSHROOM = new EndFeature("mossy_glowshroom", new MossyGlowshroomFeature(), 3); public static final EndFeature PYTHADENDRON_TREE = new EndFeature("pythadendron_tree", new PythadendronTreeFeature(), 2); public static final EndFeature LACUGROVE = new EndFeature("lacugrove", new LacugroveFeature(), 4); + public static final EndFeature DRAGON_TREE = new EndFeature("dragon_tree", new DragonTreeFeature(), 3); // Bushes // public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", new PythadendronBushFeature(), 4); diff --git a/src/main/java/ru/betterend/util/SplineHelper.java b/src/main/java/ru/betterend/util/SplineHelper.java index d407a6b6..6c675a3d 100644 --- a/src/main/java/ru/betterend/util/SplineHelper.java +++ b/src/main/java/ru/betterend/util/SplineHelper.java @@ -197,4 +197,15 @@ public class SplineHelper { } return true; } + + public static Vector3f getPos(List spline, float index) { + int i = (int) index; + float delta = index - i; + Vector3f p1 = spline.get(i); + Vector3f p2 = spline.get(i + 1); + float x = MathHelper.lerp(delta, p1.getX(), p2.getX()); + float y = MathHelper.lerp(delta, p1.getY(), p2.getY()); + float z = MathHelper.lerp(delta, p1.getZ(), p2.getZ()); + return new Vector3f(x, y, z); + } } diff --git a/src/main/java/ru/betterend/util/sdf/primitive/SDFPie.java b/src/main/java/ru/betterend/util/sdf/primitive/SDFPie.java new file mode 100644 index 00000000..4e728bb1 --- /dev/null +++ b/src/main/java/ru/betterend/util/sdf/primitive/SDFPie.java @@ -0,0 +1,31 @@ +package ru.betterend.util.sdf.primitive; + +import net.minecraft.util.math.MathHelper; +import ru.betterend.util.MHelper; + +public class SDFPie extends SDFPrimitive { + private float sin; + private float cos; + private float radius; + + public SDFPie setAngle(float angle) { + this.sin = (float) Math.sin(angle); + this.cos = (float) Math.cos(angle); + return this; + } + + public SDFPie setRadius(float radius) { + this.radius = radius; + return this; + } + + @Override + public float getDistance(float x, float y, float z) { + float px = Math.abs(x); + float l = MHelper.length(px, y, z) - radius; + float m = MHelper.dot(px, z, sin, cos); + m = MathHelper.clamp(m, 0, radius); + m = MHelper.length(px - sin * m, z - cos * m); + return MHelper.max(l, m * (float) Math.signum(cos * px - sin * z)); + } +} diff --git a/src/main/java/ru/betterend/world/biome/BiomeShadowForest.java b/src/main/java/ru/betterend/world/biome/BiomeShadowForest.java new file mode 100644 index 00000000..795d75af --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/BiomeShadowForest.java @@ -0,0 +1,25 @@ +package ru.betterend.world.biome; + +import net.minecraft.entity.EntityType; +import net.minecraft.particle.ParticleTypes; +import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; + +public class BiomeShadowForest extends EndBiome { + public BiomeShadowForest() { + super(new BiomeDefinition("shadow_forest") + .setFogColor(87, 26, 87) + .setFogDensity(1.5F) + .setPlantsColor(122, 45, 122) + .setSurface(EndBlocks.SHADOW_GRASS) + .setParticles(ParticleTypes.MYCELIUM, 0.01F) + //.setLoop(EndSounds.AMBIENT_CHORUS_FOREST) + //.setMusic(EndSounds.MUSIC_CHORUS_FOREST) + .addFeature(EndFeatures.END_LAKE_RARE) + .addFeature(EndFeatures.DRAGON_TREE) + //.addFeature(EndFeatures.PYTHADENDRON_BUSH) + .addStructureFeature(ConfiguredStructureFeatures.END_CITY) + .addMobSpawn(EntityType.ENDERMAN, 80, 1, 4)); + } +} diff --git a/src/main/java/ru/betterend/world/features/DragonTreeFeature.java b/src/main/java/ru/betterend/world/features/DragonTreeFeature.java new file mode 100644 index 00000000..663da872 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/DragonTreeFeature.java @@ -0,0 +1,151 @@ +package ru.betterend.world.features; + +import java.util.List; +import java.util.Random; +import java.util.function.Function; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.LeavesBlock; +import net.minecraft.block.Material; +import net.minecraft.client.util.math.Vector3f; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.MHelper; +import ru.betterend.util.SplineHelper; +import ru.betterend.util.sdf.PosInfo; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFCoordModify; +import ru.betterend.util.sdf.operator.SDFFlatWave; +import ru.betterend.util.sdf.operator.SDFScale3D; +import ru.betterend.util.sdf.operator.SDFSubtraction; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.operator.SDFUnion; +import ru.betterend.util.sdf.primitive.SDFSphere; + +public class DragonTreeFeature extends DefaultFeature { + private static final Function REPLACE; + private static final Function POST; + + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; + + float size = MHelper.randRange(15, 35, random); + List spline = SplineHelper.makeSpline(0, 0, 0, 0, size, 0, 6); + SplineHelper.offsetParts(spline, random, 1F, 0, 1F); + + if (!SplineHelper.canGenerate(spline, pos, world, REPLACE)) { + return false; + } + + float radius = MHelper.randRange(6F, 8F, random); + radius *= (size - 15F) / 20F + 1F; + Vector3f top = spline.get(spline.size() - 1); + + radius = size * MHelper.randRange(0.08F, 0.12F, random); + float radius2 = size / 15F; + SDF function = SplineHelper.buildSDF(spline, radius, radius2, (bpos) -> { + return EndBlocks.DRAGON_TREE.bark.getDefaultState(); + }); + + int branches = (int) ((size - 10) * 0.25F + 5); + radius = size * MHelper.randRange(0.4F, 0.6F, random); + /*for (int i = 0; i < branches; i++) { + float angle = (float) i / (float) branches * MHelper.PI2; + float x2 = top.getX() + (float) Math.sin(angle) * radius; + float z2 = top.getZ() + (float) Math.cos(angle) * radius; + spline = SplineHelper.makeSpline(top.getX(), top.getY(), top.getZ(), x2, top.getY(), z2, 7); + SplineHelper.powerOffset(spline, radius * 0.5F, 3); + SplineHelper.fillSpline(spline, world, EndBlocks.DRAGON_TREE.bark.getDefaultState(), pos, (state) -> { + return state.getMaterial().isReplaceable() || state.isOf(EndBlocks.DRAGON_TREE_LEAVES); + }); + }*/ + + BlockState leaves = EndBlocks.DRAGON_TREE_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 1); + SDF leafCap = new SDFSphere().setRadius(radius + 3).setBlock(leaves); + leafCap = new SDFScale3D().setScale(1, 0.25F, 1).setSource(leafCap); + SDF sub = new SDFSphere().setRadius(radius * 2).setBlock(Blocks.AIR); + sub = new SDFTranslate().setTranslate(0, radius * 2 - 2F, 0).setSource(sub); + leafCap = new SDFSubtraction().setSourceA(leafCap).setSourceB(sub); + + SDF branch = new SDFSphere().setRadius(1).setBlock(EndBlocks.DRAGON_TREE.bark); + branch = new SDFScale3D().setScale(1, 2F / radius, 1).setSource(branch); + branch = new SDFTranslate().setTranslate(0, -radius * 0.25F - 1F, 0).setSource(branch); + branch = new SDFFlatWave().setRaysCount(branches).setIntensity(radius).setSource(branch); + branch = new SDFCoordModify().setFunction((bpos) -> { + float dist = MHelper.length(bpos.getX(), bpos.getZ()); + bpos.set(bpos.getX(), bpos.getY() - dist * 0.1F, bpos.getZ()); + }).setSource(branch); + SDF center = new SDFSphere().setRadius(3).setBlock(EndBlocks.DRAGON_TREE.bark); + center = new SDFFlatWave().setRaysCount(branches).setIntensity(3).setSource(center); + branch = new SDFUnion().setSourceA(branch).setSourceB(center); + sub = new SDFSphere().setRadius(radius + 1).setBlock(leaves); + sub = new SDFScale3D().setScale(1, 0.25F, 1).setSource(sub); + branch = new SDFSubtraction().setSourceA(branch).setSourceB(sub); + + leafCap = new SDFUnion().setSourceA(leafCap).setSourceB(branch); + + OpenSimplexNoise noise = new OpenSimplexNoise(1234); + leafCap = new SDFCoordModify().setFunction((bpos) -> { + float dist = MHelper.length(bpos.getX(), bpos.getZ()); + float y = bpos.getY() + (float) noise.eval(bpos.getX() * 0.1 + pos.getX(), bpos.getZ() * 0.1 + pos.getZ()) * dist * 0.3F + dist * 0.25F; + bpos.set(bpos.getX(), y, bpos.getZ()); + }).setSource(leafCap); + + SDF smallLeaf = leafCap; + leafCap = new SDFTranslate().setTranslate(top.getX(), top.getY() + radius * 0.25F + 1.5F, top.getZ()).setSource(leafCap); + function = new SDFUnion().setSourceA(function).setSourceB(leafCap); + + /*branches = Math.round((size - 15) * 0.1F); + if (branches > 0) { + SDF pie = new SDFPie().setRadius(50).setAngle((float) Math.toRadians(135)).setBlock(leaves); + smallLeaf = new SDFIntersection().setSourceA(leafCap).setSourceB(pie); + + for (int i = 0; i < branches; i++) { + float indexF = MHelper.randRange(3F, 5F, random); + Vector3f vec = SplineHelper.getPos(spline, indexF); + float scale = MHelper.randRange(0.3F, 0.6F, random); + SDF leaf = new SDFScale().setScale(scale).setSource(smallLeaf); + leaf = new SDFRotation().setRotation(Vector3f.POSITIVE_Y, MHelper.randRange(0, MHelper.PI2, random)).setSource(leaf); + leaf = new SDFTranslate().setTranslate(vec.getX(), vec.getY(), vec.getZ()).setSource(leaf); + function = new SDFUnion().setSourceA(function).setSourceB(leaf); + } + }*/ + + function.setReplaceFunction(REPLACE); + function.setPostProcess(POST); + function.fillRecursiveIgnore(world, pos, (state) -> { + return EndBlocks.DRAGON_TREE.isTreeLog(state) || state.isOf(EndBlocks.DRAGON_TREE_LEAVES); + }); + + return true; + } + + static { + REPLACE = (state) -> { + if (state.isIn(EndTags.END_GROUND)) { + return true; + } + if (state.getBlock() == EndBlocks.DRAGON_TREE_LEAVES) { + return true; + } + if (state.getMaterial().equals(Material.PLANT)) { + return true; + } + return state.getMaterial().isReplaceable(); + }; + + POST = (info) -> { + if (EndBlocks.DRAGON_TREE.isTreeLog(info.getStateUp()) && EndBlocks.DRAGON_TREE.isTreeLog(info.getStateDown())) { + return EndBlocks.DRAGON_TREE.log.getDefaultState(); + } + return info.getState(); + }; + } +} diff --git a/src/main/java/ru/betterend/world/features/LacugroveFeature.java b/src/main/java/ru/betterend/world/features/LacugroveFeature.java index b4bdf0e9..720bf4a4 100644 --- a/src/main/java/ru/betterend/world/features/LacugroveFeature.java +++ b/src/main/java/ru/betterend/world/features/LacugroveFeature.java @@ -45,13 +45,7 @@ public class LacugroveFeature extends DefaultFeature { } OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); - /*Vector3f center = null; - for (int i = 3; i < 6; i++) { - center = spline.get(i); - float radius = MathHelper.lerp((i - 3F) / 2F, 6.5F, 3.7F) + MHelper.randRange(-0.5F, 0.5F, random); - radius *= (size - 15F) / 20F + 1F; - leavesBall(world, pos.add(center.getX(), center.getY(), center.getZ()), radius, random, noise); - }*/ + float radius = MHelper.randRange(6F, 8F, random); radius *= (size - 15F) / 20F + 1F; Vector3f center = spline.get(4); diff --git a/src/main/resources/assets/betterend/blockstates/shadow_grass.json b/src/main/resources/assets/betterend/blockstates/shadow_grass.json new file mode 100644 index 00000000..37d4a7f0 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/shadow_grass.json @@ -0,0 +1,21 @@ +{ + "variants": { + "": [ + { + "model": "betterend:block/shadow_grass" + }, + { + "model": "betterend:block/shadow_grass", + "y": 90 + }, + { + "model": "betterend:block/shadow_grass", + "y": 180 + }, + { + "model": "betterend:block/shadow_grass", + "y": 270 + } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/shadow_grass_path.json b/src/main/resources/assets/betterend/blockstates/shadow_grass_path.json new file mode 100644 index 00000000..e31a8a14 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/shadow_grass_path.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/shadow_grass_path" }, + { "model": "betterend:block/shadow_grass_path", "y": 90 }, + { "model": "betterend:block/shadow_grass_path", "y": 180 }, + { "model": "betterend:block/shadow_grass_path", "y": 270 } + ] + } +} diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 5e7d9781..c7a494e4 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -250,9 +250,9 @@ "block.betterend.dragon_tree_planks": "Доски из драконова древа", "block.betterend.dragon_tree_plate": "Нажимная плита из драконова древа", "block.betterend.dragon_tree_sign": "Табличка из драконова древа", - "block.betterend.dragon_tree_slab": "", - "block.betterend.dragon_tree_stairs": "", - "block.betterend.dragon_tree_stripped_bark": "", - "block.betterend.dragon_tree_stripped_log": "", - "block.betterend.dragon_tree_trapdoor": "" + "block.betterend.dragon_tree_slab": "Плита из драконова древа", + "block.betterend.dragon_tree_stairs": "Ступени из драконова древа", + "block.betterend.dragon_tree_stripped_bark": "Обтёсанная кора драконова древа", + "block.betterend.dragon_tree_stripped_log": "Обтёсанное бревно драконова древа", + "block.betterend.dragon_tree_trapdoor": "Люк из драконова древа" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/shadow_grass.json b/src/main/resources/assets/betterend/models/block/shadow_grass.json new file mode 100644 index 00000000..fff020c9 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/shadow_grass.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "block/end_stone", + "east": "betterend:block/shadow_grass_side", + "north": "betterend:block/shadow_grass_side", + "particle": "betterend:block/shadow_grass_side", + "south": "betterend:block/shadow_grass_side", + "up": "betterend:block/shadow_grass_top", + "west": "betterend:block/shadow_grass_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/shadow_grass_path.json b/src/main/resources/assets/betterend/models/block/shadow_grass_path.json new file mode 100644 index 00000000..23a7a0ac --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/shadow_grass_path.json @@ -0,0 +1,7 @@ +{ "parent": "betterend:block/path", + "textures": { + "top": "betterend:block/shadow_grass_path_top", + "side": "betterend:block/shadow_grass_side", + "bottom": "block/end_stone" + } +} diff --git a/src/main/resources/assets/betterend/models/item/shadow_grass.json b/src/main/resources/assets/betterend/models/item/shadow_grass.json new file mode 100644 index 00000000..2ae401d8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/shadow_grass.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/shadow_grass" +} diff --git a/src/main/resources/assets/betterend/models/item/shadow_grass_path.json b/src/main/resources/assets/betterend/models/item/shadow_grass_path.json new file mode 100644 index 00000000..899af266 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/shadow_grass_path.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/shadow_grass_path" +} diff --git a/src/main/resources/assets/betterend/textures/block/shadow_grass_path_top.png b/src/main/resources/assets/betterend/textures/block/shadow_grass_path_top.png new file mode 100644 index 0000000000000000000000000000000000000000..ca8d71bbf10f1810ce6dbdbf942c1e6427d283d0 GIT binary patch literal 2163 zcmc&$eQeZZ94?}#0y88a7`{?VFyQF*z7c-y{rS9jNTZMVBE z<3kkr7>c4GK?oo)bjpVigNk8@A|euq7%@&Fh(_HPv73W(vs0RUHWvvFf1oj94tfE?#^-FUFiJcOEC^z?l+1jS{T-~hjVnomMwn> z!(6M?@(Q~mJVuoDgc~Tj1l_5GfzTK>JU?XsxeD621f!}JAb#E6Lg1ZXD9+N1pQ8N~;~{BAq&d+e;F%wRqM1rWEDMgx#6oug zB4*o$NKwgT(w+3Ubu&saf*?>dOR+485TsS7*&sz~*1&d#AhcvtHEdPaaEB2{dW{_* zkkYmk5=NF*vod8u1*1~Hpcpspq?86Kau#RQnDKOQMW$dJCZJ|p2+L%#s7m2*7TzIk zB9TQ~c2O--l*z3_v{hbbK&lK{dW|W=qFNMjV7o9QrrWv|({GYT_Hi~FLo75QuywOs z*W>MtDs5-M3k#jb@c7^fs;1~kYlsslvjzr%4Fd#Avoy)jq=zYIS*LLi!d|$YMk{695%TO@Jt*3@w_D77mLc&9Z?e!%#3lAgOLu zRYXVwAaTA3srZpr==bs@&r3YXGJc>4k_UP?(7ryX%Qa3Do%L;gR&*J0WJ@Q?UYg?> zKTCp$k0Cw0S0H&mgk%KeNlTIsa6YD;ZLF!HR|>?hXLVF5h!H@J_pyK@eLg54GOtVu z63vr-NJEK}051y>0{rl-*6?F_SD4Rn+J?m!Kd%0yq4IlGc1hILAXf(7M+4+Os4YwjA+ z?e5an&d+V8?mfEm+Khg^du^3pj^;l2IAoVp9wBosH{=~S|6%i^KgYSg&yU)3{I~Uu z&5c`zPTBNoL(BIwh7Wl2@afRHSJw7w+~Q`g(KahI1=Q)~{N%$va@-Px&jyR&F|6Gx?dwl4V83ds=soJ=&1Br_Y!{YffovPufqlZ1`n* t%fjT`3!UqxKJd=cEoW!-=(=;z<*w>9;IF7WblUk_5GpDOZX7vv*58Ed=r#ZV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/shadow_grass_side.png b/src/main/resources/assets/betterend/textures/block/shadow_grass_side.png new file mode 100644 index 0000000000000000000000000000000000000000..c516ff8e4d33d8c45a3935731371790c49de5ff3 GIT binary patch literal 2321 zcmcImdvMf591fHzuK`iyAy`axCo8D?_mWCjG2O4)bWL@o01c}@% zxij@l*F;WG{3c#hJit`wS0NffVkZ=;ypRiY)C005*@4|Wa2P`+(Sc33x=5Fr2y&#< z;sBUhobDEia|OGIO^8Ed3pq&O2Re@y`hBv-6*{mWF9-X^FoB^#h@R`f;thjnrfV{q zs009NH8HqAS!k5Cn<$2~)0S~4O;RjDvIJ$uNs1#G&TL0R7Y3~bL@$@&Ob*$CZw@R+ z*Hw-n3JMBL1!j{H$R;Se-A<4+LDM)y;98Na^M$yqjqGG_0!;`=sxB!qYB2I1C0}=7 z(9@0({A!q1) z{r)go)05^xk3z9^iPqdjDj+g|rsM|%kTe%s9NFoZnxp87mZLl(j_`Ci8kI{70A5!D zZbk8R7HV=Q3!0c{6vl?eOqXO)DbU6khC*wAlh=U*qe+^?DH1nRZkjd??cHIa(Fo#z#Wvp z{zE)Zq}oSUXo;7j=20WwTg0G=xKsm=Qk zr2F7BXS_S+q@(J1`M@d9mgc^iQPbi@w^a2{%SQHU=ZYfP^5HGie1tU(A5v1eX*^r9 zbohndhX&-0l-6yEqDQaT@otTMK}~n!i(ONjYu{;TUR8Utc~si4%465}&on*XzqQ!m zYVv&i-Tb(>#tmNInEd(~C$>4J+<$%!I$#AjceAxDAsRuiEp=k;_eb=3^X&GjtXd^UcCVNJP`M>c9sXEp796Ou4Zk0wU#kAF{z%K35i6r39NgN8$&syBFTXZtQr+Rm(w?Wg%^nncE57bZSu3$I_J9|; zv1R9(U+OL%aF0#8cmKR~9<$!Ht*OVFE8gBGu71)yIezyAc}DBo-ja$2b&`@bcu2yL zn!K7G7v$9&QtFqj-bg3cKYe&{(UgPZhS{RC4(y;_`6)M!JalqF^Q=WxWpNqbM{fVJ zvToM?ye1U6K1LgqocYztGovwfRF9}n(_^S;E@ph+^EYfG>f3Xr(mSowFaOFnwyP3X zacuO4AwzGS@Gm(Xk=xL7Ah9kXb=J<5dvzDTZExQ3^AC4U{n2x86PNP!EVsq@X-P{; KckWJ@UGgVC44Gn~dr#j6wqnJ`rwV~|}R%s>#` zUEWinRya#(Rt)JGPV@qOBqTvJg5(uMB!;a7D(VG(Ua(=ex({L~&)KkYlaq8xb`ao; zt7WjF+T~%ZD_JXt738CN5gHPNfXbkeP*70lhz*PJ(r~SPCNMMxQ7dg&p(YTmaJo^u zCq#vcqylQ|!~+_5+=3+`-K zKvgB0Aj09WK5W#BvY#+mtyY4h2#UfX0#~Af%0zHMnVn#80ELx#N##WW)fgGCSf$!9 zsOhK)At^~KC~-GIhY=A*A`E&`Gbsk-*d$J>l7lhf97}*82mwJ=Al8t?LN7U;N%%u) zL!l&EQH$0?jpDXF6s>ro5+IfXMXZupP_!OOoSjfi3W%zx1jK)^BYB*(MxyO9U{q1| zh+;4iD0hMdwcEA8SkUZpUf{&AGEWl}zXKeM3TzlfQY3C5aihUQQCi?AY5{4aNpckG zgsH$WD)VSyk>h>Q|AcZZ?Gxn?10BVO7(XB+!5@?6bkZe)qA~&tN*p!}s;cLCj%I+_ zVxkx`ZZZKY&iHaz-0CGQcrGA;*X(61tksve?-1E4Er^Nx-2c44Oy*$`F~P^@Nd}3w zi$PI#iX8N^QA^=iD$&Kf0^=2p7sU#&F1`x#Xe@hZhSd_>hOt^?0f)su^N;PBQQB|- zK+=B+_b5yeeQKDIL7^Xd@li60fcg_!HIAA>{N2jf*&w3l-hZOXZSUE6&GFL8kF&aZ zGbV0cSNYx$f8bJM-{SMg@nO&I7sZTo_eV~)HMM_tx-513_1hJ>OTGrTAYc|5T6G`;nv80aqkfx-V5f|L}w K9D5hNvf)qS)Ogqc literal 0 HcmV?d00001