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

119 lines
4.4 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.*;
2019-11-04 19:08:49 +01:00
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
2019-10-20 22:30:49 +02:00
import net.minecraft.block.LeavesBlock;
2020-01-24 17:05:41 +01:00
import net.minecraft.block.SoundType;
2019-11-04 19:08:49 +01:00
import net.minecraft.block.material.Material;
2019-10-20 22:30:49 +02:00
import net.minecraft.block.material.MaterialColor;
2018-10-15 18:36:46 +02:00
import net.minecraft.client.renderer.color.IBlockColor;
import net.minecraft.client.renderer.color.IItemColor;
2019-11-04 19:08:49 +01:00
import net.minecraft.state.IntegerProperty;
import net.minecraft.state.StateContainer;
2019-10-20 22:30:49 +02:00
import net.minecraft.util.Direction;
2018-10-15 18:36:46 +02:00
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
2019-10-20 22:30:49 +02:00
import net.minecraft.world.biome.BiomeColors;
2020-01-28 18:08:56 +01:00
import net.minecraft.world.server.ServerWorld;
2019-10-20 22:30:49 +02:00
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
2018-10-15 18:36:46 +02:00
import java.util.Random;
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;
public static final IntegerProperty STAGE = IntegerProperty.create("stage", 0, HIGHEST_STAGE);
2018-10-15 18:36:46 +02:00
public BlockGoldenLeaves() {
2020-01-29 00:40:28 +01:00
super(ModBlocks.prop(Material.LEAVES, MaterialColor.GOLD).hardnessAndResistance(0.2F).tickRandomly().notSolid().sound(SoundType.PLANT));
2018-11-29 17:58:47 +01:00
ModRegistry.add(this);
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)
2019-11-04 19:08:49 +01:00
public void animateTick(BlockState stateIn, World worldIn, BlockPos pos, Random rand) {
if (stateIn.get(STAGE) == 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
2019-11-04 19:08:49 +01:00
protected void fillStateContainer(StateContainer.Builder<Block, BlockState> builder) {
super.fillStateContainer(builder);
builder.add(STAGE);
2018-10-15 18:36:46 +02:00
}
@Override
2019-10-20 22:30:49 +02:00
@OnlyIn(Dist.CLIENT)
2018-10-15 18:36:46 +02:00
public IBlockColor getBlockColor() {
return (state, worldIn, pos, tintIndex) -> {
int color = 0xF2FF00;
if (state != null && worldIn != null && pos != null) {
2020-01-28 18:08:56 +01:00
int foliage = BiomeColors.func_228361_b_(worldIn, pos);
2019-11-04 19:08:49 +01:00
return Helper.blendColors(color, foliage, state.get(STAGE) / (float) 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)
2018-10-15 18:36:46 +02:00
public IItemColor getItemColor() {
return (stack, tintIndex) -> 0xF2FF00;
}
@Override
2020-01-28 18:08:56 +01:00
public void randomTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random random) {
2020-01-22 23:21:52 +01:00
super.randomTick(state, worldIn, pos, random);
2018-10-15 18:36:46 +02:00
if (!worldIn.isRemote) {
2019-11-04 19:08:49 +01:00
int stage = state.get(STAGE);
2018-10-15 18:36:46 +02:00
if (stage < HIGHEST_STAGE) {
2019-11-04 19:08:49 +01:00
worldIn.setBlockState(pos, state.with(STAGE, stage + 1));
2018-10-15 18:36:46 +02:00
}
if (stage > 1) {
2019-11-04 19:08:49 +01:00
BlockPos offset = pos.offset(Direction.random(random));
if (worldIn.isBlockLoaded(offset))
convert(worldIn, offset);
2018-10-15 18:36:46 +02:00
}
}
}
2020-01-24 17:05:41 +01:00
@Override
public boolean ticksRandomly(BlockState state) {
return true;
}
2018-10-15 18:36:46 +02:00
public static boolean convert(World world, BlockPos pos) {
2019-10-20 22:30:49 +02:00
BlockState state = world.getBlockState(pos);
2020-01-22 23:21:52 +01:00
if ((state.getBlock().isFoliage(state, world, pos) || state.getBlock() instanceof LeavesBlock) && !(state.getBlock() instanceof BlockAncientLeaves || state.getBlock() instanceof BlockGoldenLeaves)) {
2018-10-15 18:36:46 +02:00
if (!world.isRemote) {
world.setBlockState(pos, ModBlocks.GOLDEN_LEAVES.getDefaultState()
2019-11-04 19:08:49 +01:00
.with(DISTANCE, state.has(DISTANCE) ? state.get(DISTANCE) : 1)
.with(PERSISTENT, state.has(PERSISTENT) ? state.get(PERSISTENT) : false));
2018-10-15 18:36:46 +02:00
}
return true;
}
return false;
}
2020-01-29 00:40:28 +01:00
@Override
public void generateCustomBlockState(BlockStateGenerator generator) {
generator.simpleBlock(this, generator.models().getExistingFile(generator.modLoc(this.getBaseName())));
}
2018-10-15 18:36:46 +02:00
}