package common.tileentities;
import static com.gtnewhorizon.structurelib.structure.StructureUtility.*;
import static common.itemBlocks.IB_LapotronicEnergyUnit.*;
import static gregtech.api.enums.GT_HatchElement.Maintenance;
import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
import static gregtech.api.util.GT_StructureUtility.filterByMTEClass;
import static java.lang.Math.min;
import com.github.bartimaeusnek.bartworks.API.BorosilicateGlass;
import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DynamoMulti;
import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DynamoTunnel;
import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_EnergyMulti;
import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_EnergyTunnel;
import com.google.common.collect.ImmutableList;
import com.gtnewhorizon.structurelib.StructureLibAPI;
import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
import com.gtnewhorizon.structurelib.alignment.constructable.ChannelDataAccessor;
import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
import com.gtnewhorizon.structurelib.structure.IItemSource;
import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
import com.gtnewhorizon.structurelib.structure.IStructureElement;
import com.gtnewhorizon.structurelib.structure.IStructureElement.PlaceResult;
import com.gtnewhorizon.structurelib.structure.StructureUtility;
import com.gtnewhorizon.structurelib.util.ItemStackPredicate.NBTMode;
import common.Blocks;
import gregtech.api.enums.Dyes;
import gregtech.api.enums.GT_Values;
import gregtech.api.enums.Textures.BlockIcons;
import gregtech.api.interfaces.IGlobalWirelessEnergy;
import gregtech.api.interfaces.IHatchElement;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.metatileentity.implementations.*;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
import gregtech.api.util.GT_Utility;
import gregtech.api.util.IGT_HatchAdder;
import java.math.BigInteger;
import java.text.NumberFormat;
import java.util.*;
import java.util.function.Consumer;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IChatComponent;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class GTMTE_LapotronicSuperCapacitor
extends GT_MetaTileEntity_EnhancedMultiBlockBase<GTMTE_LapotronicSuperCapacitor>
implements IGlobalWirelessEnergy, ISurvivalConstructable {
private enum TopState {
MayBeTop,
Top,
NotTop
}
private boolean wireless_mode = false;
private boolean not_processed_lsc = true;
private int counter = 1;
private final Queue<Long> energyInputValues = new LinkedList<>();
private final Queue<Long> energyOutputValues = new LinkedList<>();
private long max_passive_drain_eu_per_tick_per_uhv_cap = 1_000_000;
private long max_passive_drain_eu_per_tick_per_uev_cap = 100_000_000;
private enum Capacitor {
IV(2, BigInteger.valueOf(IV_cap_storage)),
LuV(3, BigInteger.valueOf(LuV_cap_storage)),
ZPM(4, BigInteger.valueOf(ZPM_cap_storage)),
UV(5, BigInteger.valueOf(UV_cap_storage)),
UHV(6, MAX_LONG),
None(0, BigInteger.ZERO),
EV(1, BigInteger.valueOf(EV_cap_storage)),
UEV(7, MAX_LONG),
;
private final int minimalGlassTier;
private final BigInteger providedCapacity;
static final Capacitor[] VALUES = values();
static final Capacitor[] VALUES_BY_TIER = Arrays.stream(values())
.sorted(Comparator.comparingInt(Capacitor::getMinimalGlassTier))
.toArray(Capacitor[]::new);
Capacitor(int minimalGlassTier, BigInteger providedCapacity) {
this.minimalGlassTier = minimalGlassTier;
this.providedCapacity = providedCapacity;
}
public int getMinimalGlassTier() {
return minimalGlassTier;
}
public BigInteger getProvidedCapacity() {
return providedCapacity;
}
public static int getIndexFromGlassTier(int glassTier) {
for (int index = 0; index < values().length; index++) {
if (values()[index].getMinimalGlassTier() == glassTier) {
return index;
}
}
return -1;
}
}
private static final String STRUCTURE_PIECE_BASE = "base";
private static final String STRUCTURE_PIECE_LAYER = "slice";
private static final String STRUCTURE_PIECE_TOP = "top";
private static final String STRUCTURE_PIECE_MID = "mid";
private static final int GLASS_TIER_UNSET = -2;