NaturesAura/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityChorusGenerator.java

125 lines
4.9 KiB
Java
Raw Normal View History

2020-05-04 23:39:57 +02:00
package de.ellpeck.naturesaura.blocks.tiles;
import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk;
import de.ellpeck.naturesaura.packet.PacketHandler;
import de.ellpeck.naturesaura.packet.PacketParticles;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
2021-12-04 15:40:09 +01:00
import net.minecraft.nbt.CompoundTag;
2020-05-05 00:05:38 +02:00
import net.minecraft.nbt.ListNBT;
import net.minecraft.nbt.NBTUtil;
2021-12-04 15:40:09 +01:00
import net.minecraft.tileentity.ITickableBlockEntity;
2020-05-04 23:39:57 +02:00
import net.minecraft.util.Direction;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvents;
import net.minecraft.util.math.BlockPos;
2021-01-14 23:15:02 +01:00
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
2020-05-04 23:39:57 +02:00
2021-12-04 15:40:09 +01:00
public class BlockEntityChorusGenerator extends BlockEntityImpl implements ITickableBlockEntity {
2020-05-04 23:39:57 +02:00
private final Deque<BlockPos> currentlyBreaking = new ArrayDeque<>();
private int auraPerBlock;
2021-12-04 15:40:09 +01:00
public BlockEntityChorusGenerator() {
2020-05-04 23:39:57 +02:00
super(ModTileEntities.CHORUS_GENERATOR);
}
@Override
public void tick() {
2021-12-04 15:40:09 +01:00
if (this.level.isClientSide)
2020-05-04 23:39:57 +02:00
return;
2021-12-04 15:40:09 +01:00
if (this.level.getGameTime() % 5 != 0)
2020-05-04 23:39:57 +02:00
return;
if (this.currentlyBreaking.isEmpty())
return;
BlockPos pos = this.currentlyBreaking.removeLast();
2021-12-04 15:40:09 +01:00
BlockState state = this.level.getBlockState(pos);
2020-05-04 23:39:57 +02:00
if (state.getBlock() != Blocks.CHORUS_PLANT && state.getBlock() != Blocks.CHORUS_FLOWER) {
this.currentlyBreaking.clear();
return;
}
2021-12-04 15:40:09 +01:00
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticles(this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ(), PacketParticles.Type.CHORUS_GENERATOR, pos.getX(), pos.getY(), pos.getZ()));
this.level.removeBlock(pos, false);
this.level.playSound(null, this.worldPosition.getX() + 0.5, this.worldPosition.getY() + 0.5, this.worldPosition.getZ() + 0.5,
2020-05-04 23:39:57 +02:00
SoundEvents.ITEM_CHORUS_FRUIT_TELEPORT, SoundCategory.BLOCKS, 0.5F, 1F);
2021-03-30 15:44:31 +02:00
this.generateAura(this.auraPerBlock);
2020-05-04 23:39:57 +02:00
}
@Override
public void onRedstonePowerChange(int newPower) {
if (this.redstonePower <= 0 && newPower > 0 && this.currentlyBreaking.isEmpty()) {
int range = 2;
xyz:
for (int x = -range; x <= range; x++) {
for (int y = -range; y <= range; y++) {
for (int z = -range; z <= range; z++) {
2021-12-04 15:40:09 +01:00
BlockPos offset = this.worldPosition.add(x, y, z);
BlockState below = this.level.getBlockState(offset.down());
2020-05-04 23:39:57 +02:00
if (below.getBlock() != Blocks.END_STONE)
continue;
2021-12-04 15:40:09 +01:00
BlockState state = this.level.getBlockState(offset);
2020-05-04 23:39:57 +02:00
if (state.getBlock() != Blocks.CHORUS_PLANT)
continue;
List<BlockPos> plants = new ArrayList<>();
this.collectChorusPlant(offset, plants);
if (plants.size() <= 1)
continue;
this.currentlyBreaking.addAll(plants);
this.currentlyBreaking.addFirst(offset);
int aura = plants.size() * plants.size() * 300;
this.auraPerBlock = aura / plants.size();
break xyz;
}
}
}
}
super.onRedstonePowerChange(newPower);
}
private void collectChorusPlant(BlockPos pos, List<BlockPos> blocks) {
for (Direction dir : Direction.values()) {
if (dir == Direction.DOWN)
continue;
BlockPos offset = pos.offset(dir);
if (blocks.contains(offset))
continue;
2021-12-04 15:40:09 +01:00
BlockState state = this.level.getBlockState(offset);
2020-05-04 23:39:57 +02:00
if (state.getBlock() != Blocks.CHORUS_PLANT && state.getBlock() != Blocks.CHORUS_FLOWER)
continue;
blocks.add(offset);
this.collectChorusPlant(offset, blocks);
}
}
2020-05-05 00:05:38 +02:00
@Override
2021-12-04 15:40:09 +01:00
public void writeNBT(CompoundTag compound, SaveType type) {
2020-05-05 00:05:38 +02:00
super.writeNBT(compound, type);
if (type == SaveType.TILE) {
ListNBT list = new ListNBT();
for (BlockPos pos : this.currentlyBreaking)
list.add(NBTUtil.writeBlockPos(pos));
compound.put("breaking", list);
compound.putInt("aura", this.auraPerBlock);
}
}
@Override
2021-12-04 15:40:09 +01:00
public void readNBT(CompoundTag compound, SaveType type) {
2020-05-05 00:05:38 +02:00
super.readNBT(compound, type);
if (type == SaveType.TILE) {
this.currentlyBreaking.clear();
ListNBT list = compound.getList("breaking", 10);
for (int i = 0; i < list.size(); i++)
this.currentlyBreaking.add(NBTUtil.readBlockPos(list.getCompound(i)));
this.auraPerBlock = compound.getInt("aura");
}
}
2020-05-04 23:39:57 +02:00
}