aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/common/tileentities/GTMTE_SpaceElevator.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/common/tileentities/GTMTE_SpaceElevator.java')
-rw-r--r--src/main/java/common/tileentities/GTMTE_SpaceElevator.java265
1 files changed, 265 insertions, 0 deletions
diff --git a/src/main/java/common/tileentities/GTMTE_SpaceElevator.java b/src/main/java/common/tileentities/GTMTE_SpaceElevator.java
new file mode 100644
index 0000000000..8f7827f4be
--- /dev/null
+++ b/src/main/java/common/tileentities/GTMTE_SpaceElevator.java
@@ -0,0 +1,265 @@
+package common.tileentities;
+
+import common.Blocks;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.GT_GUIContainer_MultiMachine;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase;
+import gregtech.api.objects.GT_RenderedTexture;
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+import org.lwjgl.input.Keyboard;
+import util.MultiBlockTooltipBuilder;
+import util.Vector3i;
+import util.Vector3ic;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+
+public class GTMTE_SpaceElevator extends GT_MetaTileEntity_MultiBlockBase {
+
+ private static final Block BASE_BLOCK = Blocks.spaceElevatorStructure;
+ private static final Block CAP_BLOCK = Blocks.spaceElevatorCapacitor;
+ private static final Block TETHER_BLOCK = Blocks.spaceElevatorTether;
+ private static final int BASE_META = 0;
+ private static final int COIL_HOLDER_META = 1;
+ private final static String glassNameBorosilicate = "BW_GlasBlocks";
+ private static final int HATCH_OVERLAY_ID = 16;
+
+ // Scan positions for capacitor banks
+ // Start with top left bank, clockwise
+ // Start with top middle pillar within bank, clockwise, middle last
+ private static final int[] bankOffsetsX = {-7, 5, 5, -7};
+ private static final int[] bankOffsetsY = {-7, -7, 5, 5};
+ private static final int[] scanOffsetsX = {1, 2, 1, 0, 1};
+ private static final int[] scanOffsetsY = {0, 1, 2, 1, 1};
+
+ private final HashSet<TE_SpaceElevatorCapacitor> capacitors = new HashSet<>();
+ private long lastLaunchEUCost = 0;
+
+ public GTMTE_SpaceElevator(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GTMTE_SpaceElevator(String aName) { super(aName); }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity var1) {
+ return new GTMTE_SpaceElevator((super.mName));
+ }
+
+ @Override
+ public String[] getDescription() {
+ final MultiBlockTooltipBuilder b = new MultiBlockTooltipBuilder();
+ b.addInfo("Access for your Space Station!")
+ .addInfo("Check out the wiki on my github if you are having trouble with the structure")
+ .addInfo("Regenerative Breaking will recover up to X% of the energy spent on launch")
+ .addInfo("Energy recovered depends on coil tier: +10% per coil tier, up to 90%")
+ .addSeparator()
+ .beginStructureBlock(15, 11, 15)
+ .addController("Bottom Center")
+ .addEnergyHatch("Instead of any casing in the bottom floor")
+ .addMaintenanceHatch("Instead of any casing in the bottom floor")
+ .addCasingInfo("Solid Steel Machine Casing", 320)
+ .addOtherStructurePart("Any EBF coil", "40x, have to be all the same")
+ .addOtherStructurePart("Space Elevator Tether", "4x")
+ .addOtherStructurePart("Space Elevator Cabin Block", "42x")
+ .addOtherStructurePart("Space Elevator Cabin Guide", "8x")
+ .signAndFinalize("Kekzdealer");
+ if(!Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) {
+ return b.getInformation();
+ } else {
+ return b.getStructureInformation();
+ }
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, byte aSide, byte aFacing, byte aColorIndex,
+ boolean aActive, boolean aRedstone) {
+ ITexture[] sTexture = new ITexture[]{new GT_RenderedTexture(Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS,
+ Dyes.getModulation(-1, Dyes._NULL.mRGBa))};
+ if (aSide == aFacing && aActive) {
+ sTexture = new ITexture[]{new GT_RenderedTexture(Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS_YELLOW,
+ Dyes.getModulation(-1, Dyes._NULL.mRGBa))};
+ }
+ return sTexture;
+ }
+
+ public Object getClientGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
+ return new GT_GUIContainer_MultiMachine(aPlayerInventory, aBaseMetaTileEntity, this.getLocalName(),
+ "MultiblockDisplay.png");
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack stack) {
+ return true;
+ }
+
+ @Override
+ public boolean checkRecipe(ItemStack stack) {
+ this.mProgresstime = 1;
+ this.mMaxProgresstime = 1;
+ this.mEUt = 0;
+ this.mEfficiencyIncrease = 10000;
+ return true;
+ }
+
+ public Vector3ic rotateOffsetVector(Vector3ic forgeDirection, int x, int y, int z) {
+ final Vector3i offset = new Vector3i(0, 0, 0);
+ // either direction on y-axis
+ if (forgeDirection.y() == -1) {
+ offset.x = x;
+ offset.y = z;
+ offset.z = y;
+ }
+
+ return offset;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity thisController, ItemStack guiSlotItem) {
+ // Make sure the controller is either facing up or down
+ if(thisController.getFrontFacing() > 1) {
+ return false;
+ }
+
+ // Figure out the vector for the direction the back face of the controller is facing
+ final Vector3ic forgeDirection = new Vector3i(
+ ForgeDirection.getOrientation(thisController.getBackFacing()).offsetX,
+ ForgeDirection.getOrientation(thisController.getBackFacing()).offsetY,
+ ForgeDirection.getOrientation(thisController.getBackFacing()).offsetZ
+ );
+ boolean formationChecklist = true;
+ int minCasingAmount = 320;
+ int firstCoilMeta = -1;
+
+ // Base floor
+ for(int X = -7; X <= 7; X++){
+ for(int Y = -7; Y <= 7; Y++){
+ if(X == 0 && Y == 0){
+ continue; // Skip controller
+ }
+
+ final Vector3ic offset = rotateOffsetVector(forgeDirection, X, Y, 0);
+ final IGregTechTileEntity currentTE =
+ thisController.getIGregTechTileEntityOffset(offset.x(), offset.y(), offset.z());
+
+ // Tries to add TE as either of those kinds of hatches.
+ // The number is the texture index number for the texture that needs to be painted over the hatch texture
+ if ( !super.addMaintenanceToMachineList(currentTE, HATCH_OVERLAY_ID)
+ && !this.addEnergyInputToMachineList(currentTE, HATCH_OVERLAY_ID)) {
+
+ // If it's not a hatch, is it the right casing for this machine? Check block and block meta.
+ if ((thisController.getBlockOffset(offset.x(), offset.y(), offset.z()) == BASE_BLOCK)
+ && (thisController.getMetaIDOffset(offset.x(), offset.y(), offset.z()) == BASE_META)) {
+ // Seems to be valid casing. Decrement counter.
+ minCasingAmount--;
+ } else {
+ formationChecklist = false;
+ }
+ }
+ }
+ }
+ System.out.println("");
+ // Capacitor banks
+ for(int bank = 0; bank < 4; bank++) {
+ for(int Z = 1; Z <= 5; Z++) {
+ for(int scan = 0; scan < 5; scan++){
+ final Vector3ic offset = rotateOffsetVector(forgeDirection,
+ bankOffsetsX[bank] + scanOffsetsX[scan],
+ bankOffsetsY[bank] + scanOffsetsY[scan],
+ Z);
+ if(Z == 1 || Z == 5) {
+ // Check for casings
+ if(thisController.getBlockOffset(offset.x(), offset.y(), offset.z()) == BASE_BLOCK
+ && thisController.getMetaIDOffset(offset.x(), offset.y(), offset.z()) == BASE_META) {
+ minCasingAmount--;
+ } else {
+ formationChecklist = false;
+ }
+ } else {
+ if(scan == 4){
+ // Check for capacitors
+ final TileEntity te = thisController.getTileEntityOffset(offset.x(), offset.y(), offset.z());
+ if(thisController.getBlockOffset(offset.x(), offset.y(), offset.z()) == CAP_BLOCK
+ && te instanceof TE_SpaceElevatorCapacitor) {
+ capacitors.add((TE_SpaceElevatorCapacitor) te);
+ } else {
+ formationChecklist = false;
+ }
+ } else {
+ // Check for Glass
+ if(!thisController.getBlockOffset(offset.x(), offset.y(), offset.z()).getUnlocalizedName().equals(glassNameBorosilicate)) {
+ formationChecklist = false;
+ }
+ }
+ }
+ }
+ }
+ }
+ // Anchor
+
+ // Coil holders
+
+ // Coils
+
+ if(minCasingAmount > 0) {
+ formationChecklist = false;
+ }
+
+ return formationChecklist;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ final ArrayList<String> ll = new ArrayList<>();
+ ll.add(EnumChatFormatting.YELLOW + "Operational Data:" + EnumChatFormatting.RESET);
+
+ ll.add("Maintenance Status: " + ((super.getRepairStatus() == super.getIdealStatus())
+ ? EnumChatFormatting.GREEN + "Working perfectly" + EnumChatFormatting.RESET
+ : EnumChatFormatting.RED + "Has Problems" + EnumChatFormatting.RESET));
+ ll.add("---------------------------------------------");
+
+ final String[] a = new String[ll.size()];
+ return ll.toArray(a);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound nbt) {
+ nbt = (nbt == null) ? new NBTTagCompound() : nbt;
+
+ super.saveNBTData(nbt);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound nbt) {
+ nbt = (nbt == null) ? new NBTTagCompound() : nbt;
+
+ super.loadNBTData(nbt);
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack stack) { return 10000; }
+
+ @Override
+ public int getPollutionPerTick(ItemStack stack) { return 0; }
+
+ @Override
+ public int getDamageToComponent(ItemStack stack) { return 0; }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack stack) { return false; }
+}