This repository has been archived on 2023-11-26. You can view files and clone it, but cannot push or open issues or pull requests.
EnergonRelics/src/main/java/com/thebrokenrail/energonrelics/block/entity/LightningRodBaseBlockEntity...

114 lines
3.3 KiB
Java
Raw Normal View History

2020-07-23 17:39:40 +00:00
package com.thebrokenrail.energonrelics.block.entity;
2020-08-04 17:06:11 +00:00
import com.thebrokenrail.energonrelics.api.block.entity.core.EnergyProviderBlockEntity;
import com.thebrokenrail.energonrelics.api.block.entity.helper.EnergyGenerator;
import com.thebrokenrail.energonrelics.api.energy.Action;
2020-07-23 17:39:40 +00:00
import com.thebrokenrail.energonrelics.config.HardcodedConfig;
2020-08-04 17:06:11 +00:00
import com.thebrokenrail.energonrelics.api.energy.tick.EnergyTickable;
2020-07-23 17:39:40 +00:00
import net.minecraft.block.BlockState;
import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.LightningEntity;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.LightType;
2020-07-24 17:25:50 +00:00
import java.util.List;
2020-07-23 17:39:40 +00:00
import java.util.Objects;
2020-07-29 01:46:04 +00:00
public class LightningRodBaseBlockEntity extends EnergyProviderBlockEntity implements EnergyGenerator {
public LightningRodBaseBlockEntity(BlockEntityType<?> type) {
2020-07-23 17:39:40 +00:00
super(type);
}
private int getLight() {
if (hasWorld() && Objects.requireNonNull(getWorld()).getDimension().hasSkyLight() && getWorld().isThundering()) {
assert getWorld() != null;
return getWorld().getLightLevel(LightType.SKY, getPos());
} else {
return 0;
}
}
private int cooldown = 0;
private long energy = 0;
@Override
public long getDisplayEnergy() {
return energy;
}
@Override
public long getEnergy() {
return energy;
}
@Override
public void setEnergy(long energy) {
this.energy = energy;
}
@Override
2020-07-26 22:31:05 +00:00
public List<EnergyTickable> startTick() {
2020-07-29 21:24:03 +00:00
assert getWorld() != null;
2020-07-23 17:39:40 +00:00
if (cooldown <= 0) {
2020-08-03 19:48:30 +00:00
boolean dirty = false;
2020-07-29 21:24:03 +00:00
if (energy != 0) {
energy = 0;
2020-08-03 19:48:30 +00:00
dirty = true;
2020-07-29 21:24:03 +00:00
}
2020-07-23 17:39:40 +00:00
if (getLight() > 0) {
2020-07-29 21:24:03 +00:00
if (getWorld().random.nextDouble() <= HardcodedConfig.LIGHTNING_ROD_CHANCE) {
2020-07-23 17:39:40 +00:00
LightningEntity entity = EntityType.LIGHTNING_BOLT.create(getWorld());
assert entity != null;
2020-07-29 21:24:03 +00:00
entity.updatePosition(getPos().getX() + 0.5d, getPos().getY() + 1d + (getWorld().random.nextDouble() * 1.5d), getPos().getZ() + 0.5d);
2020-07-25 17:34:16 +00:00
entity.setCosmetic(true);
2020-07-23 17:39:40 +00:00
Objects.requireNonNull(getWorld()).spawnEntity(entity);
cooldown = HardcodedConfig.LIGHTNING_ROD_COOLDOWN;
energy = HardcodedConfig.LIGHTNING_ROD_ENERGY_OUTPUT;
2020-07-29 21:24:03 +00:00
2020-08-03 19:48:30 +00:00
dirty = true;
2020-07-23 17:39:40 +00:00
}
}
2020-08-03 19:48:30 +00:00
if (dirty) {
markDirty();
}
2020-07-23 17:39:40 +00:00
} else {
2020-07-29 21:24:03 +00:00
energy = 0;
2020-07-23 17:39:40 +00:00
cooldown--;
2020-07-29 21:24:03 +00:00
markDirty();
2020-07-23 17:39:40 +00:00
}
2020-07-29 21:24:03 +00:00
2020-07-24 17:25:50 +00:00
return super.startTick();
2020-07-23 17:39:40 +00:00
}
@Override
public CompoundTag toTag(CompoundTag tag) {
super.toTag(tag);
tag.putInt("Cooldown", cooldown);
return tag;
}
@Override
public void fromTag(BlockState state, CompoundTag tag) {
super.fromTag(state, tag);
cooldown = tag.getInt("Cooldown");
}
@Override
protected void handlePropagatedAction(Action.PropagatedAction action) {
super.handlePropagatedAction(action);
handlePropagatedActionWithGenerator(action);
}
@Override
public boolean isEnergyProvider() {
return true;
}
}