NaturesAura/src/main/java/de/ellpeck/naturesaura/blocks/BlockGoldenLeaves.java

118 lines
4.8 KiB
Java
Raw Normal View History

2018-10-15 18:36:46 +02:00
package de.ellpeck.naturesaura.blocks;
import de.ellpeck.naturesaura.Helper;
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
2020-01-29 00:40:28 +01:00
import de.ellpeck.naturesaura.data.BlockStateGenerator;
2018-10-15 18:36:46 +02:00
import de.ellpeck.naturesaura.reg.*;
import net.minecraft.client.color.block.BlockColor;
import net.minecraft.client.color.item.ItemColor;
import net.minecraft.client.renderer.BiomeColors;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.server.level.ServerLevel;
2022-06-27 15:24:04 +02:00
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.LeavesBlock;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.IntegerProperty;
2023-07-08 12:32:27 +02:00
import net.minecraft.world.level.material.MapColor;
2024-02-03 14:56:07 +01:00
import net.neoforged.api.distmarker.Dist;
import net.neoforged.api.distmarker.OnlyIn;
2018-10-15 18:36:46 +02:00
2020-01-29 00:40:28 +01:00
public class BlockGoldenLeaves extends LeavesBlock implements IModItem, IColorProvidingBlock, IColorProvidingItem, ICustomBlockState {
2018-10-15 18:36:46 +02:00
2020-01-24 17:05:41 +01:00
public static final int HIGHEST_STAGE = 3;
2022-06-27 15:24:04 +02:00
public static final IntegerProperty STAGE = IntegerProperty.create("stage", 0, BlockGoldenLeaves.HIGHEST_STAGE);
2018-10-15 18:36:46 +02:00
public BlockGoldenLeaves() {
2023-07-08 12:32:27 +02:00
super(Properties.of().mapColor(MapColor.GOLD).strength(0.2F).randomTicks().noOcclusion().sound(SoundType.GRASS));
2022-06-27 15:24:04 +02:00
ModRegistry.ALL_ITEMS.add(this);
2018-10-15 18:36:46 +02:00
}
2021-12-04 15:40:09 +01:00
public static boolean convert(Level level, BlockPos pos) {
2021-12-15 16:30:22 +01:00
var state = level.getBlockState(pos);
2020-09-22 03:17:02 +02:00
if (state.getBlock() instanceof LeavesBlock && !(state.getBlock() instanceof BlockAncientLeaves || state.getBlock() instanceof BlockGoldenLeaves)) {
2021-12-04 15:40:09 +01:00
if (!level.isClientSide) {
level.setBlockAndUpdate(pos, ModBlocks.GOLDEN_LEAVES.defaultBlockState()
2022-06-27 15:24:04 +02:00
.setValue(LeavesBlock.DISTANCE, state.hasProperty(LeavesBlock.DISTANCE) ? state.getValue(LeavesBlock.DISTANCE) : 1)
.setValue(LeavesBlock.PERSISTENT, state.hasProperty(LeavesBlock.PERSISTENT) ? state.getValue(LeavesBlock.PERSISTENT) : false));
2020-02-07 15:22:30 +01:00
}
return true;
}
return false;
}
2018-10-15 18:36:46 +02:00
@Override
public String getBaseName() {
return "golden_leaves";
}
@Override
2019-10-20 22:30:49 +02:00
@OnlyIn(Dist.CLIENT)
2022-06-27 15:24:04 +02:00
public void animateTick(BlockState stateIn, Level levelIn, BlockPos pos, RandomSource rand) {
if (stateIn.getValue(BlockGoldenLeaves.STAGE) == BlockGoldenLeaves.HIGHEST_STAGE && rand.nextFloat() >= 0.75F)
2018-11-13 00:36:47 +01:00
NaturesAuraAPI.instance().spawnMagicParticle(
pos.getX() + rand.nextFloat(),
pos.getY() + rand.nextFloat(),
pos.getZ() + rand.nextFloat(),
0F, 0F, 0F,
0xF2FF00, 0.5F + rand.nextFloat(), 50, 0F, false, true);
}
2018-10-15 18:36:46 +02:00
@Override
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
super.createBlockStateDefinition(builder);
2022-06-27 15:24:04 +02:00
builder.add(BlockGoldenLeaves.STAGE);
2018-10-15 18:36:46 +02:00
}
@Override
2019-10-20 22:30:49 +02:00
@OnlyIn(Dist.CLIENT)
public BlockColor getBlockColor() {
2021-12-04 15:40:09 +01:00
return (state, levelIn, pos, tintIndex) -> {
2021-12-15 16:30:22 +01:00
var color = 0xF2FF00;
2021-12-04 15:40:09 +01:00
if (state != null && levelIn != null && pos != null) {
2021-12-15 16:30:22 +01:00
var foliage = BiomeColors.getAverageFoliageColor(levelIn, pos);
2022-06-27 15:24:04 +02:00
return Helper.blendColors(color, foliage, state.getValue(BlockGoldenLeaves.STAGE) / (float) BlockGoldenLeaves.HIGHEST_STAGE);
2018-10-15 18:36:46 +02:00
} else {
return color;
}
};
}
@Override
2019-10-20 22:30:49 +02:00
@OnlyIn(Dist.CLIENT)
public ItemColor getItemColor() {
2018-10-15 18:36:46 +02:00
return (stack, tintIndex) -> 0xF2FF00;
}
@Override
2022-06-27 15:24:04 +02:00
public void randomTick(BlockState state, ServerLevel levelIn, BlockPos pos, RandomSource random) {
2021-12-04 15:40:09 +01:00
super.randomTick(state, levelIn, pos, random);
if (!levelIn.isClientSide) {
2022-06-27 15:24:04 +02:00
int stage = state.getValue(BlockGoldenLeaves.STAGE);
if (stage < BlockGoldenLeaves.HIGHEST_STAGE) {
levelIn.setBlockAndUpdate(pos, state.setValue(BlockGoldenLeaves.STAGE, stage + 1));
2018-10-15 18:36:46 +02:00
}
if (stage > 1) {
2021-12-15 16:30:22 +01:00
var offset = pos.relative(Direction.getRandom(random));
if (levelIn.isLoaded(offset))
2022-06-27 15:24:04 +02:00
BlockGoldenLeaves.convert(levelIn, offset);
2018-10-15 18:36:46 +02:00
}
}
}
2020-01-24 17:05:41 +01:00
@Override
public boolean isRandomlyTicking(BlockState p_54449_) {
2020-01-24 17:05:41 +01:00
return true;
}
2020-01-29 00:40:28 +01:00
@Override
public void generateCustomBlockState(BlockStateGenerator generator) {
generator.simpleBlock(this, generator.models().getExistingFile(generator.modLoc(this.getBaseName())));
}
2023-07-08 12:32:27 +02:00
}