Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,11 @@
import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo;
import com.gregtechceu.gtceu.api.gui.GuiTextures;
import com.gregtechceu.gtceu.api.gui.editor.EditableUI;
import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine;
import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine;
import com.gregtechceu.gtceu.api.machine.trait.EnvironmentalExplosionTrait;
import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer;
import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField;
import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient;
import com.gregtechceu.gtceu.config.ConfigHolder;

import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture;
import com.lowdragmc.lowdraglib.gui.texture.ProgressTexture;
Expand All @@ -18,23 +17,28 @@
import net.minecraft.MethodsReturnNonnullByDefault;
import net.minecraft.util.Mth;

import lombok.Getter;

import java.util.function.Function;

import javax.annotation.ParametersAreNonnullByDefault;

@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
public class TieredEnergyMachine extends TieredMachine implements ITieredMachine, IExplosionMachine {
public class TieredEnergyMachine extends TieredMachine implements ITieredMachine {

@SaveField
@SyncToClient
public final NotifiableEnergyContainer energyContainer;
protected TickableSubscription explosionSub;
@Getter
protected final EnvironmentalExplosionTrait environmentalExplosionTrait;

public TieredEnergyMachine(BlockEntityCreationInfo info, int tier,
Function<TieredEnergyMachine, NotifiableEnergyContainer> energyContainerSupplier) {
super(info, tier);
energyContainer = energyContainerSupplier.apply(this);
environmentalExplosionTrait = new EnvironmentalExplosionTrait(this, tier, tier * 10,
() -> energyContainer.getEnergyStored() > 0);
}

public TieredEnergyMachine(BlockEntityCreationInfo info, int tier) {
Expand All @@ -48,6 +52,8 @@ public TieredEnergyMachine(BlockEntityCreationInfo info, int tier) {
energyContainer = NotifiableEnergyContainer.receiverContainer(this,
tierVoltage * 64L, tierVoltage, getMaxInputOutputAmperage());
}
environmentalExplosionTrait = new EnvironmentalExplosionTrait(this, tier, tier * 10,
() -> energyContainer.getEnergyStored() > 0);
}

//////////////////////////////////////
Expand All @@ -57,29 +63,11 @@ public TieredEnergyMachine(BlockEntityCreationInfo info, int tier) {
@Override
public void onLoad() {
super.onLoad();
if (!isRemote() && ConfigHolder.INSTANCE.machines.shouldWeatherOrTerrainExplosion &&
shouldWeatherOrTerrainExplosion()) {
explosionSub = subscribeServerTick(this::checkExplosion);
checkExplosion();
}
}

@Override
public void onUnload() {
super.onUnload();
if (explosionSub != null) {
explosionSub.unsubscribe();
explosionSub = null;
}
}

//////////////////////////////////////
// ******** Explosion ********//
//////////////////////////////////////
protected void checkExplosion() {
if (energyContainer.getEnergyStored() > 0) {
checkWeatherOrTerrainExplosion(tier, tier * 10);
}
}

//////////////////////////////////////
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
import net.minecraft.world.phys.BlockHitResult;

import lombok.Getter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.*;
Expand Down Expand Up @@ -174,7 +173,6 @@ public MultiblockMachineDefinition getDefinition() {
/**
* Get MultiblockState. It records all structure-related information.
*/
@NotNull
public MultiblockState getMultiblockState() {
if (multiblockState == null) {
multiblockState = new MultiblockState(getLevel(), getBlockPos());
Expand Down Expand Up @@ -276,7 +274,7 @@ public boolean allowFlip() {
}

@Override
public void setUpwardsFacing(@NotNull Direction upwardsFacing) {
public void setUpwardsFacing(Direction upwardsFacing) {
if (!getDefinition().isAllowExtendedFacing()) {
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import com.gregtechceu.gtceu.api.machine.MetaMachine;
import com.gregtechceu.gtceu.api.machine.TickableSubscription;
import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider;
import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine;
import com.gregtechceu.gtceu.api.machine.feature.IUIMachine;
import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank;
import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic;
Expand All @@ -23,6 +22,7 @@
import com.gregtechceu.gtceu.config.ConfigHolder;
import com.gregtechceu.gtceu.utils.FormattingUtil;
import com.gregtechceu.gtceu.utils.GTTransferUtils;
import com.gregtechceu.gtceu.utils.GTUtil;
import com.gregtechceu.gtceu.utils.ISubscription;

import com.lowdragmc.lowdraglib.gui.modular.ModularUI;
Expand Down Expand Up @@ -66,7 +66,7 @@
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
public abstract class SteamBoilerMachine extends SteamWorkableMachine
implements IUIMachine, IExplosionMachine, IDataInfoProvider {
implements IUIMachine, IDataInfoProvider {

@SaveField
public final NotifiableFluidTank waterTank;
Expand Down Expand Up @@ -194,7 +194,7 @@ protected void updateCurrentTemperature() {
FluidAction.EXECUTE);
}
if (this.hasNoWater && hasDrainedWater) {
doExplosion(2.0f);
GTUtil.doExplosion(getLevel(), getBlockPos(), 2.0f);
} else this.hasNoWater = !hasDrainedWater;
if (filledSteam == 0 && hasDrainedWater && getLevel() instanceof ServerLevel serverLevel) {
final float x = getBlockPos().getX() + 0.5F;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package com.gregtechceu.gtceu.api.machine.trait;

import com.gregtechceu.gtceu.api.GTValues;
import com.gregtechceu.gtceu.api.machine.MetaMachine;
import com.gregtechceu.gtceu.api.machine.TickableSubscription;
import com.gregtechceu.gtceu.config.ConfigHolder;
import com.gregtechceu.gtceu.utils.GTUtil;

import net.minecraft.core.Direction;

import lombok.Getter;
import lombok.Setter;
import org.jetbrains.annotations.Nullable;

import java.util.function.BooleanSupplier;

public class EnvironmentalExplosionTrait extends MachineTrait {

public static final MachineTraitType<EnvironmentalExplosionTrait> TYPE = new MachineTraitType<>(
EnvironmentalExplosionTrait.class);

private @Nullable TickableSubscription explosionSub = null;

private boolean enableEnvironmentalExplosions;
@Getter
@Setter
private float explosionPower, fireChance;
@Setter
private BooleanSupplier explosionPredicate;

public EnvironmentalExplosionTrait(MetaMachine machine, float explosionPower, float fireChance,
BooleanSupplier explosionPredicate) {
super(machine);
enableEnvironmentalExplosions = true;
this.explosionPredicate = explosionPredicate;
this.explosionPower = explosionPower;
this.fireChance = fireChance;
}

public EnvironmentalExplosionTrait(MetaMachine machine, float explosionPower, float fireChance) {
this(machine, explosionPower, fireChance, () -> true);
}

@Override
public MachineTraitType<EnvironmentalExplosionTrait> getTraitType() {
return TYPE;
}

public boolean enableEnvironmentalExplosions() {
return enableEnvironmentalExplosions;
}

public void setEnableEnvironmentalExplosions(boolean value) {
enableEnvironmentalExplosions = value;
updateSubscription();
}

@Override
public void onMachineLoad() {
super.onMachineLoad();
if (!isRemote()) updateSubscription();
}

@Override
public void onMachineUnload() {
super.onMachineUnload();
}

private void updateSubscription() {
if (!isRemote() && enableEnvironmentalExplosions &&
ConfigHolder.INSTANCE.machines.shouldWeatherOrTerrainExplosion) {
explosionSub = subscribeServerTick(explosionSub, this::checkEnvironment);
} else {
if (explosionSub != null) explosionSub.unsubscribe();
explosionSub = null;
}
}

private void checkEnvironment() {
if (!enableEnvironmentalExplosions || !explosionPredicate.getAsBoolean()) return;
var level = machine.getLevel();
var pos = getBlockPos();
if (GTValues.RNG.nextInt(1000) == 0) {
for (Direction side : GTUtil.DIRECTIONS) {
var fluidState = level.getBlockState(pos.relative(side)).getFluidState();
if (!fluidState.isEmpty()) {
GTUtil.doExplosion(level, pos, explosionPower);
return;
}
}
}
if (level.isRainingAt(pos) || level.isRainingAt(pos.east()) || level.isRainingAt(pos.west()) ||
level.isRainingAt(pos.north()) || level.isRainingAt(pos.south())) {
if (level.isThundering() && GTValues.RNG.nextInt(3) == 0) {
if (GTValues.RNG.nextInt(1000) == 0) GTUtil.doExplosion(level, pos, explosionPower);
} else if (GTValues.RNG.nextInt(10) == 0) {
if (GTValues.RNG.nextInt(1000) == 0) GTUtil.doExplosion(level, pos, explosionPower);
} else if (GTValues.RNG.nextInt(1000) == 0) GTUtil.setOnFire(level, pos, fireChance);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.gregtechceu.gtceu.api.machine.trait;

import com.gregtechceu.gtceu.api.machine.MetaMachine;
import com.gregtechceu.gtceu.api.machine.TickableSubscription;
import com.gregtechceu.gtceu.api.sync_system.ISyncManaged;
import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder;
import com.gregtechceu.gtceu.client.model.machine.MachineRenderState;
Expand Down Expand Up @@ -45,10 +46,26 @@ public MachineTrait(MetaMachine machine) {

public abstract MachineTraitType<?> getTraitType();

public @Nullable TickableSubscription subscribeServerTick(@Nullable TickableSubscription last, Runnable runnable) {
return machine.subscribeServerTick(last, runnable);
}

public void unsubscribe(TickableSubscription current) {
machine.unsubscribe(current);
}

public BlockPos getBlockPos() {
return machine.getBlockPos();
}

public Level getLevel() {
return machine.getLevel();
}

public boolean isRemote() {
return machine.isRemote();
}

public final boolean hasCapability(@Nullable Direction side) {
return capabilityValidator.test(side);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability;
import com.gregtechceu.gtceu.api.machine.MetaMachine;
import com.gregtechceu.gtceu.api.machine.TickableSubscription;
import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine;
import com.gregtechceu.gtceu.api.misc.EnergyContainerList;
import com.gregtechceu.gtceu.api.recipe.GTRecipe;
import com.gregtechceu.gtceu.api.recipe.ingredient.EnergyStack;
Expand Down Expand Up @@ -271,8 +270,10 @@ public long acceptEnergyFromNetwork(Direction side, long voltage, long amperage)
if (amps >= getInputAmperage()) return 0;
long canAccept = getEnergyCapacity() - getEnergyStored();
if (voltage > 0L && (side == null || inputsEnergy(side))) {
if (voltage > getInputVoltage() && machine instanceof IExplosionMachine explosionMachine) {
explosionMachine.doExplosion(GTUtil.getExplosionPower(voltage));
if (voltage > getInputVoltage()) {
var explodable = machine.getTraitHolder().getTrait(EnvironmentalExplosionTrait.TYPE);
if (explodable != null)
GTUtil.doExplosion(getLevel(), getBlockPos(), GTUtil.getExplosionPower(voltage));
return Math.min(amperage, getInputAmperage() - amps);
}
if (canAccept >= voltage) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,7 @@ public long acceptEnergyFromNetwork(@Nullable Direction side, long voltage, long

if (side == null || inputsEnergy(side)) {
if (voltage > getInputVoltage()) {
machine.doExplosion(GTUtil.getExplosionPower(voltage));
GTUtil.doExplosion(getLevel(), getBlockPos(), GTUtil.getExplosionPower(voltage));
return usedAmps;
}

Expand Down
Loading
Loading