diff --git a/dependencies.gradle b/dependencies.gradle index 406d4f288..9e2ff3e98 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -2,10 +2,9 @@ dependencies { shadowImplementation('com.github.GTNewHorizons:AVRcore:master-SNAPSHOT') - - compile('com.github.GTNewHorizons:GT5-Unofficial:5.09.40.100-pre:dev') + compile('com.github.GTNewHorizons:GT5-Unofficial:5.09.41.00:dev') compile('com.github.GTNewHorizons:Yamcl:0.5.82:dev') - compile('com.github.GTNewHorizons:NotEnoughItems:2.2.20-GTNH:dev') + compile('com.github.GTNewHorizons:NotEnoughItems:2.2.22:dev') compile('com.github.GTNewHorizons:CodeChickenLib:1.1.5.3:dev') compile('com.github.GTNewHorizons:CodeChickenCore:1.1.4:dev') compile('com.github.GTNewHorizons:StructureLib:1.1.3:dev') @@ -13,7 +12,7 @@ dependencies { compileOnly('com.github.GTNewHorizons:OpenModularTurrets:2.2.11-247:dev') {transitive=false} compileOnly('com.github.GTNewHorizons:OpenComputers:1.7.5.23-GTNH:dev') {transitive=false} - compileOnly('com.github.GTNewHorizons:GTplusplus:1.7.65-pre:dev') {transitive=false} + compileOnly('com.github.GTNewHorizons:GTplusplus:1.7.71:dev') {transitive=false} compileOnly('com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-94-GTNH:dev') {transitive=false} compileOnly('curse.maven:cofh-lib-220333:2388748') {transitive=false} diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_computer.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_computer.java index 16fcf2618..49d97e1e7 100644 --- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_computer.java +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_computer.java @@ -10,11 +10,14 @@ import com.github.technus.tectech.util.CommonValues; import com.github.technus.tectech.util.TT_Utility; import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IItemSource; import com.gtnewhorizon.structurelib.structure.IStructureDefinition; import com.gtnewhorizon.structurelib.util.Vec3Impl; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IHatchElement; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; @@ -22,12 +25,16 @@ import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase; import gregtech.api.util.GT_Multiblock_Tooltip_Builder; +import gregtech.api.util.IGT_HatchAdder; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.textureOffset; import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage; @@ -36,6 +43,7 @@ import static com.github.technus.tectech.util.CommonValues.MULTI_CHECK_AT; import static com.github.technus.tectech.util.CommonValues.V; import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; import static gregtech.api.util.GT_StructureUtility.ofHatchAdderOptional; import static net.minecraft.util.StatCollector.translateToLocal; @@ -43,7 +51,7 @@ /** * Created by danie_000 on 17.12.2016. */ -public class GT_MetaTileEntity_EM_computer extends GT_MetaTileEntity_MultiblockBase_EM implements IConstructable { +public class GT_MetaTileEntity_EM_computer extends GT_MetaTileEntity_MultiblockBase_EM implements ISurvivalConstructable { //region variables private final ArrayList eRacks = new ArrayList<>(); @@ -87,8 +95,11 @@ public class GT_MetaTileEntity_EM_computer extends GT_MetaTileEntity_MultiblockB .addElement('B', ofBlock(sBlockCasingsTT, 1)) .addElement('C', ofBlock(sBlockCasingsTT, 2)) .addElement('D', ofBlock(sBlockCasingsTT, 3)) - .addElement('A', ofHatchAdderOptional(GT_MetaTileEntity_EM_computer::addToMachineList, textureOffset + 1, 1, sBlockCasingsTT, 1)) - .addElement('E', ofHatchAdderOptional(GT_MetaTileEntity_EM_computer::addRackToMachineList, textureOffset + 3, 2, sBlockCasingsTT, 3)) + .addElement('A', classicHatches(textureOffset + 1, 1, sBlockCasingsTT, 1)) + .addElement('E', ofChain( + RackHatchElement.INSTANCE.newAny(textureOffset + 3, 2), + ofBlock(sBlockCasingsTT, 3) + )) .build(); //endregion @@ -406,6 +417,25 @@ public void construct(ItemStack stackSize, boolean hintsOnly) { structureBuild_EM("back", 1, 2, offset, stackSize, hintsOnly); } + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) { + if (mMachine) return -1; + int built; + built = survivialBuildPiece("front", stackSize, 1, 2, 0, elementBudget, source, actor, false, true); + if (built >= 0) return built; + built = survivialBuildPiece("cap", stackSize, 1, 2, -1, elementBudget, source, actor, false, true); + if (built >= 0) return built; + + byte offset = -2; + for (int rackSlices = Math.min(stackSize.stackSize, 12); rackSlices > 0; rackSlices--) { + built = survivialBuildPiece("slice", stackSize, 1, 2, offset--, elementBudget, source, actor, false, true); + if (built >= 0) return built; + } + built = survivialBuildPiece("cap", stackSize, 1, 2, offset--, elementBudget, source, actor, false, true); + if (built >= 0) return built; + return survivialBuildPiece("back", stackSize, 1, 2, offset, elementBudget, source, actor, false, true); + } + @Override public IStructureDefinition getStructure_EM() { return STRUCTURE_DEFINITION; @@ -415,4 +445,23 @@ public IStructureDefinition getStructure_EM() { public String[] getStructureDescription(ItemStack stackSize) { return description; } + + private enum RackHatchElement implements IHatchElement { + INSTANCE; + + @Override + public List> mteClasses() { + return Collections.singletonList(GT_MetaTileEntity_Hatch_Rack.class); + } + + @Override + public IGT_HatchAdder adder() { + return GT_MetaTileEntity_EM_computer::addRackToMachineList; + } + + @Override + public long count(GT_MetaTileEntity_EM_computer t) { + return t.eRacks.size(); + } + } } diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_dataBank.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_dataBank.java index 00efac082..48aabf8da 100644 --- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_dataBank.java +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_dataBank.java @@ -10,16 +10,21 @@ import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture; import com.github.technus.tectech.util.CommonValues; import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IItemSource; import com.gtnewhorizon.structurelib.structure.IStructureDefinition; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import gregtech.api.enums.Textures; +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.GT_MetaTileEntity_Hatch; import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_DataAccess; import gregtech.api.util.GT_Multiblock_Tooltip_Builder; +import gregtech.api.util.IGT_HatchAdder; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; @@ -27,6 +32,9 @@ import net.minecraft.util.ResourceLocation; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; import static com.github.technus.tectech.recipe.TT_recipeAdder.nullItem; import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.textureOffset; @@ -35,10 +43,10 @@ import static com.github.technus.tectech.util.CommonValues.V; import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; -import static gregtech.api.util.GT_StructureUtility.ofHatchAdderOptional; +import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; import static net.minecraft.util.StatCollector.translateToLocal; -public class GT_MetaTileEntity_EM_dataBank extends GT_MetaTileEntity_MultiblockBase_EM implements IConstructable { +public class GT_MetaTileEntity_EM_dataBank extends GT_MetaTileEntity_MultiblockBase_EM implements ISurvivalConstructable { //region variables private final ArrayList eStacksDataOutputs = new ArrayList<>(); private final ArrayList eDataAccessHatches = new ArrayList<>(); @@ -61,8 +69,15 @@ public class GT_MetaTileEntity_EM_dataBank extends GT_MetaTileEntity_MultiblockB })) .addElement('A', ofBlock(sBlockCasingsTT, 1)) .addElement('B', ofBlock(sBlockCasingsTT, 2)) - .addElement('C', ofHatchAdderOptional(GT_MetaTileEntity_EM_dataBank::addClassicToMachineList, textureOffset, 1, sBlockCasingsTT, 0)) - .addElement('D', ofHatchAdderOptional(GT_MetaTileEntity_EM_dataBank::addDataBankHatchToMachineList, textureOffset + 1, 2, sBlockCasingsTT, 1)) + .addElement('C', classicHatches(textureOffset, 1, sBlockCasingsTT, 0)) + .addElement('D', buildHatchAdder(GT_MetaTileEntity_EM_dataBank.class) + .atLeast(DataBankHatches.OutboundConnector, DataBankHatches.InboundConnector) + .casingIndex(textureOffset + 1) + .dot(2) + .buildAndChain( + DataBankHatches.DataStick.newAny(textureOffset + 1, 2), + ofBlock(sBlockCasingsTT, 1) + )) .build(); //endregion @@ -194,6 +209,12 @@ public void construct(ItemStack stackSize, boolean hintsOnly) { structureBuild_EM("main", 2, 1, 0, stackSize, hintsOnly); } + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) { + if (mMachine) return -1; + return survivialBuildPiece("main", stackSize, 2, 1, 0, elementBudget, source, actor, false, true); + } + @Override public IStructureDefinition getStructure_EM() { return STRUCTURE_DEFINITION; @@ -203,4 +224,42 @@ public IStructureDefinition getStructure_EM() { public String[] getStructureDescription(ItemStack stackSize) { return description; } + + private enum DataBankHatches implements IHatchElement { + DataStick(GT_MetaTileEntity_Hatch_DataAccess.class) { + @Override + public long count(GT_MetaTileEntity_EM_dataBank t) { + return t.eDataAccessHatches.size(); + } + }, + OutboundConnector(GT_MetaTileEntity_Hatch_OutputDataItems.class) { + @Override + public long count(GT_MetaTileEntity_EM_dataBank t) { + return t.eStacksDataOutputs.size(); + } + }, + InboundConnector(GT_MetaTileEntity_Hatch_InputDataItems.class) { + @Override + public long count(GT_MetaTileEntity_EM_dataBank t) { + return t.eDataAccessHatches.size(); + } + }; + + private final List> mteClasses; + + @SafeVarargs + DataBankHatches(Class... mteClasses) { + this.mteClasses = Collections.unmodifiableList(Arrays.asList(mteClasses)); + } + + @Override + public List> mteClasses() { + return mteClasses; + } + + @Override + public IGT_HatchAdder adder() { + return GT_MetaTileEntity_EM_dataBank::addDataBankHatchToMachineList; + } + } } diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_research.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_research.java index 744d79779..ca26b3578 100644 --- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_research.java +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_research.java @@ -7,10 +7,13 @@ import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture; import com.github.technus.tectech.util.CommonValues; import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IItemSource; import com.gtnewhorizon.structurelib.structure.IStructureDefinition; import cpw.mods.fml.common.registry.GameRegistry; import gregtech.api.enums.ItemList; import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IHatchElement; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; @@ -18,10 +21,7 @@ import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy; import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase; -import gregtech.api.util.GT_LanguageManager; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.*; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; @@ -32,18 +32,24 @@ import org.apache.commons.lang3.reflect.FieldUtils; import java.util.ArrayList; +import java.util.Collections; import java.util.LinkedHashMap; +import java.util.List; import static com.github.technus.tectech.recipe.TT_recipe.E_RECIPE_ID; import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.textureOffset; import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage; import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsTT; import static com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_crafting.crafter; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM.HatchElement.DynamoMulti; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM.HatchElement.EnergyMulti; import static com.github.technus.tectech.thing.metaTileEntity.multi.em_machine.GT_MetaTileEntity_EM_machine.machine; import static com.github.technus.tectech.util.CommonValues.V; import static com.github.technus.tectech.util.CommonValues.VN; import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.enums.GT_HatchElement.*; +import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; import static gregtech.api.util.GT_StructureUtility.ofHatchAdder; import static gregtech.api.util.GT_StructureUtility.ofHatchAdderOptional; import static net.minecraft.util.StatCollector.translateToLocal; @@ -52,7 +58,7 @@ /** * Created by danie_000 on 17.12.2016. */ -public class GT_MetaTileEntity_EM_research extends GT_MetaTileEntity_MultiblockBase_EM implements IConstructable { +public class GT_MetaTileEntity_EM_research extends GT_MetaTileEntity_MultiblockBase_EM implements ISurvivalConstructable { //region variables private final ArrayList eHolders = new ArrayList<>(); private GT_Recipe.GT_Recipe_AssemblyLine tRecipe; @@ -88,8 +94,8 @@ public class GT_MetaTileEntity_EM_research extends GT_MetaTileEntity_MultiblockB .addElement('A', ofBlock(sBlockCasingsTT, 1)) .addElement('B', ofBlock(sBlockCasingsTT, 2)) .addElement('C', ofBlock(sBlockCasingsTT, 3)) - .addElement('D', ofHatchAdderOptional(GT_MetaTileEntity_EM_research::addClassicToMachineList, textureOffset + 1, 1, sBlockCasingsTT, 1)) - .addElement('E', ofHatchAdder(GT_MetaTileEntity_EM_research::addHolderToMachineList, 3, 2)) + .addElement('D', classicHatches(textureOffset + 1, 1, sBlockCasingsTT, 1)) + .addElement('E', HolderHatchElement.INSTANCE.newAny(3, 2)) .build(); //endregion @@ -583,6 +589,12 @@ public void construct(ItemStack stackSize, boolean hintsOnly) { structureBuild_EM("main", 1, 3, 4, stackSize, hintsOnly); } + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) { + if (mMachine) return -1; + return survivialBuildPiece("main", stackSize, 1, 3, 4, elementBudget, source, actor, false, true); + } + @Override public IStructureDefinition getStructure_EM() { return STRUCTURE_DEFINITION; @@ -592,4 +604,23 @@ public IStructureDefinition getStructure_EM() { public String[] getStructureDescription(ItemStack stackSize) { return description; } + + private enum HolderHatchElement implements IHatchElement { + INSTANCE; + + @Override + public List> mteClasses() { + return Collections.singletonList(GT_MetaTileEntity_Hatch_Holder.class); + } + + @Override + public IGT_HatchAdder adder() { + return GT_MetaTileEntity_EM_research::addHolderToMachineList; + } + + @Override + public long count(GT_MetaTileEntity_EM_research t) { + return t.eHolders.size(); + } + } } diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_transformer.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_transformer.java index c2fe22e88..251765ce0 100644 --- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_transformer.java +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_transformer.java @@ -7,6 +7,8 @@ import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture; import com.github.technus.tectech.util.CommonValues; import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IItemSource; import com.gtnewhorizon.structurelib.structure.IStructureDefinition; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -15,6 +17,7 @@ import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.util.GT_Multiblock_Tooltip_Builder; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; @@ -23,15 +26,20 @@ import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.textureOffset; import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage; import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsTT; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM.HatchElement.DynamoMulti; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM.HatchElement.EnergyMulti; import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; import static gregtech.api.GregTech_API.sBlockCasings1; +import static gregtech.api.enums.GT_HatchElement.Dynamo; +import static gregtech.api.enums.GT_HatchElement.Energy; +import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; import static gregtech.api.util.GT_StructureUtility.ofHatchAdder; import static net.minecraft.util.StatCollector.translateToLocal; /** * Created by danie_000 on 17.12.2016. */ -public class GT_MetaTileEntity_EM_transformer extends GT_MetaTileEntity_MultiblockBase_EM implements IConstructable { +public class GT_MetaTileEntity_EM_transformer extends GT_MetaTileEntity_MultiblockBase_EM implements ISurvivalConstructable { //region structure private static final String[] description = new String[]{ EnumChatFormatting.AQUA + translateToLocal("tt.keyphrase.Hint_Details") + ":", @@ -45,10 +53,11 @@ public class GT_MetaTileEntity_EM_transformer extends GT_MetaTileEntity_Multiblo {"111", "111", "111",}, }) .addElement('0', ofBlock(sBlockCasings1, 15)) - .addElement('1', ofChain( - ofHatchAdder(GT_MetaTileEntity_EM_transformer::addEnergyIOToMachineList, textureOffset, 1), - onElementPass(t -> t.casingCount++, ofBlock(sBlockCasingsTT, 0)) - )) + .addElement('1', buildHatchAdder(GT_MetaTileEntity_EM_transformer.class) + .atLeast(Energy, EnergyMulti, Dynamo, DynamoMulti) + .casingIndex(textureOffset) + .dot(1) + .buildAndChain(onElementPass(t -> t.casingCount++, ofBlock(sBlockCasingsTT, 0)))) .build(); private int casingCount = 0; @@ -172,6 +181,12 @@ public void construct(ItemStack stackSize, boolean hintsOnly) { structureBuild_EM("main", 1, 1, 0, stackSize, hintsOnly); } + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) { + if (mMachine) return -1; + return survivialBuildPiece("main", stackSize, 1, 1, 0, elementBudget, source, actor, false, true); + } + @Override public String[] getStructureDescription(ItemStack stackSize) { return description; diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_TM_teslaCoil.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_TM_teslaCoil.java index c62568679..721987fe9 100644 --- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_TM_teslaCoil.java +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_TM_teslaCoil.java @@ -18,40 +18,67 @@ import com.github.technus.tectech.util.CommonValues; import com.google.common.collect.Multimap; import com.google.common.collect.MultimapBuilder; -import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable; +import com.gtnewhorizon.structurelib.StructureLibAPI; +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.StructureUtility; +import com.gtnewhorizon.structurelib.util.ItemStackPredicate; import com.gtnewhorizon.structurelib.util.Vec3Impl; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; import gregtech.api.enums.Textures; +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.BaseMetaPipeEntity; import gregtech.api.metatileentity.implementations.*; import gregtech.api.util.GT_Multiblock_Tooltip_Builder; +import gregtech.api.util.GT_OreDictUnificator; +import gregtech.api.util.GT_Utility; +import gregtech.api.util.IGT_HatchAdder; +import gregtech.common.blocks.GT_Item_Machines; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Items; +import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; import net.minecraftforge.fluids.FluidStack; +import org.apache.commons.lang3.tuple.Pair; -import java.util.ArrayList; -import java.util.HashSet; +import java.util.*; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import static com.github.technus.tectech.mechanics.tesla.ITeslaConnectable.TeslaUtil.*; import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.textureOffset; import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage; import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsBA0; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM.HatchElement.DynamoMulti; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM.HatchElement.EnergyMulti; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM.HatchElement.Param; import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.*; import static com.github.technus.tectech.util.CommonValues.V; import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; +import static gregtech.api.enums.GT_HatchElement.*; +import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; import static gregtech.api.util.GT_StructureUtility.ofHatchAdder; import static gregtech.api.util.GT_StructureUtility.ofHatchAdderOptional; import static java.lang.Math.min; import static net.minecraft.util.StatCollector.translateToLocal; -public class GT_MetaTileEntity_TM_teslaCoil extends GT_MetaTileEntity_MultiblockBase_EM implements IConstructable, ITeslaConnectable { +public class GT_MetaTileEntity_TM_teslaCoil extends GT_MetaTileEntity_MultiblockBase_EM implements ISurvivalConstructable, ITeslaConnectable { //Interface fields private final Multimap teslaNodeMap = MultimapBuilder.treeKeys().linkedListValues().build(); private final HashSet sparkList = new HashSet<>(); @@ -131,15 +158,59 @@ public class GT_MetaTileEntity_TM_teslaCoil extends GT_MetaTileEntity_Multiblock .addElement('A', ofBlock(sBlockCasingsBA0, 6)) .addElement('B', ofBlock(sBlockCasingsBA0, 7)) .addElement('C', ofBlock(sBlockCasingsBA0, 8)) - .addElement('D', defer(t -> ofBlock(sBlockCasingsBA0, t.getCoilWindingMeta()))) - .addElement('E', ofHatchAdderOptional(GT_MetaTileEntity_TM_teslaCoil::addCapacitorToMachineList, textureOffset + 16 + 6, 1, sBlockCasingsBA0, 6)) - .addElement('F', ofHatchAdder(GT_MetaTileEntity_TM_teslaCoil::addFrameToMachineList, 0, 2)) - .build(); + .addElement('D', ofBlocksTiered( + (block, meta) -> block != sBlockCasingsBA0 ? -1 : meta <= 5 ? meta : meta == 9 ? 6 : -1, + IntStream.range(0, 6).map(tier -> tier == 5 ? 9 : tier).mapToObj(meta -> Pair.of(sBlockCasingsBA0, meta)).collect(Collectors.toList()), + -1, + (t, v) -> t.mTier = v, + t -> t.mTier)) + .addElement('E', buildHatchAdder(GT_MetaTileEntity_TM_teslaCoil.class) + .atLeast(CapacitorHatchElement.INSTANCE, EnergyMulti, Energy, DynamoMulti, Dynamo, InputHatch, OutputHatch, Param, Maintenance) + .dot(1) + .casingIndex(textureOffset + 16 +6) + .buildAndChain(sBlockCasingsBA0, 6)) + .addElement('F', new IStructureElement() { + private IIcon[] mIcons; + + @Override + public boolean check(GT_MetaTileEntity_TM_teslaCoil t, World world, int x, int y, int z) { + TileEntity tBase = world.getTileEntity(x, y, z); + if (tBase instanceof BaseMetaPipeEntity) { + BaseMetaPipeEntity tPipeBase = (BaseMetaPipeEntity) tBase; + if (tPipeBase.isInvalidTileEntity()) return false; + return tPipeBase.getMetaTileEntity() instanceof GT_MetaPipeEntity_Frame; + } + return false; + } - public int getCoilWindingMeta() { - Vec3Impl xyzOffsets = getExtendedFacing().getWorldOffset(new Vec3Impl(0, -1, 1)); - return this.getBaseMetaTileEntity().getMetaIDOffset(xyzOffsets.get0(), xyzOffsets.get1(), xyzOffsets.get2()); - } + @Override + public boolean spawnHint(GT_MetaTileEntity_TM_teslaCoil t, World world, int x, int y, int z, ItemStack trigger) { + if (mIcons == null) { + mIcons = new IIcon[6]; + Arrays.fill(mIcons, Materials._NULL.mIconSet.mTextures[OrePrefixes.frameGt.mTextureIndex].getIcon()); + } + StructureLibAPI.hintParticleTinted(world, x, y, z, mIcons, Materials._NULL.mRGBa); + return true; + } + + @Override + public boolean placeBlock(GT_MetaTileEntity_TM_teslaCoil t, World world, int x, int y, int z, ItemStack trigger) { + ItemStack tFrameStack = GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Titanium, 1); + if (!GT_Utility.isStackValid(tFrameStack) || !(tFrameStack.getItem() instanceof ItemBlock)) + return false; + ItemBlock tFrameStackItem = (ItemBlock) tFrameStack.getItem(); + return tFrameStackItem.placeBlockAt(tFrameStack, null, world, x, y, z, 6, 0, 0, 0, Items.feather.getDamage(tFrameStack)); + } + + @Override + public PlaceResult survivalPlaceBlock(GT_MetaTileEntity_TM_teslaCoil t, World world, int x, int y, int z, ItemStack trigger, IItemSource source, EntityPlayerMP actor, Consumer chatter) { + if (check(t, world, x, y, z)) return PlaceResult.SKIP; + ItemStack tFrameStack = source.takeOne(s -> GT_Item_Machines.getMetaTileEntity(s) instanceof GT_MetaPipeEntity_Frame, true); + if (tFrameStack == null) return PlaceResult.REJECT; + return StructureUtility.survivalPlaceBlock(tFrameStack, ItemStackPredicate.NBTMode.IGNORE_KNOWN_INSIGNIFICANT_TAGS, null, false, world, x, y, z, source, actor, chatter); + } + }) + .build(); //endregion //region parameters @@ -346,22 +417,17 @@ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { @Override public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) { for (GT_MetaTileEntity_Hatch_Capacitor cap : eCapacitorHatches) { - if (GT_MetaTileEntity_MultiBlockBase.isValidMetaTileEntity(cap)) { + if (isValidMetaTileEntity(cap)) { cap.getBaseMetaTileEntity().setActive(false); } } eCapacitorHatches.clear(); - Vec3Impl xyzOffsets; - xyzOffsets = getExtendedFacing().getWorldOffset(new Vec3Impl(0, -1, 1)); - mTier = iGregTechTileEntity.getMetaIDOffset(xyzOffsets.get0(), xyzOffsets.get1(), xyzOffsets.get2()); - if (mTier == 9) { - mTier = 6; - }//Hacky remap because the ZPM coils were added later + mTier = -1; if (structureCheck_EM("main", 3, 16, 0)) { for (GT_MetaTileEntity_Hatch_Capacitor cap : eCapacitorHatches) { - if (GT_MetaTileEntity_MultiBlockBase.isValidMetaTileEntity(cap)) { + if (isValidMetaTileEntity(cap)) { cap.getBaseMetaTileEntity().setActive(iGregTechTileEntity.isActive()); } } @@ -714,6 +780,12 @@ public void construct(ItemStack stackSize, boolean hintsOnly) { structureBuild_EM("main", 3, 16, 0, stackSize, hintsOnly); } + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) { + if (mMachine) return -1; + return survivialBuildPiece("main", stackSize, 3, 16, 0, elementBudget, source, actor, false, true); + } + @Override public String[] getStructureDescription(ItemStack stackSize) { return description; @@ -812,4 +884,23 @@ public boolean teslaInjectEnergy(long teslaVoltageInjected) { } return false; } + + private enum CapacitorHatchElement implements IHatchElement { + INSTANCE; + + @Override + public List> mteClasses() { + return Collections.singletonList(GT_MetaTileEntity_Hatch_Capacitor.class); + } + + @Override + public IGT_HatchAdder adder() { + return GT_MetaTileEntity_TM_teslaCoil::addCapacitorToMachineList; + } + + @Override + public long count(GT_MetaTileEntity_TM_teslaCoil gt_metaTileEntity_tm_teslaCoil) { + return gt_metaTileEntity_tm_teslaCoil.eCapacitorHatches.size(); + } + } } diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/GT_MetaTileEntity_MultiblockBase_EM.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/GT_MetaTileEntity_MultiblockBase_EM.java index 45bd9d39d..86ca00d80 100644 --- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/GT_MetaTileEntity_MultiblockBase_EM.java +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/GT_MetaTileEntity_MultiblockBase_EM.java @@ -16,25 +16,29 @@ import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing; import com.gtnewhorizon.structurelib.alignment.enumerable.Flip; import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation; +import com.gtnewhorizon.structurelib.structure.IItemSource; import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.IStructureElement; import com.gtnewhorizon.structurelib.util.Vec3Impl; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import gregtech.api.enums.Textures; +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.BaseTileEntity; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.implementations.*; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Recipe; -import gregtech.api.util.GT_Utility; +import gregtech.api.util.*; import gregtech.common.GT_Pollution; +import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.EntityPlayer; + import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -44,6 +48,9 @@ import net.minecraftforge.fluids.FluidStack; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; import static com.github.technus.tectech.loader.TecTechConfig.DEBUG_MODE; import static com.github.technus.tectech.loader.TecTechConfig.POWERLESS_MODE; @@ -51,6 +58,7 @@ import static com.github.technus.tectech.util.CommonValues.*; import static com.github.technus.tectech.util.DoubleCount.div; import static com.github.technus.tectech.util.TT_Utility.getTier; +import static gregtech.api.enums.GT_HatchElement.*; import static java.lang.Math.min; /** @@ -241,6 +249,17 @@ public final boolean structureBuild_EM(String piece, int horizontalOffset, int v getExtendedFacing(), baseMetaTileEntity.getXCoord(), baseMetaTileEntity.getYCoord(), baseMetaTileEntity.getZCoord(), horizontalOffset, verticalOffset, depthOffset, hintsOnly); } + + protected final int survivialBuildPiece(String piece, ItemStack trigger, int horizontalOffset, int verticalOffset, int depthOffset, int elementsBudget, IItemSource source, EntityPlayerMP actor, boolean check) { + final IGregTechTileEntity tTile = getBaseMetaTileEntity(); + return getStructure_EM_Internal().survivalBuild(this, trigger, piece, tTile.getWorld(), getExtendedFacing(), tTile.getXCoord(), tTile.getYCoord(), tTile.getZCoord(), horizontalOffset, verticalOffset, depthOffset, elementsBudget, source, actor, check); + } + + protected final int survivialBuildPiece(String piece, ItemStack trigger, int horizontalOffset, int verticalOffset, int depthOffset, int elementsBudget, IItemSource source, EntityPlayerMP actor, boolean check, boolean checkIfPlaced) { + int built = survivialBuildPiece(piece, trigger, horizontalOffset, verticalOffset, depthOffset, elementsBudget, source, actor, check); + if (checkIfPlaced && built > 0) checkStructure(true, getBaseMetaTileEntity()); + return built; + } //endregion //region METHODS TO OVERRIDE - general functionality, recipe check, output @@ -2588,4 +2607,95 @@ public final boolean addDataConnectorToMachineList(IGregTechTileEntity aTileEnti return false; } //endregion + + protected static IStructureElement classicHatches(int casingIndex, int dot, Block casingBlock, int casingMeta) { + return GT_HatchElementBuilder.builder() + .atLeast(InputBus, InputHatch, OutputHatch, OutputBus, Maintenance, Muffler, HatchElement.EnergyMulti, HatchElement.DynamoMulti, HatchElement.InputData, HatchElement.OutputData, HatchElement.Uncertainty) + .casingIndex(casingIndex) + .dot(dot) + .buildAndChain(casingBlock, casingMeta); + } + + protected static IStructureElement allHatches(int casingIndex, int dot, Block casingBlock, int casingMeta) { + return GT_HatchElementBuilder.builder() + .atLeast(InputBus, InputHatch, OutputHatch, OutputBus, Maintenance, Muffler, HatchElement.EnergyMulti, HatchElement.DynamoMulti, HatchElement.InputData, HatchElement.OutputData, HatchElement.Uncertainty, HatchElement.InputElemental, HatchElement.OutputElemental, HatchElement.OverflowElemental) + .casingIndex(casingIndex) + .dot(dot) + .buildAndChain(casingBlock, casingMeta); + } + + public enum HatchElement implements IHatchElement { + InputElemental(GT_MetaTileEntity_MultiblockBase_EM::addElementalInputToMachineList, GT_MetaTileEntity_Hatch_InputElemental.class) { + @Override + public long count(GT_MetaTileEntity_MultiblockBase_EM t) { + return t.eInputHatches.size(); + } + }, + OutputElemental(GT_MetaTileEntity_MultiblockBase_EM::addElementalOutputToMachineList, GT_MetaTileEntity_Hatch_OutputElemental.class) { + @Override + public long count(GT_MetaTileEntity_MultiblockBase_EM t) { + return t.eOutputHatches.size(); + } + }, + OverflowElemental(GT_MetaTileEntity_MultiblockBase_EM::addElementalMufflerToMachineList, GT_MetaTileEntity_Hatch_OverflowElemental.class) { + @Override + public long count(GT_MetaTileEntity_MultiblockBase_EM t) { + return t.eMufflerHatches.size(); + } + }, + Param(GT_MetaTileEntity_MultiblockBase_EM::addParametrizerToMachineList, GT_MetaTileEntity_Hatch_Param.class) { + @Override + public long count(GT_MetaTileEntity_MultiblockBase_EM t) { + return t.eParamHatches.size(); + } + }, + Uncertainty(GT_MetaTileEntity_MultiblockBase_EM::addUncertainToMachineList, GT_MetaTileEntity_Hatch_Uncertainty.class) { + @Override + public long count(GT_MetaTileEntity_MultiblockBase_EM t) { + return t.eUncertainHatches.size(); + } + }, + EnergyMulti(GT_MetaTileEntity_MultiblockBase_EM::addEnergyInputToMachineList, GT_MetaTileEntity_Hatch_EnergyMulti.class) { + @Override + public long count(GT_MetaTileEntity_MultiblockBase_EM t) { + return t.eEnergyMulti.size(); + } + }, + DynamoMulti(GT_MetaTileEntity_MultiblockBase_EM::addDynamoToMachineList, GT_MetaTileEntity_Hatch_DynamoMulti.class) { + @Override + public long count(GT_MetaTileEntity_MultiblockBase_EM t) { + return t.eDynamoMulti.size(); + } + }, + InputData(GT_MetaTileEntity_MultiblockBase_EM::addDataConnectorToMachineList, GT_MetaTileEntity_Hatch_InputData.class) { + @Override + public long count(GT_MetaTileEntity_MultiblockBase_EM t) { + return t.eInputData.size(); + } + }, + OutputData(GT_MetaTileEntity_MultiblockBase_EM::addDataConnectorToMachineList, GT_MetaTileEntity_Hatch_OutputData.class) { + @Override + public long count(GT_MetaTileEntity_MultiblockBase_EM t) { + return t.eOutputData.size(); + } + }, + ; + private final List> mteClasses; + private final IGT_HatchAdder adder; + + @SafeVarargs + HatchElement(IGT_HatchAdder adder, Class... mteClasses) { + this.mteClasses = Collections.unmodifiableList(Arrays.asList(mteClasses)); + this.adder = adder; + } + + @Override + public List> mteClasses() { + return mteClasses; + } + + public IGT_HatchAdder adder() { + return adder; + } + } }