Tree fixes

This commit is contained in:
paulevsGitch 2020-12-10 14:09:59 +03:00
parent 2302371ac6
commit ee60f73e53
10 changed files with 100 additions and 12 deletions

View file

@ -4,16 +4,27 @@ import java.util.Collections;
import java.util.List;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Material;
import net.minecraft.block.MaterialColor;
import net.minecraft.client.color.block.BlockColorProvider;
import net.minecraft.client.color.item.ItemColorProvider;
import net.minecraft.item.ItemPlacementContext;
import net.minecraft.item.ItemStack;
import net.minecraft.loot.context.LootContext;
import net.minecraft.sound.BlockSoundGroup;
import net.minecraft.state.StateManager;
import net.minecraft.state.property.IntProperty;
import net.minecraft.util.math.MathHelper;
import ru.betterend.blocks.basis.BlockBase;
import ru.betterend.interfaces.IColorProvider;
import ru.betterend.registry.EndBlocks;
import ru.betterend.util.MHelper;
public class BlockHelixTreeLeaves extends BlockBase {
public class BlockHelixTreeLeaves extends BlockBase implements IColorProvider {
public static final IntProperty COLOR = IntProperty.of("color", 0, 7);
public BlockHelixTreeLeaves() {
super(FabricBlockSettings.of(Material.LEAVES)
.strength(0.2F)
@ -25,4 +36,33 @@ public class BlockHelixTreeLeaves extends BlockBase {
public List<ItemStack> getDroppedStacks(BlockState state, LootContext.Builder builder) {
return Collections.singletonList(new ItemStack(EndBlocks.HELIX_TREE_SAPLING));
}
@Override
protected void appendProperties(StateManager.Builder<Block, BlockState> stateManager) {
stateManager.add(COLOR);
}
@Override
public BlockColorProvider getProvider() {
return (state, world, pos, tintIndex) -> {
return MHelper.color(237, getGreen(state.get(COLOR)), 20);
};
}
@Override
public ItemColorProvider getItemProvider() {
return (stack, tintIndex) -> {
return MHelper.color(237, getGreen(4), 20);
};
}
@Override
public BlockState getPlacementState(ItemPlacementContext ctx) {
return this.getDefaultState().with(COLOR, MHelper.randRange(3, 5, ctx.getWorld().getRandom()));
}
private int getGreen(int color) {
float delta = color / 7F;
return (int) MathHelper.lerp(delta, 35, 102);
}
}

View file

@ -169,7 +169,7 @@ public class SplineHelper {
BlocksHelper.setWithoutUpdate(world, bPos, state);
bPos.setY(bPos.getY() - 1);
bState = world.getBlockState(bPos);
if (down && bState.equals(state) || replace.apply(bState)) {
if (down && replace.apply(bState)) {
BlocksHelper.setWithoutUpdate(world, bPos, state);
}
}
@ -183,7 +183,7 @@ public class SplineHelper {
BlocksHelper.setWithoutUpdate(world, bPos, state);
bPos.setY(bPos.getY() - 1);
bState = world.getBlockState(bPos);
if (down && bState.equals(state) || replace.apply(bState)) {
if (down && replace.apply(bState)) {
BlocksHelper.setWithoutUpdate(world, bPos, state);
}
}

View file

@ -4,13 +4,16 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import net.minecraft.block.BlockState;
import net.minecraft.client.util.math.Vector3f;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockPos.Mutable;
import net.minecraft.util.math.Box;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.StructureWorldAccess;
import net.minecraft.world.gen.chunk.ChunkGenerator;
import net.minecraft.world.gen.feature.DefaultFeatureConfig;
import ru.betterend.blocks.BlockHelixTreeLeaves;
import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndTags;
import ru.betterend.util.BlocksHelper;
@ -76,7 +79,7 @@ public class HelixTreeFeature extends DefaultFeature {
float radius = 1 - i * 0.05F;
radius = radius * radius * 2 - 1;
radius *= radius;
radius = (1 - radius) * 10F * scale;
radius = (1 - radius) * 8F * scale;
dx = (float) Math.sin(i * 0.45F + angle) * radius;
dz = (float) Math.cos(i * 0.45F + angle) * radius;
spline.add(new Vector3f(dx, i * scale * 1.75F, dz));
@ -85,37 +88,68 @@ public class HelixTreeFeature extends DefaultFeature {
Vector3f start = new Vector3f();
Vector3f end = new Vector3f();
lastPoint = spline.get(0);
BlockState leaf = EndBlocks.HELIX_TREE_LEAVES.getDefaultState();
for (int i = 1; i < spline.size(); i++) {
Vector3f point = spline.get(i);
int minY = MHelper.floor(lastPoint.getY());
int maxY = MHelper.floor(point.getY());
float div = point.getY() - lastPoint.getY();
for (float py = minY; py <= maxY; py += 0.2F) {
for (float py = minY; py <= maxY; py += 0.1F) {
start.set(0, py, 0);
float delta = (float) (py - minY) / div;
float px = MathHelper.lerp(delta, lastPoint.getX(), point.getX());
float pz = MathHelper.lerp(delta, lastPoint.getZ(), point.getZ());
end.set(px, py, pz);
SplineHelper.fillLineForce(start, end, world, EndBlocks.HELIX_TREE_LEAVES.getDefaultState(), leafStart, (state) -> {
return state.getMaterial().isReplaceable();
});
fillLine(start, end, world, leaf, leafStart, i / 2 - 1);
}
lastPoint = point;
}
leafStart = leafStart.add(0, lastPoint.getY() + 1, 0);
leaf = leaf.with(BlockHelixTreeLeaves.COLOR, 7);
leafStart = leafStart.add(0, lastPoint.getY(), 0);
if (world.getBlockState(leafStart).isAir()) {
BlocksHelper.setWithoutUpdate(world, leafStart, EndBlocks.HELIX_TREE_LEAVES);
BlocksHelper.setWithoutUpdate(world, leafStart, leaf);
leafStart = leafStart.up();
if (world.getBlockState(leafStart).isAir()) {
BlocksHelper.setWithoutUpdate(world, leafStart, EndBlocks.HELIX_TREE_LEAVES);
BlocksHelper.setWithoutUpdate(world, leafStart, leaf);
leafStart = leafStart.up();
if (world.getBlockState(leafStart).isAir()) {
BlocksHelper.setWithoutUpdate(world, leafStart, EndBlocks.HELIX_TREE_LEAVES);
BlocksHelper.setWithoutUpdate(world, leafStart, leaf);
}
}
}
return true;
}
private void fillLine(Vector3f start, Vector3f end, StructureWorldAccess world, BlockState state, BlockPos pos, int offset) {
float dx = end.getX() - start.getX();
float dy = end.getY() - start.getY();
float dz = end.getZ() - start.getZ();
float max = MHelper.max(Math.abs(dx), Math.abs(dy), Math.abs(dz));
int count = MHelper.floor(max + 1);
dx /= max;
dy /= max;
dz /= max;
float x = start.getX();
float y = start.getY();
float z = start.getZ();
Mutable bPos = new Mutable();
for (int i = 0; i < count; i++) {
int color = MHelper.floor((float) i / (float) count * 7F + 0.5F) + offset;
color = MathHelper.clamp(color, 0, 7);
bPos.set(x + pos.getX(), y + pos.getY(), z + pos.getZ());
if (world.getBlockState(bPos).getMaterial().isReplaceable()) {
BlocksHelper.setWithoutUpdate(world, bPos, state.with(BlockHelixTreeLeaves.COLOR, color));
}
x += dx;
y += dy;
z += dz;
}
bPos.set(end.getX() + pos.getX(), end.getY() + pos.getY(), end.getZ() + pos.getZ());
if (world.getBlockState(bPos).getMaterial().isReplaceable()) {
BlocksHelper.setWithoutUpdate(world, bPos, state.with(BlockHelixTreeLeaves.COLOR, 7));
}
}
}

View file

@ -0,0 +1,5 @@
{
"variants": {
"": { "model": "betterend:block/helix_tree_leaves" }
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "betterend:block/tint_cube_noshade",
"textures": {
"texture": "betterend:block/helix_tree_leaves"
}
}

View file

@ -0,0 +1,3 @@
{
"parent": "betterend:block/helix_tree_leaves"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 393 B

After

Width:  |  Height:  |  Size: 680 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 215 B

After

Width:  |  Height:  |  Size: 1.6 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 298 B

After

Width:  |  Height:  |  Size: 407 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 405 B

After

Width:  |  Height:  |  Size: 372 B

Before After
Before After