adjustments + olive leaves
This commit is contained in:
+5
-10
@@ -30,23 +30,18 @@
|
|||||||
"foliage_provider": {
|
"foliage_provider": {
|
||||||
"type": "minecraft:simple_state_provider",
|
"type": "minecraft:simple_state_provider",
|
||||||
"state": {
|
"state": {
|
||||||
"Name": "minecraft:oak_leaves",
|
"Name": "ageofthegods:olive_leaves"
|
||||||
"Properties": {
|
|
||||||
"distance": "7",
|
|
||||||
"persistent": "false",
|
|
||||||
"waterlogged": "false"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ignore_vines": false,
|
"ignore_vines": false,
|
||||||
"minimum_size": {
|
"minimum_size": {
|
||||||
"type": "minecraft:two_layers_feature_size",
|
"type": "minecraft:two_layers_feature_size",
|
||||||
"limit": 5,
|
"limit": 3,
|
||||||
"lower_size": 3,
|
"lower_size": 1,
|
||||||
"upper_size": 5
|
"upper_size": 3
|
||||||
},
|
},
|
||||||
"trunk_placer": {
|
"trunk_placer": {
|
||||||
"type": "ageofthegods:twisty_trunk_placer",
|
"type": "ageofthegods:bush_twisty_trunk_placer",
|
||||||
"base_height": 2,
|
"base_height": 2,
|
||||||
"height_rand_a": 3,
|
"height_rand_a": 3,
|
||||||
"height_rand_b": 3
|
"height_rand_b": 3
|
||||||
|
|||||||
+1
-1
@@ -46,7 +46,7 @@
|
|||||||
"upper_size": 5
|
"upper_size": 5
|
||||||
},
|
},
|
||||||
"trunk_placer": {
|
"trunk_placer": {
|
||||||
"type": "ageofthegods:twisty_trunk_placer",
|
"type": "ageofthegods:tall_twisty_trunk_placer",
|
||||||
"base_height": 3,
|
"base_height": 3,
|
||||||
"height_rand_a": 3,
|
"height_rand_a": 3,
|
||||||
"height_rand_b": 3
|
"height_rand_b": 3
|
||||||
|
|||||||
+1
-1
@@ -46,7 +46,7 @@
|
|||||||
"upper_size": 5
|
"upper_size": 5
|
||||||
},
|
},
|
||||||
"trunk_placer": {
|
"trunk_placer": {
|
||||||
"type": "ageofthegods:twisty_trunk_placer",
|
"type": "ageofthegods:tall_twisty_trunk_placer",
|
||||||
"base_height": 10,
|
"base_height": 10,
|
||||||
"height_rand_a": 10,
|
"height_rand_a": 10,
|
||||||
"height_rand_b": 10
|
"height_rand_b": 10
|
||||||
|
|||||||
+4
-4
@@ -41,12 +41,12 @@
|
|||||||
"ignore_vines": false,
|
"ignore_vines": false,
|
||||||
"minimum_size": {
|
"minimum_size": {
|
||||||
"type": "minecraft:two_layers_feature_size",
|
"type": "minecraft:two_layers_feature_size",
|
||||||
"limit": 4,
|
"limit": 3,
|
||||||
"lower_size": 3,
|
"lower_size": 1,
|
||||||
"upper_size": 4
|
"upper_size": 3
|
||||||
},
|
},
|
||||||
"trunk_placer": {
|
"trunk_placer": {
|
||||||
"type": "ageofthegods:twisty_trunk_placer",
|
"type": "ageofthegods:tall_twisty_trunk_placer",
|
||||||
"base_height": 12,
|
"base_height": 12,
|
||||||
"height_rand_a": 10,
|
"height_rand_a": 10,
|
||||||
"height_rand_b": 10
|
"height_rand_b": 10
|
||||||
|
|||||||
+2
-4
@@ -2,10 +2,8 @@
|
|||||||
"feature": "ageofthegods:tall_thin_twisty_tree",
|
"feature": "ageofthegods:tall_thin_twisty_tree",
|
||||||
"placement": [
|
"placement": [
|
||||||
{
|
{
|
||||||
"type": "minecraft:noise_threshold_count",
|
"type": "minecraft:count",
|
||||||
"above_noise": 10,
|
"count": 15
|
||||||
"below_noise": 3,
|
|
||||||
"noise_level": -0.2
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:rarity_filter",
|
"type": "minecraft:rarity_filter",
|
||||||
|
|||||||
@@ -454,6 +454,24 @@
|
|||||||
"then_run": {
|
"then_run": {
|
||||||
"type": "minecraft:sequence",
|
"type": "minecraft:sequence",
|
||||||
"sequence": [
|
"sequence": [
|
||||||
|
{
|
||||||
|
"type": "minecraft:condition",
|
||||||
|
"if_true": {
|
||||||
|
"type": "minecraft:not",
|
||||||
|
"invert": {
|
||||||
|
"type": "minecraft:water",
|
||||||
|
"add_stone_depth": false,
|
||||||
|
"offset": -1,
|
||||||
|
"surface_depth_multiplier": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"then_run": {
|
||||||
|
"type": "minecraft:block",
|
||||||
|
"result_state": {
|
||||||
|
"Name": "minecraft:sandstone"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:condition",
|
"type": "minecraft:condition",
|
||||||
"if_true": {
|
"if_true": {
|
||||||
@@ -641,6 +659,24 @@
|
|||||||
"then_run": {
|
"then_run": {
|
||||||
"type": "minecraft:sequence",
|
"type": "minecraft:sequence",
|
||||||
"sequence": [
|
"sequence": [
|
||||||
|
{
|
||||||
|
"type": "minecraft:condition",
|
||||||
|
"if_true": {
|
||||||
|
"type": "minecraft:not",
|
||||||
|
"invert": {
|
||||||
|
"type": "minecraft:water",
|
||||||
|
"add_stone_depth": false,
|
||||||
|
"offset": -1,
|
||||||
|
"surface_depth_multiplier": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"then_run": {
|
||||||
|
"type": "minecraft:block",
|
||||||
|
"result_state": {
|
||||||
|
"Name": "ageofthegods:shale_block"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:condition",
|
"type": "minecraft:condition",
|
||||||
"if_true": {
|
"if_true": {
|
||||||
@@ -787,6 +823,24 @@
|
|||||||
"then_run": {
|
"then_run": {
|
||||||
"type": "minecraft:sequence",
|
"type": "minecraft:sequence",
|
||||||
"sequence": [
|
"sequence": [
|
||||||
|
{
|
||||||
|
"type": "minecraft:condition",
|
||||||
|
"if_true": {
|
||||||
|
"type": "minecraft:not",
|
||||||
|
"invert": {
|
||||||
|
"type": "minecraft:water",
|
||||||
|
"add_stone_depth": false,
|
||||||
|
"offset": -1,
|
||||||
|
"surface_depth_multiplier": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"then_run": {
|
||||||
|
"type": "minecraft:block",
|
||||||
|
"result_state": {
|
||||||
|
"Name": "ageofthegods:shale_block"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:condition",
|
"type": "minecraft:condition",
|
||||||
"if_true": {
|
"if_true": {
|
||||||
@@ -804,6 +858,29 @@
|
|||||||
"min_threshold": 0.0,
|
"min_threshold": 0.0,
|
||||||
"noise": "minecraft:patch"
|
"noise": "minecraft:patch"
|
||||||
},
|
},
|
||||||
|
"then_run": {
|
||||||
|
"type": "minecraft:condition",
|
||||||
|
"if_true": {
|
||||||
|
"type": "minecraft:y_above",
|
||||||
|
"add_stone_depth": false,
|
||||||
|
"anchor": {
|
||||||
|
"absolute": 64
|
||||||
|
},
|
||||||
|
"surface_depth_multiplier": 0
|
||||||
|
},
|
||||||
|
"then_run": {
|
||||||
|
"type": "minecraft:condition",
|
||||||
|
"if_true": {
|
||||||
|
"type": "minecraft:not",
|
||||||
|
"invert": {
|
||||||
|
"type": "minecraft:y_above",
|
||||||
|
"add_stone_depth": false,
|
||||||
|
"anchor": {
|
||||||
|
"absolute": 72
|
||||||
|
},
|
||||||
|
"surface_depth_multiplier": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
"then_run": {
|
"then_run": {
|
||||||
"type": "minecraft:block",
|
"type": "minecraft:block",
|
||||||
"result_state": {
|
"result_state": {
|
||||||
@@ -811,14 +888,16 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:condition",
|
"type": "minecraft:condition",
|
||||||
"if_true": {
|
"if_true": {
|
||||||
"type": "minecraft:stone_depth",
|
"type": "minecraft:stone_depth",
|
||||||
"add_surface_depth": false,
|
"add_surface_depth": true,
|
||||||
"offset": 4,
|
"offset": 0,
|
||||||
"secondary_depth_range": 0,
|
"secondary_depth_range": 2,
|
||||||
"surface_type": "floor"
|
"surface_type": "floor"
|
||||||
},
|
},
|
||||||
"then_run": {
|
"then_run": {
|
||||||
@@ -829,6 +908,19 @@
|
|||||||
"min_threshold": 0.0,
|
"min_threshold": 0.0,
|
||||||
"noise": "minecraft:patch"
|
"noise": "minecraft:patch"
|
||||||
},
|
},
|
||||||
|
"then_run": {
|
||||||
|
"type": "minecraft:condition",
|
||||||
|
"if_true": {
|
||||||
|
"type": "minecraft:not",
|
||||||
|
"invert": {
|
||||||
|
"type": "minecraft:y_above",
|
||||||
|
"add_stone_depth": false,
|
||||||
|
"anchor": {
|
||||||
|
"absolute": 72
|
||||||
|
},
|
||||||
|
"surface_depth_multiplier": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
"then_run": {
|
"then_run": {
|
||||||
"type": "minecraft:block",
|
"type": "minecraft:block",
|
||||||
"result_state": {
|
"result_state": {
|
||||||
@@ -839,14 +931,57 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:condition",
|
"type": "minecraft:condition",
|
||||||
"if_true": {
|
"if_true": {
|
||||||
"type": "minecraft:stone_depth",
|
"type": "minecraft:stone_depth",
|
||||||
"add_surface_depth": false,
|
"add_surface_depth": true,
|
||||||
|
"offset": 1,
|
||||||
|
"secondary_depth_range": 2,
|
||||||
|
"surface_type": "floor"
|
||||||
|
},
|
||||||
|
"then_run": {
|
||||||
|
"type": "minecraft:condition",
|
||||||
|
"if_true": {
|
||||||
|
"type": "minecraft:noise_threshold",
|
||||||
|
"max_threshold": 0.1,
|
||||||
|
"min_threshold": 0.05,
|
||||||
|
"noise": "minecraft:patch"
|
||||||
|
},
|
||||||
|
"then_run": {
|
||||||
|
"type": "minecraft:condition",
|
||||||
|
"if_true": {
|
||||||
|
"type": "minecraft:not",
|
||||||
|
"invert": {
|
||||||
|
"type": "minecraft:y_above",
|
||||||
|
"add_stone_depth": false,
|
||||||
|
"anchor": {
|
||||||
|
"absolute": 72
|
||||||
|
},
|
||||||
|
"surface_depth_multiplier": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"then_run": {
|
||||||
|
"type": "minecraft:block",
|
||||||
|
"result_state": {
|
||||||
|
"Name": "minecraft:water",
|
||||||
|
"Properties": {
|
||||||
|
"level": "0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:condition",
|
||||||
|
"if_true": {
|
||||||
|
"type": "minecraft:stone_depth",
|
||||||
|
"add_surface_depth": true,
|
||||||
"offset": 6,
|
"offset": 6,
|
||||||
"secondary_depth_range": 0,
|
"secondary_depth_range": 3,
|
||||||
"surface_type": "floor"
|
"surface_type": "floor"
|
||||||
},
|
},
|
||||||
"then_run": {
|
"then_run": {
|
||||||
@@ -857,6 +992,19 @@
|
|||||||
"min_threshold": 0.0,
|
"min_threshold": 0.0,
|
||||||
"noise": "minecraft:patch"
|
"noise": "minecraft:patch"
|
||||||
},
|
},
|
||||||
|
"then_run": {
|
||||||
|
"type": "minecraft:condition",
|
||||||
|
"if_true": {
|
||||||
|
"type": "minecraft:not",
|
||||||
|
"invert": {
|
||||||
|
"type": "minecraft:y_above",
|
||||||
|
"add_stone_depth": false,
|
||||||
|
"anchor": {
|
||||||
|
"absolute": 72
|
||||||
|
},
|
||||||
|
"surface_depth_multiplier": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
"then_run": {
|
"then_run": {
|
||||||
"type": "minecraft:block",
|
"type": "minecraft:block",
|
||||||
"result_state": {
|
"result_state": {
|
||||||
@@ -864,14 +1012,15 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:condition",
|
"type": "minecraft:condition",
|
||||||
"if_true": {
|
"if_true": {
|
||||||
"type": "minecraft:stone_depth",
|
"type": "minecraft:stone_depth",
|
||||||
"add_surface_depth": false,
|
"add_surface_depth": true,
|
||||||
"offset": 1,
|
"offset": 1,
|
||||||
"secondary_depth_range": 0,
|
"secondary_depth_range": 2,
|
||||||
"surface_type": "floor"
|
"surface_type": "floor"
|
||||||
},
|
},
|
||||||
"then_run": {
|
"then_run": {
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ public class AgeoftheGods {
|
|||||||
output.accept(SHALE_ITEM.get());
|
output.accept(SHALE_ITEM.get());
|
||||||
output.accept(SHALE_GRASS_ITEM.get());
|
output.accept(SHALE_GRASS_ITEM.get());
|
||||||
output.accept(LIMESTONE_GRASS_ITEM.get());
|
output.accept(LIMESTONE_GRASS_ITEM.get());
|
||||||
|
output.accept(OLIVE_LEAVES_ITEM.get());
|
||||||
}).build());
|
}).build());
|
||||||
|
|
||||||
// The constructor for the mod class is the first code that is run when your mod is loaded.
|
// The constructor for the mod class is the first code that is run when your mod is loaded.
|
||||||
|
|||||||
+145
@@ -0,0 +1,145 @@
|
|||||||
|
package net.halbear.aotg.custom.WorldGen.GenerationFeatures;
|
||||||
|
|
||||||
|
import com.mojang.serialization.MapCodec;
|
||||||
|
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
||||||
|
import net.halbear.aotg.registries.ModTreeGen;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.util.RandomSource;
|
||||||
|
import net.minecraft.world.level.WorldGenLevel;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
import net.minecraft.world.level.levelgen.feature.configurations.TreeConfiguration;
|
||||||
|
import net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacer;
|
||||||
|
import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacer;
|
||||||
|
import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
|
||||||
|
public class BushTwistyBranchingTrunkPlacer extends TrunkPlacer {
|
||||||
|
private int BEGINNING_TRUNK_WIDTH = 2;
|
||||||
|
private float BranchPossibility = 0.40f;
|
||||||
|
public BushTwistyBranchingTrunkPlacer(int baseHeight, int heightRandA, int heightRandB) {
|
||||||
|
super(baseHeight, heightRandA, heightRandB);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BushTwistyBranchingTrunkPlacer SetTrunkWidth(int BEGINNING_TRUNK_WIDTH){
|
||||||
|
this.BEGINNING_TRUNK_WIDTH = BEGINNING_TRUNK_WIDTH;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BushTwistyBranchingTrunkPlacer SetBranchPossibility(float BranchPossibility){
|
||||||
|
this.BranchPossibility = BranchPossibility;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final MapCodec<BushTwistyBranchingTrunkPlacer> CODEC = RecordCodecBuilder.mapCodec(instance ->
|
||||||
|
trunkPlacerParts(instance).apply(instance, BushTwistyBranchingTrunkPlacer::new)
|
||||||
|
);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected TrunkPlacerType<?> type() {
|
||||||
|
return ModTreeGen.BUSH_TWISTY_TRUNK_PLACER.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<FoliagePlacer.FoliageAttachment> placeTrunk(WorldGenLevel worldGenLevel, BiConsumer<BlockPos, BlockState> biConsumer, RandomSource randomSource, int freeSpace, BlockPos blockPos, TreeConfiguration treeConfiguration) {
|
||||||
|
int TRUNK_WIDTH = 2;
|
||||||
|
List<FoliagePlacer.FoliageAttachment> leafNodes = new ArrayList<>();
|
||||||
|
int mainHeight = this.getTreeHeight(randomSource);
|
||||||
|
BlockPos currentPos = blockPos;
|
||||||
|
|
||||||
|
for (int i = 0; i < mainHeight; i++) {
|
||||||
|
TRUNK_WIDTH = (int)Math.max(2 * (1.0-((i*0.75)/(double)mainHeight)),1);
|
||||||
|
for (int xOffset = 0; xOffset < TRUNK_WIDTH; xOffset++) {
|
||||||
|
for (int zOffset = 0; zOffset < TRUNK_WIDTH; zOffset++) {
|
||||||
|
BlockPos thickLogPos = currentPos.offset(xOffset, 0, zOffset);
|
||||||
|
if(i < 2 && randomSource.nextFloat() < 0.40f){
|
||||||
|
generateRoots(worldGenLevel, biConsumer, randomSource, thickLogPos, treeConfiguration);
|
||||||
|
}
|
||||||
|
if ((randomSource.nextInt(10) < 9) || TRUNK_WIDTH < 3)
|
||||||
|
this.placeLog(worldGenLevel, biConsumer, randomSource, thickLogPos, treeConfiguration);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (randomSource.nextFloat() < 0.6f && i > 1) {
|
||||||
|
currentPos = currentPos.offset(randomSource.nextInt(3) - 1, 0, randomSource.nextInt(3) - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i > 2 && randomSource.nextFloat() < BranchPossibility) {
|
||||||
|
BlockPos branchStart = currentPos.offset(randomSource.nextInt(TRUNK_WIDTH), 0, randomSource.nextInt(TRUNK_WIDTH));
|
||||||
|
BlockPos branchEnd = generateBranch(worldGenLevel, biConsumer, randomSource, branchStart, treeConfiguration,i, leafNodes);
|
||||||
|
|
||||||
|
leafNodes.add(new FoliagePlacer.FoliageAttachment(branchEnd, randomSource.nextInt(2) + (Math.max((int)(i/(double)(mainHeight/1.25))*3,1)), false));
|
||||||
|
} else if(i > 2 && i == mainHeight - 1){
|
||||||
|
for(int l = 0; l < 2 + randomSource.nextInt(3); l++){
|
||||||
|
BlockPos branchStart = currentPos.offset(randomSource.nextInt(TRUNK_WIDTH), 0, randomSource.nextInt(TRUNK_WIDTH));
|
||||||
|
BlockPos branchEnd = generateBranch(worldGenLevel, biConsumer, randomSource, branchStart, treeConfiguration,i, leafNodes);
|
||||||
|
|
||||||
|
leafNodes.add(new FoliagePlacer.FoliageAttachment(branchEnd, randomSource.nextInt(2) + (Math.max((int)(i/(double)(mainHeight/1.25))*3,1)), false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
currentPos = currentPos.above();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int xOffset = 0; xOffset < TRUNK_WIDTH; xOffset++) {
|
||||||
|
for (int zOffset = 0; zOffset < TRUNK_WIDTH; zOffset++) {
|
||||||
|
leafNodes.add(new FoliagePlacer.FoliageAttachment(currentPos.offset(xOffset, 0, zOffset), 0, false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return leafNodes;
|
||||||
|
}
|
||||||
|
|
||||||
|
private BlockPos generateRoots(WorldGenLevel level, BiConsumer<BlockPos, BlockState> blockSetter,
|
||||||
|
RandomSource random, BlockPos branchStart, TreeConfiguration config) {
|
||||||
|
int dirX = random.nextBoolean() ? 1 : -1;
|
||||||
|
int dirZ = random.nextBoolean() ? 1 : -1;
|
||||||
|
int branchLength = 2 + random.nextInt(6);
|
||||||
|
|
||||||
|
BlockPos bPos = branchStart;
|
||||||
|
for (int b = 0; b < branchLength; b++) {
|
||||||
|
int stepX = random.nextFloat() < 0.7f ? dirX : 0;
|
||||||
|
int stepZ = random.nextFloat() < 0.7f ? dirZ : 0;
|
||||||
|
int stepY = random.nextFloat() < 0.4f ? -1 : 0;
|
||||||
|
bPos = bPos.offset(stepX, stepY, stepZ);
|
||||||
|
this.placeLog(level, blockSetter, random, bPos, config);
|
||||||
|
}
|
||||||
|
return bPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
private BlockPos generateBranch(WorldGenLevel level, BiConsumer<BlockPos, BlockState> blockSetter,
|
||||||
|
RandomSource random, BlockPos branchStart, TreeConfiguration config, int CurrentTreeHeight,List<FoliagePlacer.FoliageAttachment> leafNodes) {
|
||||||
|
int dirX = random.nextBoolean() ? 1 : -1;
|
||||||
|
int dirZ = random.nextBoolean() ? 1 : -1;
|
||||||
|
int branchLength = 3 + random.nextInt(Math.min(CurrentTreeHeight,12));
|
||||||
|
|
||||||
|
BlockPos bPos = branchStart;
|
||||||
|
for (int b = 0; b < branchLength; b++) {
|
||||||
|
int stepX = random.nextFloat() < 0.7f ? dirX : 0;
|
||||||
|
int stepZ = random.nextFloat() < 0.7f ? dirZ : 0;
|
||||||
|
int stepY = random.nextFloat() < 0.4f ? 1 : 0;
|
||||||
|
bPos = bPos.offset(stepX, stepY, stepZ);
|
||||||
|
this.placeLog(level, blockSetter, random, bPos, config);
|
||||||
|
if (random.nextDouble() < 0.25) {
|
||||||
|
leafNodes.add(new FoliagePlacer.FoliageAttachment(bPos, random.nextInt(2), false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int checkPointPosition(double xp, double yp, double xc, double yc, double r) {
|
||||||
|
double dx = xp - xc;
|
||||||
|
double dy = yp - yc;
|
||||||
|
double squaredDistance = (dx * dx) + (dy * dy);
|
||||||
|
|
||||||
|
double squaredRadius = r * r * 1.25;
|
||||||
|
|
||||||
|
if (squaredDistance < squaredRadius) {
|
||||||
|
return -1;
|
||||||
|
} else if (squaredDistance == squaredRadius) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+138
@@ -0,0 +1,138 @@
|
|||||||
|
package net.halbear.aotg.custom.WorldGen.GenerationFeatures;
|
||||||
|
|
||||||
|
import com.mojang.serialization.MapCodec;
|
||||||
|
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
||||||
|
import net.halbear.aotg.registries.ModTreeGen;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.util.RandomSource;
|
||||||
|
import net.minecraft.world.level.WorldGenLevel;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
import net.minecraft.world.level.levelgen.feature.configurations.TreeConfiguration;
|
||||||
|
import net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacer;
|
||||||
|
import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacer;
|
||||||
|
import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
|
||||||
|
public class ThinTwistyBranchingTrunkPlacer extends TrunkPlacer {
|
||||||
|
|
||||||
|
public ThinTwistyBranchingTrunkPlacer(int baseHeight, int heightRandA, int heightRandB) {
|
||||||
|
super(baseHeight, heightRandA, heightRandB);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static final MapCodec<ThinTwistyBranchingTrunkPlacer> CODEC = RecordCodecBuilder.mapCodec(instance ->
|
||||||
|
trunkPlacerParts(instance).apply(instance, ThinTwistyBranchingTrunkPlacer::new)
|
||||||
|
);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected TrunkPlacerType<?> type() {
|
||||||
|
return ModTreeGen.TALL_TWISTY_TRUNK_PLACER.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<FoliagePlacer.FoliageAttachment> placeTrunk(WorldGenLevel worldGenLevel, BiConsumer<BlockPos, BlockState> biConsumer, RandomSource randomSource, int freeSpace, BlockPos blockPos, TreeConfiguration treeConfiguration) {
|
||||||
|
int TRUNK_WIDTH = 3;
|
||||||
|
List<FoliagePlacer.FoliageAttachment> leafNodes = new ArrayList<>();
|
||||||
|
int mainHeight = this.getTreeHeight(randomSource);
|
||||||
|
BlockPos currentPos = blockPos;
|
||||||
|
|
||||||
|
for (int i = 0; i < mainHeight; i++) {
|
||||||
|
TRUNK_WIDTH = (int)Math.max(3 * (1.0-((i*0.75)/(double)mainHeight)),1);
|
||||||
|
for (int xOffset = 0; xOffset < TRUNK_WIDTH; xOffset++) {
|
||||||
|
for (int zOffset = 0; zOffset < TRUNK_WIDTH; zOffset++) {
|
||||||
|
BlockPos thickLogPos = currentPos.offset(xOffset, 0, zOffset);
|
||||||
|
if(i < 2 && randomSource.nextFloat() < 0.40f){
|
||||||
|
generateRoots(worldGenLevel, biConsumer, randomSource, thickLogPos, treeConfiguration);
|
||||||
|
}
|
||||||
|
if ((randomSource.nextInt(10) < 9) || TRUNK_WIDTH < 3)
|
||||||
|
this.placeLog(worldGenLevel, biConsumer, randomSource, thickLogPos, treeConfiguration);
|
||||||
|
else if (randomSource.nextDouble() < 0.1)
|
||||||
|
leafNodes.add(new FoliagePlacer.FoliageAttachment(thickLogPos, randomSource.nextInt(2), false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (randomSource.nextFloat() < 0.6f && i > 1) {
|
||||||
|
currentPos = currentPos.offset(randomSource.nextInt(3) - 1, 0, randomSource.nextInt(3) - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i > 2 && randomSource.nextFloat() < 0.65) {
|
||||||
|
BlockPos branchStart = currentPos.offset(randomSource.nextInt(TRUNK_WIDTH), 0, randomSource.nextInt(TRUNK_WIDTH));
|
||||||
|
BlockPos branchEnd = generateBranch(worldGenLevel, biConsumer, randomSource, branchStart, treeConfiguration,i, leafNodes);
|
||||||
|
|
||||||
|
leafNodes.add(new FoliagePlacer.FoliageAttachment(branchEnd, randomSource.nextInt(2) + (Math.max((int)(i/(double)(mainHeight/1.25))*3,1)), false));
|
||||||
|
} else if(i > 2 && i == mainHeight - 1){
|
||||||
|
for(int l = 0; l < 2 + randomSource.nextInt(3); l++){
|
||||||
|
BlockPos branchStart = currentPos.offset(randomSource.nextInt(TRUNK_WIDTH), 0, randomSource.nextInt(TRUNK_WIDTH));
|
||||||
|
BlockPos branchEnd = generateBranch(worldGenLevel, biConsumer, randomSource, branchStart, treeConfiguration,i, leafNodes);
|
||||||
|
this.placeLog(worldGenLevel, biConsumer, randomSource, branchStart, treeConfiguration);
|
||||||
|
|
||||||
|
leafNodes.add(new FoliagePlacer.FoliageAttachment(branchEnd, randomSource.nextInt(2) + (Math.max((int)(i/(double)(mainHeight/1.25))*3,1)), false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
currentPos = currentPos.above();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int xOffset = 0; xOffset < TRUNK_WIDTH; xOffset++) {
|
||||||
|
for (int zOffset = 0; zOffset < TRUNK_WIDTH; zOffset++) {
|
||||||
|
leafNodes.add(new FoliagePlacer.FoliageAttachment(currentPos.offset(xOffset, 0, zOffset), 0, false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return leafNodes;
|
||||||
|
}
|
||||||
|
|
||||||
|
private BlockPos generateRoots(WorldGenLevel level, BiConsumer<BlockPos, BlockState> blockSetter,
|
||||||
|
RandomSource random, BlockPos branchStart, TreeConfiguration config) {
|
||||||
|
int dirX = random.nextBoolean() ? 1 : -1;
|
||||||
|
int dirZ = random.nextBoolean() ? 1 : -1;
|
||||||
|
int branchLength = 2 + random.nextInt(6);
|
||||||
|
|
||||||
|
BlockPos bPos = branchStart;
|
||||||
|
for (int b = 0; b < branchLength; b++) {
|
||||||
|
int stepX = random.nextFloat() < 0.7f ? dirX : 0;
|
||||||
|
int stepZ = random.nextFloat() < 0.7f ? dirZ : 0;
|
||||||
|
int stepY = random.nextFloat() < 0.4f ? -1 : 0;
|
||||||
|
bPos = bPos.offset(stepX, stepY, stepZ);
|
||||||
|
this.placeLog(level, blockSetter, random, bPos, config);
|
||||||
|
}
|
||||||
|
return bPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
private BlockPos generateBranch(WorldGenLevel level, BiConsumer<BlockPos, BlockState> blockSetter,
|
||||||
|
RandomSource random, BlockPos branchStart, TreeConfiguration config, int CurrentTreeHeight,List<FoliagePlacer.FoliageAttachment> leafNodes) {
|
||||||
|
int dirX = random.nextBoolean() ? 1 : -1;
|
||||||
|
int dirZ = random.nextBoolean() ? 1 : -1;
|
||||||
|
int branchLength = 3 + random.nextInt(Math.min(CurrentTreeHeight,12));
|
||||||
|
|
||||||
|
BlockPos bPos = branchStart;
|
||||||
|
for (int b = 0; b < branchLength; b++) {
|
||||||
|
int stepX = random.nextFloat() < 0.7f ? dirX : 0;
|
||||||
|
int stepZ = random.nextFloat() < 0.7f ? dirZ : 0;
|
||||||
|
int stepY = random.nextFloat() < 0.4f ? 1 : 0;
|
||||||
|
bPos = bPos.offset(stepX, stepY, stepZ);
|
||||||
|
this.placeLog(level, blockSetter, random, bPos, config);
|
||||||
|
if (random.nextDouble() < 0.25) {
|
||||||
|
leafNodes.add(new FoliagePlacer.FoliageAttachment(bPos, random.nextInt(2), false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int checkPointPosition(double xp, double yp, double xc, double yc, double r) {
|
||||||
|
double dx = xp - xc;
|
||||||
|
double dy = yp - yc;
|
||||||
|
double squaredDistance = (dx * dx) + (dy * dy);
|
||||||
|
|
||||||
|
double squaredRadius = r * r * 1.25;
|
||||||
|
|
||||||
|
if (squaredDistance < squaredRadius) {
|
||||||
|
return -1;
|
||||||
|
} else if (squaredDistance == squaredRadius) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
-3
@@ -5,15 +5,12 @@ import com.mojang.serialization.codecs.RecordCodecBuilder;
|
|||||||
import net.halbear.aotg.registries.ModTreeGen;
|
import net.halbear.aotg.registries.ModTreeGen;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.util.RandomSource;
|
import net.minecraft.util.RandomSource;
|
||||||
import net.minecraft.world.level.LevelSimulatedReader;
|
|
||||||
import net.minecraft.world.level.WorldGenLevel;
|
import net.minecraft.world.level.WorldGenLevel;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.level.levelgen.Heightmap;
|
|
||||||
import net.minecraft.world.level.levelgen.feature.configurations.TreeConfiguration;
|
import net.minecraft.world.level.levelgen.feature.configurations.TreeConfiguration;
|
||||||
import net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacer;
|
import net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacer;
|
||||||
import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacer;
|
import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacer;
|
||||||
import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType;
|
import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType;
|
||||||
import org.joml.Vector3f;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import net.minecraft.world.level.block.Blocks;
|
|||||||
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
|
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
|
||||||
import net.minecraft.world.level.levelgen.Noises;
|
import net.minecraft.world.level.levelgen.Noises;
|
||||||
import net.minecraft.world.level.levelgen.SurfaceRules;
|
import net.minecraft.world.level.levelgen.SurfaceRules;
|
||||||
|
import net.minecraft.world.level.levelgen.VerticalAnchor;
|
||||||
import net.minecraft.world.level.levelgen.placement.CaveSurface;
|
import net.minecraft.world.level.levelgen.placement.CaveSurface;
|
||||||
|
|
||||||
public class ModNoiseSettings {
|
public class ModNoiseSettings {
|
||||||
@@ -32,33 +33,63 @@ public class ModNoiseSettings {
|
|||||||
SurfaceRules.ConditionSource isMaquisGrassPatch = SurfaceRules.noiseCondition(AgeOfTheGodsDataGeneration.TINY_PATCHY_NOISE, 0.0);
|
SurfaceRules.ConditionSource isMaquisGrassPatch = SurfaceRules.noiseCondition(AgeOfTheGodsDataGeneration.TINY_PATCHY_NOISE, 0.0);
|
||||||
SurfaceRules.ConditionSource isGranite = SurfaceRules.noiseCondition(AgeOfTheGodsDataGeneration.TINY_PATCHY_NOISE, 0.1);
|
SurfaceRules.ConditionSource isGranite = SurfaceRules.noiseCondition(AgeOfTheGodsDataGeneration.TINY_PATCHY_NOISE, 0.1);
|
||||||
SurfaceRules.ConditionSource isGraniteSurfacePatch = SurfaceRules.noiseCondition(Noises.PATCH, 0.0,0.15);
|
SurfaceRules.ConditionSource isGraniteSurfacePatch = SurfaceRules.noiseCondition(Noises.PATCH, 0.0,0.15);
|
||||||
|
SurfaceRules.ConditionSource isDeepRiver = SurfaceRules.noiseCondition(Noises.PATCH, 0.05,0.1);
|
||||||
SurfaceRules.ConditionSource isRiverBed = SurfaceRules.noiseCondition(Noises.PATCH, -0.05,0.2);
|
SurfaceRules.ConditionSource isRiverBed = SurfaceRules.noiseCondition(Noises.PATCH, -0.05,0.2);
|
||||||
SurfaceRules.ConditionSource isPath = SurfaceRules.noiseCondition(Noises.EROSION_LARGE, -1.0,-0.5);
|
SurfaceRules.ConditionSource isPath = SurfaceRules.noiseCondition(Noises.EROSION_LARGE, -1.0,-0.5);
|
||||||
|
SurfaceRules.ConditionSource atOrAboveSeaLevel = SurfaceRules.yBlockCheck(VerticalAnchor.absolute(63), 0);
|
||||||
|
SurfaceRules.ConditionSource AboveSeaLevel = SurfaceRules.yBlockCheck(VerticalAnchor.absolute(64), 0);
|
||||||
|
SurfaceRules.ConditionSource RiverCap = SurfaceRules.not(SurfaceRules.yBlockCheck(VerticalAnchor.absolute(72), 0));
|
||||||
|
|
||||||
SurfaceRules.RuleSource MediterraneanSurface = SurfaceRules.sequence(
|
SurfaceRules.RuleSource MediterraneanSurface = SurfaceRules.sequence(
|
||||||
|
SurfaceRules.ifTrue(
|
||||||
|
SurfaceRules.not(SurfaceRules.waterBlockCheck(-1,0)),
|
||||||
|
SurfaceRules.state(ModBlocks.SHALE_BLOCK.get().defaultBlockState())
|
||||||
|
),
|
||||||
SurfaceRules.ifTrue(
|
SurfaceRules.ifTrue(
|
||||||
SurfaceRules.stoneDepthCheck(0, false, 0, CaveSurface.FLOOR),
|
SurfaceRules.stoneDepthCheck(0, false, 0, CaveSurface.FLOOR),
|
||||||
SurfaceRules.ifTrue(
|
SurfaceRules.ifTrue(
|
||||||
isGraniteSurfacePatch,
|
isGraniteSurfacePatch,
|
||||||
|
SurfaceRules.ifTrue(
|
||||||
|
AboveSeaLevel,
|
||||||
|
SurfaceRules.ifTrue(
|
||||||
|
RiverCap,
|
||||||
SurfaceRules.state(Blocks.AIR.defaultBlockState())
|
SurfaceRules.state(Blocks.AIR.defaultBlockState())
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
),
|
),
|
||||||
SurfaceRules.ifTrue(
|
SurfaceRules.ifTrue(
|
||||||
SurfaceRules.stoneDepthCheck(4, false, 0, CaveSurface.FLOOR),
|
SurfaceRules.stoneDepthCheck(0, true, 2, CaveSurface.FLOOR),
|
||||||
SurfaceRules.ifTrue(
|
SurfaceRules.ifTrue(
|
||||||
isGraniteSurfacePatch,
|
isGraniteSurfacePatch,
|
||||||
|
SurfaceRules.ifTrue(
|
||||||
|
RiverCap,
|
||||||
SurfaceRules.state(Blocks.WATER.defaultBlockState())
|
SurfaceRules.state(Blocks.WATER.defaultBlockState())
|
||||||
)
|
)
|
||||||
),
|
|
||||||
SurfaceRules.ifTrue(
|
|
||||||
SurfaceRules.stoneDepthCheck(6, false, 0, CaveSurface.FLOOR),
|
|
||||||
SurfaceRules.ifTrue(
|
|
||||||
isGraniteSurfacePatch,
|
|
||||||
SurfaceRules.state(ModBlocks.SHALE_BLOCK.get().defaultBlockState())
|
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
SurfaceRules.ifTrue(
|
SurfaceRules.ifTrue(
|
||||||
SurfaceRules.stoneDepthCheck(1, false, 0, CaveSurface.FLOOR),
|
SurfaceRules.stoneDepthCheck(1, true, 2, CaveSurface.FLOOR),
|
||||||
|
SurfaceRules.ifTrue(
|
||||||
|
isDeepRiver,
|
||||||
|
SurfaceRules.ifTrue(
|
||||||
|
RiverCap,
|
||||||
|
SurfaceRules.state(Blocks.WATER.defaultBlockState())
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
SurfaceRules.ifTrue(
|
||||||
|
SurfaceRules.stoneDepthCheck(6, true, 3, CaveSurface.FLOOR),
|
||||||
|
SurfaceRules.ifTrue(
|
||||||
|
isGraniteSurfacePatch,
|
||||||
|
SurfaceRules.ifTrue(
|
||||||
|
RiverCap,
|
||||||
|
SurfaceRules.state(ModBlocks.SHALE_BLOCK.get().defaultBlockState())
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
SurfaceRules.ifTrue(
|
||||||
|
SurfaceRules.stoneDepthCheck(1, true, 2, CaveSurface.FLOOR),
|
||||||
SurfaceRules.ifTrue(
|
SurfaceRules.ifTrue(
|
||||||
isRiverBed,
|
isRiverBed,
|
||||||
SurfaceRules.state(Blocks.SAND.defaultBlockState())
|
SurfaceRules.state(Blocks.SAND.defaultBlockState())
|
||||||
@@ -103,6 +134,10 @@ public class ModNoiseSettings {
|
|||||||
);
|
);
|
||||||
|
|
||||||
SurfaceRules.RuleSource garrigueSurface = SurfaceRules.sequence(
|
SurfaceRules.RuleSource garrigueSurface = SurfaceRules.sequence(
|
||||||
|
SurfaceRules.ifTrue(
|
||||||
|
SurfaceRules.not(SurfaceRules.waterBlockCheck(-1,0)),
|
||||||
|
SurfaceRules.state(Blocks.SANDSTONE.defaultBlockState())
|
||||||
|
),
|
||||||
SurfaceRules.ifTrue(
|
SurfaceRules.ifTrue(
|
||||||
SurfaceRules.stoneDepthCheck(0, false, 0, CaveSurface.FLOOR),
|
SurfaceRules.stoneDepthCheck(0, false, 0, CaveSurface.FLOOR),
|
||||||
SurfaceRules.ifTrue(
|
SurfaceRules.ifTrue(
|
||||||
@@ -149,6 +184,10 @@ public class ModNoiseSettings {
|
|||||||
);
|
);
|
||||||
|
|
||||||
SurfaceRules.RuleSource maquisSurface = SurfaceRules.sequence(
|
SurfaceRules.RuleSource maquisSurface = SurfaceRules.sequence(
|
||||||
|
SurfaceRules.ifTrue(
|
||||||
|
SurfaceRules.not(SurfaceRules.waterBlockCheck(-1,0)),
|
||||||
|
SurfaceRules.state(ModBlocks.SHALE_BLOCK.get().defaultBlockState())
|
||||||
|
),
|
||||||
SurfaceRules.ifTrue(
|
SurfaceRules.ifTrue(
|
||||||
SurfaceRules.stoneDepthCheck(6, false, 0, CaveSurface.FLOOR),
|
SurfaceRules.stoneDepthCheck(6, false, 0, CaveSurface.FLOOR),
|
||||||
SurfaceRules.ifTrue(
|
SurfaceRules.ifTrue(
|
||||||
|
|||||||
@@ -30,6 +30,16 @@ public class ModBlocks {
|
|||||||
.explosionResistance(6.0f)
|
.explosionResistance(6.0f)
|
||||||
.sound(SoundType.GRASS)
|
.sound(SoundType.GRASS)
|
||||||
.lightLevel(state -> 0)
|
.lightLevel(state -> 0)
|
||||||
|
|
||||||
|
));
|
||||||
|
|
||||||
|
public static final DeferredBlock<Block> OLIVE_LEAVES = RegisterBlock("olive_leaves",
|
||||||
|
properties -> new RockCoveredGrassBlock(properties.strength(1.5f)
|
||||||
|
.requiresCorrectToolForDrops()
|
||||||
|
.explosionResistance(6.0f)
|
||||||
|
.sound(SoundType.GRASS)
|
||||||
|
.lightLevel(state -> 0)
|
||||||
|
.noOcclusion()
|
||||||
));
|
));
|
||||||
|
|
||||||
public static final DeferredBlock<Block> SHALE_BLOCK = RegisterBlock("shale_block",
|
public static final DeferredBlock<Block> SHALE_BLOCK = RegisterBlock("shale_block",
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
package net.halbear.aotg.registries;
|
package net.halbear.aotg.registries;
|
||||||
|
|
||||||
import net.halbear.aotg.AgeoftheGods;
|
import net.halbear.aotg.AgeoftheGods;
|
||||||
import net.halbear.aotg.custom.WorldGen.GenerationFeatures.LeafBunchFoliagePlacer;
|
import net.halbear.aotg.custom.WorldGen.GenerationFeatures.*;
|
||||||
import net.halbear.aotg.custom.WorldGen.GenerationFeatures.TwistyBranchingTrunkPlacer;
|
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.core.registries.Registries;
|
import net.minecraft.core.registries.Registries;
|
||||||
import net.minecraft.data.worldgen.BootstrapContext;
|
import net.minecraft.data.worldgen.BootstrapContext;
|
||||||
@@ -16,10 +15,7 @@ import net.minecraft.world.level.levelgen.feature.Feature;
|
|||||||
import net.minecraft.world.level.levelgen.feature.configurations.BlockBlobConfiguration;
|
import net.minecraft.world.level.levelgen.feature.configurations.BlockBlobConfiguration;
|
||||||
import net.minecraft.world.level.levelgen.feature.configurations.TreeConfiguration;
|
import net.minecraft.world.level.levelgen.feature.configurations.TreeConfiguration;
|
||||||
import net.minecraft.world.level.levelgen.feature.featuresize.TwoLayersFeatureSize;
|
import net.minecraft.world.level.levelgen.feature.featuresize.TwoLayersFeatureSize;
|
||||||
import net.minecraft.world.level.levelgen.feature.foliageplacers.BlobFoliagePlacer;
|
|
||||||
import net.minecraft.world.level.levelgen.feature.foliageplacers.CherryFoliagePlacer;
|
|
||||||
import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider;
|
import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider;
|
||||||
import net.minecraft.world.level.levelgen.placement.BlockPredicateFilter;
|
|
||||||
|
|
||||||
public class ModConfiguredFeatures {
|
public class ModConfiguredFeatures {
|
||||||
public static final ResourceKey<ConfiguredFeature<?, ?>> TWISTY_TREE_KEY =
|
public static final ResourceKey<ConfiguredFeature<?, ?>> TWISTY_TREE_KEY =
|
||||||
@@ -44,17 +40,17 @@ public class ModConfiguredFeatures {
|
|||||||
Feature.TREE,
|
Feature.TREE,
|
||||||
new TreeConfiguration.TreeConfigurationBuilder(
|
new TreeConfiguration.TreeConfigurationBuilder(
|
||||||
BlockStateProvider.simple(Blocks.OAK_LOG.defaultBlockState()),
|
BlockStateProvider.simple(Blocks.OAK_LOG.defaultBlockState()),
|
||||||
new TwistyBranchingTrunkPlacer(12, 10, 10).SetTrunkWidth(3).SetBranchPossibility(0.65f),
|
new ThinTwistyBranchingTrunkPlacer(12, 10, 10),
|
||||||
BlockStateProvider.simple(Blocks.OAK_LEAVES.defaultBlockState()),
|
BlockStateProvider.simple(Blocks.OAK_LEAVES.defaultBlockState()),
|
||||||
new LeafBunchFoliagePlacer(ConstantInt.of(1),ConstantInt.of(0)),
|
new LeafBunchFoliagePlacer(ConstantInt.of(1),ConstantInt.of(0)),
|
||||||
new TwoLayersFeatureSize(4, 3, 4)
|
new TwoLayersFeatureSize(3, 1, 3)
|
||||||
).build()
|
).build()
|
||||||
));
|
));
|
||||||
context.register(TWISTY_TREE_KEY, new ConfiguredFeature<>(
|
context.register(TWISTY_TREE_KEY, new ConfiguredFeature<>(
|
||||||
Feature.TREE,
|
Feature.TREE,
|
||||||
new TreeConfiguration.TreeConfigurationBuilder(
|
new TreeConfiguration.TreeConfigurationBuilder(
|
||||||
BlockStateProvider.simple(Blocks.OAK_LOG.defaultBlockState()),
|
BlockStateProvider.simple(Blocks.OAK_LOG.defaultBlockState()),
|
||||||
new TwistyBranchingTrunkPlacer(10, 10, 10),
|
new ThinTwistyBranchingTrunkPlacer(10, 10, 10),
|
||||||
BlockStateProvider.simple(Blocks.OAK_LEAVES.defaultBlockState()),
|
BlockStateProvider.simple(Blocks.OAK_LEAVES.defaultBlockState()),
|
||||||
new LeafBunchFoliagePlacer(ConstantInt.of(1),ConstantInt.of(0)),
|
new LeafBunchFoliagePlacer(ConstantInt.of(1),ConstantInt.of(0)),
|
||||||
new TwoLayersFeatureSize(5, 3, 5)
|
new TwoLayersFeatureSize(5, 3, 5)
|
||||||
@@ -64,17 +60,17 @@ public class ModConfiguredFeatures {
|
|||||||
Feature.TREE,
|
Feature.TREE,
|
||||||
new TreeConfiguration.TreeConfigurationBuilder(
|
new TreeConfiguration.TreeConfigurationBuilder(
|
||||||
BlockStateProvider.simple(Blocks.OAK_LOG.defaultBlockState()),
|
BlockStateProvider.simple(Blocks.OAK_LOG.defaultBlockState()),
|
||||||
new TwistyBranchingTrunkPlacer(2, 3, 3).SetTrunkWidth(2),
|
new BushTwistyBranchingTrunkPlacer(2, 3, 3),
|
||||||
BlockStateProvider.simple(Blocks.OAK_LEAVES.defaultBlockState()),
|
BlockStateProvider.simple(ModBlocks.OLIVE_LEAVES.get().defaultBlockState()),
|
||||||
new LeafBunchFoliagePlacer(ConstantInt.of(1),ConstantInt.of(0)),
|
new LeafBunchFoliagePlacer(ConstantInt.of(1),ConstantInt.of(0)),
|
||||||
new TwoLayersFeatureSize(5, 3, 5)
|
new TwoLayersFeatureSize(3, 1, 3)
|
||||||
).build()
|
).build()
|
||||||
));
|
));
|
||||||
context.register(MAQUIS_SHORT_TWISTY_TREE_KEY, new ConfiguredFeature<>(
|
context.register(MAQUIS_SHORT_TWISTY_TREE_KEY, new ConfiguredFeature<>(
|
||||||
Feature.TREE,
|
Feature.TREE,
|
||||||
new TreeConfiguration.TreeConfigurationBuilder(
|
new TreeConfiguration.TreeConfigurationBuilder(
|
||||||
BlockStateProvider.simple(Blocks.OAK_LOG.defaultBlockState()),
|
BlockStateProvider.simple(Blocks.OAK_LOG.defaultBlockState()),
|
||||||
new TwistyBranchingTrunkPlacer(3, 3, 3),
|
new ThinTwistyBranchingTrunkPlacer(3, 3, 3),
|
||||||
BlockStateProvider.simple(Blocks.OAK_LEAVES.defaultBlockState()),
|
BlockStateProvider.simple(Blocks.OAK_LEAVES.defaultBlockState()),
|
||||||
new LeafBunchFoliagePlacer(ConstantInt.of(1),ConstantInt.of(0)),
|
new LeafBunchFoliagePlacer(ConstantInt.of(1),ConstantInt.of(0)),
|
||||||
new TwoLayersFeatureSize(5, 3, 5)
|
new TwoLayersFeatureSize(5, 3, 5)
|
||||||
|
|||||||
@@ -13,5 +13,6 @@ public class ModItems {
|
|||||||
public static final DeferredItem<BlockItem> SHALE_ITEM = ITEMS.registerSimpleBlockItem("shale_block", SHALE_BLOCK);
|
public static final DeferredItem<BlockItem> SHALE_ITEM = ITEMS.registerSimpleBlockItem("shale_block", SHALE_BLOCK);
|
||||||
public static final DeferredItem<BlockItem> SHALE_GRASS_ITEM = ITEMS.registerSimpleBlockItem("shale_grass_block", SHALE_GRASS_BLOCK);
|
public static final DeferredItem<BlockItem> SHALE_GRASS_ITEM = ITEMS.registerSimpleBlockItem("shale_grass_block", SHALE_GRASS_BLOCK);
|
||||||
public static final DeferredItem<BlockItem> LIMESTONE_GRASS_ITEM = ITEMS.registerSimpleBlockItem("limestone_grass_block", LIMESTONE_GRASS_BLOCK);
|
public static final DeferredItem<BlockItem> LIMESTONE_GRASS_ITEM = ITEMS.registerSimpleBlockItem("limestone_grass_block", LIMESTONE_GRASS_BLOCK);
|
||||||
|
public static final DeferredItem<BlockItem> OLIVE_LEAVES_ITEM = ITEMS.registerSimpleBlockItem("olive_leaves", OLIVE_LEAVES);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ public class ModPlacedFeatures {
|
|||||||
context.register(TALL_THIN_TWISTY_TREE_PLACED_KEY, new PlacedFeature(
|
context.register(TALL_THIN_TWISTY_TREE_PLACED_KEY, new PlacedFeature(
|
||||||
configuredTreeHolder,
|
configuredTreeHolder,
|
||||||
List.of(
|
List.of(
|
||||||
NoiseThresholdCountPlacement.of(-0.2D, 3, 10),
|
CountPlacement.of(15),
|
||||||
RarityFilter.onAverageOnceEvery(10),
|
RarityFilter.onAverageOnceEvery(10),
|
||||||
InSquarePlacement.spread(),
|
InSquarePlacement.spread(),
|
||||||
PlacementUtils.HEIGHTMAP_OCEAN_FLOOR,
|
PlacementUtils.HEIGHTMAP_OCEAN_FLOOR,
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package net.halbear.aotg.registries;
|
package net.halbear.aotg.registries;
|
||||||
|
|
||||||
import net.halbear.aotg.AgeoftheGods;
|
import net.halbear.aotg.AgeoftheGods;
|
||||||
|
import net.halbear.aotg.custom.WorldGen.GenerationFeatures.BushTwistyBranchingTrunkPlacer;
|
||||||
|
import net.halbear.aotg.custom.WorldGen.GenerationFeatures.ThinTwistyBranchingTrunkPlacer;
|
||||||
import net.halbear.aotg.custom.WorldGen.GenerationFeatures.TwistyBranchingTrunkPlacer;
|
import net.halbear.aotg.custom.WorldGen.GenerationFeatures.TwistyBranchingTrunkPlacer;
|
||||||
import net.minecraft.core.registries.Registries;
|
import net.minecraft.core.registries.Registries;
|
||||||
import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType;
|
import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType;
|
||||||
@@ -15,6 +17,12 @@ public class ModTreeGen {
|
|||||||
public static final DeferredHolder<TrunkPlacerType<?>, TrunkPlacerType<TwistyBranchingTrunkPlacer>> TWISTY_TRUNK_PLACER =
|
public static final DeferredHolder<TrunkPlacerType<?>, TrunkPlacerType<TwistyBranchingTrunkPlacer>> TWISTY_TRUNK_PLACER =
|
||||||
TRUNK_PLACERS.register("twisty_trunk_placer", () -> new TrunkPlacerType<>(TwistyBranchingTrunkPlacer.CODEC));
|
TRUNK_PLACERS.register("twisty_trunk_placer", () -> new TrunkPlacerType<>(TwistyBranchingTrunkPlacer.CODEC));
|
||||||
|
|
||||||
|
public static final DeferredHolder<TrunkPlacerType<?>, TrunkPlacerType<ThinTwistyBranchingTrunkPlacer>> TALL_TWISTY_TRUNK_PLACER =
|
||||||
|
TRUNK_PLACERS.register("tall_twisty_trunk_placer", () -> new TrunkPlacerType<>(ThinTwistyBranchingTrunkPlacer.CODEC));
|
||||||
|
|
||||||
|
public static final DeferredHolder<TrunkPlacerType<?>, TrunkPlacerType<BushTwistyBranchingTrunkPlacer>> BUSH_TWISTY_TRUNK_PLACER =
|
||||||
|
TRUNK_PLACERS.register("bush_twisty_trunk_placer", () -> new TrunkPlacerType<>(BushTwistyBranchingTrunkPlacer.CODEC));
|
||||||
|
|
||||||
public static void register(IEventBus eventBus) {
|
public static void register(IEventBus eventBus) {
|
||||||
TRUNK_PLACERS.register(eventBus);
|
TRUNK_PLACERS.register(eventBus);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,7 +53,6 @@ public class SkyBoxRendering {
|
|||||||
Identifier.parse("ageofthegods:textures/smallcloud3.png"),
|
Identifier.parse("ageofthegods:textures/smallcloud3.png"),
|
||||||
};
|
};
|
||||||
double[] aspectRatios = new double[]{1.5625,1,1,1,3.71875};
|
double[] aspectRatios = new double[]{1.5625,1,1,1,3.71875};
|
||||||
DistantSkyObject newObject;
|
|
||||||
|
|
||||||
for(int i = 0; i < 128; i++){
|
for(int i = 0; i < 128; i++){
|
||||||
|
|
||||||
@@ -74,7 +73,7 @@ public class SkyBoxRendering {
|
|||||||
|
|
||||||
float Scale = 2f + (float)Math.random() * 12;
|
float Scale = 2f + (float)Math.random() * 12;
|
||||||
|
|
||||||
newObject = new DistantSkyObject(name, clouds[Index], aspectRatios[Index], //Object ID, texture, mesh aspect ratio
|
new DistantSkyObject(name, clouds[Index], aspectRatios[Index], //Object ID, texture, mesh aspect ratio
|
||||||
(float)Math.toRadians(360*Math.random()),(float)Math.toRadians(-130F + (60 * Math.random())), // horizontal angle, vertical angle
|
(float)Math.toRadians(360*Math.random()),(float)Math.toRadians(-130F + (60 * Math.random())), // horizontal angle, vertical angle
|
||||||
new Vector3f(0,100,0),new Vector3f(Scale,-1,Scale),new Vector4f(1,1,1,1)) // translation, scale, colour modifiers
|
new Vector3f(0,100,0),new Vector3f(Scale,-1,Scale),new Vector4f(1,1,1,1)) // translation, scale, colour modifiers
|
||||||
.AddToDimension(OVERWORLD)
|
.AddToDimension(OVERWORLD)
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import net.minecraft.client.multiplayer.ClientLevel;
|
|||||||
import net.minecraft.client.renderer.BiomeColors;
|
import net.minecraft.client.renderer.BiomeColors;
|
||||||
import net.minecraft.client.renderer.RenderPipelines;
|
import net.minecraft.client.renderer.RenderPipelines;
|
||||||
import net.minecraft.client.renderer.block.BlockAndTintGetter;
|
import net.minecraft.client.renderer.block.BlockAndTintGetter;
|
||||||
|
import net.minecraft.client.renderer.rendertype.RenderType;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.resources.Identifier;
|
import net.minecraft.resources.Identifier;
|
||||||
import net.minecraft.world.entity.LivingEntity;
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
@@ -28,6 +29,7 @@ import net.neoforged.api.distmarker.Dist;
|
|||||||
import net.neoforged.bus.EventBus;
|
import net.neoforged.bus.EventBus;
|
||||||
import net.neoforged.bus.api.SubscribeEvent;
|
import net.neoforged.bus.api.SubscribeEvent;
|
||||||
import net.neoforged.fml.common.EventBusSubscriber;
|
import net.neoforged.fml.common.EventBusSubscriber;
|
||||||
|
import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;
|
||||||
import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent;
|
import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent;
|
||||||
import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent.BlockTintSources;
|
import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent.BlockTintSources;
|
||||||
import net.neoforged.neoforge.client.event.RegisterRenderPipelinesEvent;
|
import net.neoforged.neoforge.client.event.RegisterRenderPipelinesEvent;
|
||||||
@@ -76,6 +78,7 @@ public class ModEventHandler {
|
|||||||
public static void registerBlockTint(RegisterColorHandlersEvent.BlockTintSources event) {
|
public static void registerBlockTint(RegisterColorHandlersEvent.BlockTintSources event) {
|
||||||
BlockTint(event, ModBlocks.LIMESTONE_GRASS_BLOCK.get());
|
BlockTint(event, ModBlocks.LIMESTONE_GRASS_BLOCK.get());
|
||||||
BlockTint(event, ModBlocks.SHALE_GRASS_BLOCK.get());
|
BlockTint(event, ModBlocks.SHALE_GRASS_BLOCK.get());
|
||||||
|
BlockTint(event, ModBlocks.OLIVE_LEAVES.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
@@ -84,6 +87,8 @@ public class ModEventHandler {
|
|||||||
(new CustomItemGrassTint().type()) );
|
(new CustomItemGrassTint().type()) );
|
||||||
event.register( ModBlocks.SHALE_GRASS_BLOCK.getId(),
|
event.register( ModBlocks.SHALE_GRASS_BLOCK.getId(),
|
||||||
(new CustomItemGrassTint().type()) );
|
(new CustomItemGrassTint().type()) );
|
||||||
|
event.register( ModBlocks.OLIVE_LEAVES.getId(),
|
||||||
|
(new CustomItemGrassTint().type()) );
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class CustomItemGrassTint implements ItemTintSource {
|
private static class CustomItemGrassTint implements ItemTintSource {
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"variants": {
|
||||||
|
"": [
|
||||||
|
{
|
||||||
|
"model": "ageofthegods:block/olive/olive_leaves", "weight": 3
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"model": {
|
||||||
|
"type": "minecraft:model",
|
||||||
|
"model": "ageofthegods:block/limestone_block"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"model": {
|
||||||
|
"type": "minecraft:model",
|
||||||
|
"model": "ageofthegods:block/limestone_grass_block"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"model": {
|
||||||
|
"type": "minecraft:model",
|
||||||
|
"model": "ageofthegods:block/olive_leaves"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"model": {
|
||||||
|
"type": "minecraft:model",
|
||||||
|
"model": "ageofthegods:block/shale_block"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"model": {
|
||||||
|
"type": "minecraft:model",
|
||||||
|
"model": "ageofthegods:block/shale_grass_block"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"parent": "minecraft:block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "ageofthegods:block/olive/oliveleavesside",
|
||||||
|
"bottom": "ageofthegods:block/olive/oliveleavestopgreyscale",
|
||||||
|
"top": "ageofthegods:block/olive/oliveleavestopgreyscale",
|
||||||
|
"side": "ageofthegods:block/olive/oliveleavessideoverlay",
|
||||||
|
"overlay": "ageofthegods:block/olive/oliveleavessideoverlay"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [0, 0, 0],
|
||||||
|
"to": [16, 16, 16],
|
||||||
|
"faces": {
|
||||||
|
"down": { "texture": "#bottom", "cullface": "down", "tintindex": 0 },
|
||||||
|
"up": { "texture": "#top", "cullface": "up", "tintindex": 0 },
|
||||||
|
"north": { "texture": "#side", "cullface": "north" },
|
||||||
|
"south": { "texture": "#side", "cullface": "south" },
|
||||||
|
"west": { "texture": "#side", "cullface": "west" },
|
||||||
|
"east": { "texture": "#side", "cullface": "east" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": [0, 0, 0],
|
||||||
|
"to": [16, 16, 16],
|
||||||
|
"faces": {
|
||||||
|
"north": { "texture": "#overlay", "cullface": "north", "tintindex": 0 },
|
||||||
|
"south": { "texture": "#overlay", "cullface": "south", "tintindex": 0 },
|
||||||
|
"west": { "texture": "#overlay", "cullface": "west", "tintindex": 0 },
|
||||||
|
"east": { "texture": "#overlay", "cullface": "east", "tintindex": 0 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,6 +1,22 @@
|
|||||||
{
|
{
|
||||||
"model": {
|
"parent": "ageofthegods:block/limestone_block",
|
||||||
"type": "minecraft:model",
|
"display": {
|
||||||
"model": "ageofthegods:block/limestone_block"
|
"thirdperson": {
|
||||||
|
"rotation": [
|
||||||
|
10,
|
||||||
|
-45,
|
||||||
|
170
|
||||||
|
],
|
||||||
|
"translation": [
|
||||||
|
0,
|
||||||
|
1.5,
|
||||||
|
-2.75
|
||||||
|
],
|
||||||
|
"scale": [
|
||||||
|
0.375,
|
||||||
|
0.375,
|
||||||
|
0.375
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"parent": "ageofthegods:block/limestone_grass_block",
|
||||||
|
"display": {
|
||||||
|
"thirdperson": {
|
||||||
|
"rotation": [
|
||||||
|
10,
|
||||||
|
-45,
|
||||||
|
170
|
||||||
|
],
|
||||||
|
"translation": [
|
||||||
|
0,
|
||||||
|
1.5,
|
||||||
|
-2.75
|
||||||
|
],
|
||||||
|
"scale": [
|
||||||
|
0.375,
|
||||||
|
0.375,
|
||||||
|
0.375
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"parent": "ageofthegods:block/olive_leaves",
|
||||||
|
"display": {
|
||||||
|
"thirdperson": {
|
||||||
|
"rotation": [
|
||||||
|
10,
|
||||||
|
-45,
|
||||||
|
170
|
||||||
|
],
|
||||||
|
"translation": [
|
||||||
|
0,
|
||||||
|
1.5,
|
||||||
|
-2.75
|
||||||
|
],
|
||||||
|
"scale": [
|
||||||
|
0.375,
|
||||||
|
0.375,
|
||||||
|
0.375
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,22 @@
|
|||||||
{
|
{
|
||||||
"model": {
|
"parent": "ageofthegods:block/shale_block",
|
||||||
"type": "minecraft:model",
|
"display": {
|
||||||
"model": "ageofthegods:block/shale_block"
|
"thirdperson": {
|
||||||
|
"rotation": [
|
||||||
|
10,
|
||||||
|
-45,
|
||||||
|
170
|
||||||
|
],
|
||||||
|
"translation": [
|
||||||
|
0,
|
||||||
|
1.5,
|
||||||
|
-2.75
|
||||||
|
],
|
||||||
|
"scale": [
|
||||||
|
0.375,
|
||||||
|
0.375,
|
||||||
|
0.375
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"parent": "ageofthegods:block/shale_grass_block",
|
||||||
|
"display": {
|
||||||
|
"thirdperson": {
|
||||||
|
"rotation": [
|
||||||
|
10,
|
||||||
|
-45,
|
||||||
|
170
|
||||||
|
],
|
||||||
|
"translation": [
|
||||||
|
0,
|
||||||
|
1.5,
|
||||||
|
-2.75
|
||||||
|
],
|
||||||
|
"scale": [
|
||||||
|
0.375,
|
||||||
|
0.375,
|
||||||
|
0.375
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 461 B |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 292 B |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 312 B |
Binary file not shown.
|
After Width: | Height: | Size: 450 B |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 424 B |
Reference in New Issue
Block a user