From bb39d14bb8889e41535d1c8b636083d0ad39e811 Mon Sep 17 00:00:00 2001 From: Justin Parsell Date: Thu, 25 Feb 2021 21:37:57 -0500 Subject: [PATCH] Updated textures, implemented tree gen --- .../cherry/common/features/CherryTree.java | 10 +++++++- .../parsell/cherry/core/CherryFeatures.java | 22 ++++++++++++++---- .../cherry/textures/block/cherry_leaves.png | Bin 261 -> 468 bytes .../cherry/textures/block/cherry_log.png | Bin 267 -> 14046 bytes .../cherry/textures/block/cherry_log_top.png | Bin 318 -> 14541 bytes 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/parsell/cherry/common/features/CherryTree.java b/src/main/java/net/parsell/cherry/common/features/CherryTree.java index fc2ae71..f5cc24e 100644 --- a/src/main/java/net/parsell/cherry/common/features/CherryTree.java +++ b/src/main/java/net/parsell/cherry/common/features/CherryTree.java @@ -22,11 +22,19 @@ public class CherryTree extends Feature { public boolean generate(StructureWorldAccess world, ChunkGenerator generator, Random random, BlockPos pos, DefaultFeatureConfig config) { BlockPos topPos = world.getTopPosition(Heightmap.Type.WORLD_SURFACE, pos); Direction offset = Direction.NORTH; - + /* for (int y = 1; y <= 15; y++) { offset = offset.rotateYClockwise(); world.setBlockState(topPos.up(y).offset(offset), CherryBlocks.CHERRYLOG.getDefaultState(), 3); } + */ + if (isSoil(world, topPos.down())){ + System.out.println(pos.toString() + " is soil! (TOP)"); + for (int y = 0; y <=7; y++) + world.setBlockState(topPos.up(y), CherryBlocks.CHERRYLOG.getDefaultState(), 3); + } else { + System.out.println(pos.toString() + " is not soil! (TOP)"); + } return true; } diff --git a/src/main/java/net/parsell/cherry/core/CherryFeatures.java b/src/main/java/net/parsell/cherry/core/CherryFeatures.java index 4dd2476..7957ca8 100644 --- a/src/main/java/net/parsell/cherry/core/CherryFeatures.java +++ b/src/main/java/net/parsell/cherry/core/CherryFeatures.java @@ -1,5 +1,7 @@ package net.parsell.cherry.core; +import com.google.common.collect.ImmutableList; + import net.fabricmc.fabric.api.biome.v1.BiomeModifications; import net.fabricmc.fabric.api.biome.v1.BiomeSelectors; import net.minecraft.block.BlockState; @@ -9,25 +11,37 @@ import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.UniformIntDistribution; +import net.minecraft.world.gen.decorator.ChanceDecoratorConfig; +import net.minecraft.world.gen.decorator.CountExtraDecoratorConfig; +import net.minecraft.world.gen.decorator.Decorator; import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.ConfiguredFeatures; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.FeatureConfig; +import net.minecraft.world.gen.feature.RandomFeatureConfig; import net.minecraft.world.gen.feature.TreeFeature; import net.minecraft.world.gen.feature.TreeFeatureConfig; +import net.minecraft.world.gen.feature.TreeFeatureConfig.Builder; +import net.minecraft.world.gen.feature.size.FeatureSize; import net.minecraft.world.gen.feature.size.TwoLayersFeatureSize; import net.minecraft.world.gen.foliage.BlobFoliagePlacer; +import net.minecraft.world.gen.foliage.FoliagePlacer; import net.minecraft.world.gen.stateprovider.SimpleBlockStateProvider; import net.minecraft.world.gen.trunk.StraightTrunkPlacer; - +import net.parsell.cherry.common.features.CherryTree; public class CherryFeatures { private static final BlockState CHERRYLOG_STATE = CherryBlocks.CHERRYLOG.getDefaultState(); private static final BlockState CHERRYLEAVES_STATE = CherryBlocks.CHERRYLEAVES.getDefaultState(); // Create the features - private static final Feature CHERRY_TREE_1 = new TreeFeature(TreeFeatureConfig.CODEC); + private static final Feature CHERRY_TREE_1 = new CherryTree(DefaultFeatureConfig.CODEC); // Configure the features - public static final ConfiguredFeature CHERRY_TREE_1_C = CHERRY_TREE_1.configure((new TreeFeatureConfig.Builder(new SimpleBlockStateProvider(CherryFeatures.CHERRYLOG_STATE), new SimpleBlockStateProvider(CherryFeatures.CHERRYLEAVES_STATE), new BlobFoliagePlacer(UniformIntDistribution.of(2), UniformIntDistribution.of(0), 3), new StraightTrunkPlacer(4, 2, 0), new TwoLayersFeatureSize(1, 0, 1))).ignoreVines().build()); + static TreeFeatureConfig CHERRY_TREE_1_CONFIG = new TreeFeatureConfig.Builder(new SimpleBlockStateProvider(CHERRYLOG_STATE), new SimpleBlockStateProvider(CHERRYLEAVES_STATE), new BlobFoliagePlacer(UniformIntDistribution.of(2), UniformIntDistribution.of(0), 3), new StraightTrunkPlacer(4, 2, 0), new TwoLayersFeatureSize(1, 0, 1)).ignoreVines().build(); + public static final ConfiguredFeature CHERRY_TREE_1_C = Feature.TREE.configure(CHERRY_TREE_1_CONFIG); + public static final ConfiguredFeature CHERRY_TREE_1_C_R = Feature.RANDOM_SELECTOR.configure(new RandomFeatureConfig(ImmutableList.of(CHERRY_TREE_1_C.withChance(0.8F)), CHERRY_TREE_1_C)).decorate(ConfiguredFeatures.Decorators.SQUARE_HEIGHTMAP).decorate(Decorator.COUNT_EXTRA.configure(new CountExtraDecoratorConfig(1, 0.1F, 1))); private static void addFeatures(){ // Register the features @@ -35,7 +49,7 @@ public class CherryFeatures { // Register the configured features RegistryKey> cherryTree1 = RegistryKey.of(Registry.CONFIGURED_FEATURE_WORLDGEN, new Identifier("cherry", "cherry_tree_1")); - Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, cherryTree1.getValue(), CHERRY_TREE_1_C); + Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, cherryTree1.getValue(), CHERRY_TREE_1_C_R); // Modify the biomes BiomeModifications.addFeature(BiomeSelectors.all(), GenerationStep.Feature.VEGETAL_DECORATION, cherryTree1); diff --git a/src/main/resources/assets/cherry/textures/block/cherry_leaves.png b/src/main/resources/assets/cherry/textures/block/cherry_leaves.png index 637a8dc3122519e60d2a6b005ece902101f79b38..bd34dea60d52e97ddf2cf197732fe1f7c4e38680 100644 GIT binary patch literal 468 zcmV;_0W1EAP)ud@1;;#x z1jVwMaH%S2bJGMt-Vg*aJa09`)R-j+k~kK*Ytx{qYjkbv?NOqC-JC(Oe9#g1!w6@ zk`d@)E#eVW>0NgpKz>XaDM6!*W>=f5>H^pG27>SPS{P|rHhe!Ah(?lRb6qzmiqlZE z%QDdWGv)|VIwuMK!}VNP?-r(Jmv|)lts`kUUB%HHuRqUW!H=Jg^rwj5lL+^QL#42vW{p6wz*| zi>8@#bC5_xbduw=zB~*kmq=CkGUx5*Hfr)*7lH3XRY%G`|8l?LK?^jdb9N>G0000< KMNUMnLSTa9dCd9% literal 261 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 literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0h7I;J!GcfQS24TkI`72U@f(txd978<3-%j)9Yf#`}<^FEp{ry8og!F|O zQ`%M5ubI(0e?m#u(gdyJnqHcdF8y^llJxACQ~$b%Gin^k+-*4rCmd~RDErN|W#`+p zaK6YnOJ?5Jt$r!?NXF{qr>uU!rd+;;!Wv_;X% zd7`UX14D`xqd>tn8__R^4W2D%s*~7~@Q-Z6%TNylE L{an^LB{Ts5Xpd$c diff --git a/src/main/resources/assets/cherry/textures/block/cherry_log_top.png b/src/main/resources/assets/cherry/textures/block/cherry_log_top.png index 46219362c4910d1a2e09c75924aee197253f6912..36534d7532c2d168cc83fd0ac0b451654dc956f9 100644 GIT binary patch literal 14541 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 literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSK$uZf!>a)(c-hm%F(ktM?ex36hYWaH=AJpi!*fKT=MY0q z!x6uO>v#-BrzRaQ?V9p_=}GT*pUVA$ciM6Zu-a?to)w7DFE$UGldyLelh?cR+S?h< zE$80;<%(#4!qLvs_~w%h>X#3g6gV&+Z2ZExXx{EMu596Ka|)JND1J4X(R8CfS?18Z zq$I~zGgm!aZ=5{$2+yKIwiljlJ%$SR<}>qz6e^u)*pqR8tJ;YJWsTD195dONZ@;t6 zFlhL#zWsuv$pwR7eccUgQf|*LRBS%?cV1H3Khw{TBW7xycW@OfRB|6^;=sgBc LS3j3^P6