diff --git a/src/main/java/ru/betterend/blocks/BlockHelixTreeLeaves.java b/src/main/java/ru/betterend/blocks/BlockHelixTreeLeaves.java index ad39aa5a..7e78f511 100644 --- a/src/main/java/ru/betterend/blocks/BlockHelixTreeLeaves.java +++ b/src/main/java/ru/betterend/blocks/BlockHelixTreeLeaves.java @@ -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 getDroppedStacks(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(EndBlocks.HELIX_TREE_SAPLING)); } + + @Override + protected void appendProperties(StateManager.Builder 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); + } } diff --git a/src/main/java/ru/betterend/util/SplineHelper.java b/src/main/java/ru/betterend/util/SplineHelper.java index 1bda0f28..75fc23ce 100644 --- a/src/main/java/ru/betterend/util/SplineHelper.java +++ b/src/main/java/ru/betterend/util/SplineHelper.java @@ -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); } } diff --git a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java index 16d95cc4..d9107a38 100644 --- a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java @@ -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)); + } + } } diff --git a/src/main/resources/assets/betterend/blockstates/helix_tree_leaves.json b/src/main/resources/assets/betterend/blockstates/helix_tree_leaves.json new file mode 100644 index 00000000..8addd4bf --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/helix_tree_leaves.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "betterend:block/helix_tree_leaves" } + } +} diff --git a/src/main/resources/assets/betterend/models/block/helix_tree_leaves.json b/src/main/resources/assets/betterend/models/block/helix_tree_leaves.json new file mode 100644 index 00000000..741d59cf --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/helix_tree_leaves.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/tint_cube_noshade", + "textures": { + "texture": "betterend:block/helix_tree_leaves" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/helix_tree_leaves.json b/src/main/resources/assets/betterend/models/item/helix_tree_leaves.json new file mode 100644 index 00000000..009cbb90 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/helix_tree_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/helix_tree_leaves" +} diff --git a/src/main/resources/assets/betterend/textures/block/amber_ore.png b/src/main/resources/assets/betterend/textures/block/amber_ore.png index d8ef77f9..41ba1c69 100644 Binary files a/src/main/resources/assets/betterend/textures/block/amber_ore.png and b/src/main/resources/assets/betterend/textures/block/amber_ore.png differ diff --git a/src/main/resources/assets/betterend/textures/block/helix_tree_leaves.png b/src/main/resources/assets/betterend/textures/block/helix_tree_leaves.png index 843a652e..50e459a2 100644 Binary files a/src/main/resources/assets/betterend/textures/block/helix_tree_leaves.png and b/src/main/resources/assets/betterend/textures/block/helix_tree_leaves.png differ diff --git a/src/main/resources/assets/betterend/textures/item/amber_gem.png b/src/main/resources/assets/betterend/textures/item/amber_gem.png index 96191a20..5a7e023f 100644 Binary files a/src/main/resources/assets/betterend/textures/item/amber_gem.png and b/src/main/resources/assets/betterend/textures/item/amber_gem.png differ diff --git a/src/main/resources/assets/betterend/textures/item/raw_amber.png b/src/main/resources/assets/betterend/textures/item/raw_amber.png index 9e0fbbb1..ccb61594 100644 Binary files a/src/main/resources/assets/betterend/textures/item/raw_amber.png and b/src/main/resources/assets/betterend/textures/item/raw_amber.png differ