NaturesAura/src/main/java/de/ellpeck/naturesaura/aura/chunk/effect/GrassDieEffect.java

60 lines
2.8 KiB
Java
Raw Normal View History

package de.ellpeck.naturesaura.aura.chunk.effect;
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
2018-11-11 13:26:19 +01:00
import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk;
import de.ellpeck.naturesaura.api.aura.chunk.IDrainSpotEffect;
import de.ellpeck.naturesaura.api.aura.type.IAuraType;
import de.ellpeck.naturesaura.blocks.ModBlocks;
import net.minecraft.block.*;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.util.math.BlockPos;
2018-10-26 15:01:48 +02:00
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk;
import org.apache.commons.lang3.mutable.MutableInt;
public class GrassDieEffect implements IDrainSpotEffect {
@Override
2018-11-11 13:26:19 +01:00
public void update(World world, Chunk chunk, IAuraChunk auraChunk, BlockPos pos, MutableInt spot) {
if (spot.intValue() < 0) {
2018-11-11 13:26:19 +01:00
int aura = IAuraChunk.getAuraInArea(world, pos, 25);
if (aura < 0) {
int amount = Math.min(300, Math.abs(aura) / 1000);
2018-10-26 15:01:48 +02:00
if (amount > 1) {
int dist = MathHelper.clamp(Math.abs(aura) / 750, 5, 45);
if (dist > 0) {
for (int i = amount / 2 + world.rand.nextInt(amount / 2); i >= 0; i--) {
BlockPos grassPos = new BlockPos(
pos.getX() + world.rand.nextGaussian() * dist,
pos.getY() + world.rand.nextGaussian() * dist,
pos.getZ() + world.rand.nextGaussian() * dist
);
if (grassPos.distanceSq(pos) <= dist * dist && world.isBlockLoaded(grassPos)) {
IBlockState state = world.getBlockState(grassPos);
Block block = state.getBlock();
IBlockState newState = null;
if (block instanceof BlockLeaves) {
newState = ModBlocks.DECAYED_LEAVES.getDefaultState();
} else if (block instanceof BlockGrass) {
newState = Blocks.DIRT.getDefaultState().withProperty(BlockDirt.VARIANT, BlockDirt.DirtType.COARSE_DIRT);
} else if (block instanceof BlockBush) {
newState = Blocks.AIR.getDefaultState();
}
if (newState != null)
world.setBlockState(grassPos, newState);
}
}
}
}
}
}
}
@Override
public boolean appliesToType(IAuraType type) {
return type == NaturesAuraAPI.TYPE_OVERWORLD;
}
}