aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorBlueWeabo <76872108+BlueWeabo@users.noreply.github.com>2022-12-13 23:10:17 +0200
committerGitHub <noreply@github.com>2022-12-13 22:10:17 +0100
commit8a515c7a9f83ca0fe29098d50bc7cab30e137d35 (patch)
treef8d8ae0ef341bc629a7ef12ad46da3c21a19b011 /src/main
parentc702937ba0bf2e3f6cc8e2c37a2d5a7453a74926 (diff)
downloadGT5-Unofficial-8a515c7a9f83ca0fe29098d50bc7cab30e137d35.tar.gz
GT5-Unofficial-8a515c7a9f83ca0fe29098d50bc7cab30e137d35.tar.bz2
GT5-Unofficial-8a515c7a9f83ca0fe29098d50bc7cab30e137d35.zip
Nanite material and circuit board multi for later tiers (#1513)
* Base work for ModularUI compat * Remove useless interface * Add almost all the widgets * Invert method * Refactor NEI stack placement positions * NEI handlers on ModularUI * Add some more docs * AdvDebugStructureWriter * Fix NEI progressbar not working * PrimitiveBlastFurnace * clean * derp * clean * spotlessApply * Boilers * Buffers * clean * N by N slots containers * Fix boilers not having bucket interaction Put opening UI to individual MetaTEs * Maintenance Hatch * clean * spotlessApply * Add dependency * IndustrialApiary * Adapt to ModularUI change * Base work for covers & fix crash with MP * Fix crash with server * Rewrite base work for covers * Send initial cover data on cover GUI open so that the time of showing incorrect data will be eliminated * Covers part 1 * Rename package: ModularUI -> modularui * Rename class: GT_UIInfo -> GT_UIInfos * Fix build * Covers part2 * Fix missing client check with tile UI & fix title overlap * CoverTabLine * Move cover window creators to inner class * Fix crash with null base TE * Close GUI when tile is broken * Color cover window with tile colorization * add nanites as a material * spotless * start the work on the nanites multi * spotless * Change signature of addUIWidgets * FluidFilter cover, FluidDisplaySlotWidget, BasicTank, BasicGenerator, Output Hatch, MicrowaveEnergyTransmitter, Teleporter, DigitalChest, DigitalTank * Add title tab * Move package: modularui -> modularui/widget * add controller recipe and new casing * add prefix and the casing and controller to the item list * add nano forge controller to its item * add nanites to PreLoad * Programmed circuit + IConfigurationCircuitSupport * clean * add nano forge multi - complete with some recipes * new nanite textures * Apply spotless * fix nanites not registering, remove recipe lock on the nano forge, other small fixed no clue why they didn't want to register in run2. * VolumetricFlask * Remove integrated circuit overlay from recipe input slots * Input Hatch & Quadruple Input Hatch * Multiblock * Deprecate old cover GUI * BasicMachines * Finish BasicMachine & NEI * Expand DTPF NEI to 9 slots * Fix ME input bus on MP * Move AESlotWidget to public class * Move GT_Recipe_Map constructors with mNEIUnificateOutput to setter method * Move SteamTexture.Variant to outer enum * Switch to remote repository * oops * Update MUI * Update MUI * Minor refactor for change amount buttons * the start of a new multi, tooltip WIP * Display items and fluids that exceed usual count * blah * use +=, why didn't I do this * add tier 2 and tier 3. add some more checks * Update MUI * Move ModularUI to Base (#1510) * Move ModularUI to Base * Move most of the ModularUI functionality to `BaseTileEntity` (and `CoverableTileEntity`) * `CommonMetaTileEntity` delegates ato the MetaTileEntity * Added several interfaces (with defaults) to indicate if a tile/metatile override/implement certain behaviors. * Moved `IConfigurationCircuitSupport` interface such that it will work with BaseTileEntity or a MetaTileEntity * Address reviews Co-authored-by: miozune <miozune@gmail.com> * Update MUI * make a single shape rotatable by 90 degrees * Minor changes to NEI * more shapes, more mechanics * Return :facepalm: * IGetTabIconSet override * Some more changes to NEI * Merge texture getter interfaces to new class GUITextureSet * Remove BBF structure picture as it's auto-buildable now * Make unified title tab style of texture angular * Expose some boiler texture getters for addon * Fix crash with cover GUI on pipe * small changes * Lower the number of recipe per page for DTPF & update MUI * Update MUI * Fix crash with middle-clicking slot on circuit selection GUI * Fix circuit selection window not syncing item from base machine * Merge GT_NEI_AssLineHandler into GT_NEI_DefaultHandler * Update MUI * Add in TecTech multi message * Allow changing the way of binding player inventory * Update MUI * Update MUI * Update MUI * Update MUI * Update MUI * Make MUI non-transitive to allow addons to use their own version * Force enable mixin * Format fluid amount tooltip * Add GUITextureSet.STEAM * Add guard against null ModularWindow creation * Add constructors for Muffler Hatch with inventory * Fix output slot on digital chest and tank allowing insertion * Don't log null ModularWindow * add a new material, add some recipes, continue the work on the PCB factory. The first recipe is in! * oops spotless * update bs * rename casings * make material generate plates * add recipes to the pcb factory * nei handling * do some more work on the multi * fixes to recipes. * Update build-and-test.yml * starter work on the PCBFactory GUI. recipe check fully working * finish gui work * spotless thank god drafts don't generate spotless PRs * final touches. tooltip tomorrow * fix typos. and finish PCB multi. * spotless * changes for requests * make consumed amount a constant * fix recipes oopsie * Remove unused textures * Add nanites * fixing recipes * Fix NEI not showing * Make nanites share texture * actually fix recipes and use 2 new lenses * finally circuits work in recipe * Add trans metal block * add default offsets * spotless * make parallels actually work * Downscale nanite texture to 64x64 * improve PCB Factory GUI * finish fixing gui, fix offsets on cooler, apply a new formula for duration * Clean up PCB Factory tooltip * Spotless * Fix typo in Naquadah * make sure the roughness multiplier actually slows down the recipe XD * add a smaller limit to the roughness multipler.... lets not allow for 10x board prodction oops * fix cooler tier 2 using wrong block in its center, fix controller texture on tier 3 * update mui and uodate the button texture * fix one button and prevent null arrays * remove some math. a small rework on recipes * fix and off by 1 * save the change? never heard of it * fix tier 3 not forming * Nano forge tooltip * hopefully fix nano forge. fix neutroni nanite wrong tier in recipe * try 2 to fix structure check * fix nano forge not forming * fix nano forge data stick. we need better error messages * do some fixes. * its 12am, typos.... * never coding at midnight again * try 2 to fix nano forge and pcb factory * fix nano and pcb factory not working. address some reviews * do syncing between client and server. fix recipes asking too much power with multiple upgrades Co-authored-by: miozune <miozune@gmail.com> Co-authored-by: Jason Mitchell <mitchej@gmail.com> Co-authored-by: Martin Robertz <dream-master@gmx.net> Co-authored-by: GTNH-Colen <54497873+GTNH-Colen@users.noreply.github.com> Co-authored-by: Sampsa <sampo.vanninen@aalto.fi>
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/gregtech/api/enums/GT_Values.java3
-rw-r--r--src/main/java/gregtech/api/enums/ItemList.java9
-rw-r--r--src/main/java/gregtech/api/enums/Materials.java10
-rw-r--r--src/main/java/gregtech/api/enums/OrePrefixes.java13
-rw-r--r--src/main/java/gregtech/api/enums/TextureSet.java11
-rw-r--r--src/main/java/gregtech/api/enums/Textures.java24
-rw-r--r--src/main/java/gregtech/api/gui/modularui/GT_UITextures.java5
-rw-r--r--src/main/java/gregtech/api/interfaces/internal/IGT_RecipeAdder.java45
-rw-r--r--src/main/java/gregtech/api/util/GT_LanguageManager.java11
-rw-r--r--src/main/java/gregtech/api/util/GT_OreDictUnificator.java8
-rw-r--r--src/main/java/gregtech/api/util/GT_PCBFactoryManager.java22
-rw-r--r--src/main/java/gregtech/api/util/GT_Recipe.java42
-rw-r--r--src/main/java/gregtech/api/util/GT_Utility.java5
-rw-r--r--src/main/java/gregtech/common/GT_RecipeAdder.java40
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Block_Casings8.java25
-rw-r--r--src/main/java/gregtech/common/items/GT_MetaGenerated_Item_03.java5
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_NanoForge.java453
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PCBFactory.java1120
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PlasmaForge.java6
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingLens.java7
-rw-r--r--src/main/java/gregtech/loaders/postload/GT_MachineRecipeLoader.java25
-rw-r--r--src/main/java/gregtech/loaders/postload/GT_PCBFactoryMaterialLoader.java18
-rw-r--r--src/main/java/gregtech/loaders/postload/chains/GT_NaniteChain.java146
-rw-r--r--src/main/java/gregtech/loaders/postload/chains/GT_PCBFactoryRecipes.java577
-rw-r--r--src/main/java/gregtech/loaders/preload/GT_Loader_Item_Block_And_Fluid.java6
-rw-r--r--src/main/java/gregtech/loaders/preload/GT_Loader_MetaTileEntities.java10
-rw-r--r--src/main/java/gregtech/loaders/preload/GT_PreLoad.java8
-rw-r--r--src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java12
-rw-r--r--src/main/java/gregtech/nei/IMCForNEI.java4
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TRANSCENDENTMETAL.pngbin0 -> 338 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/INFINITY_COOLED_CASING.pngbin0 -> 440 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_1.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_2.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_3.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_RADIANT_NAQUADAH_ALLOY.pngbin0 -> 301 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nanites.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nanites_OVERLAY.pngbin0 -> 613 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites.pngbin0 -> 401583 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites_OVERLAY.pngbin0 -> 613 bytes
40 files changed, 2643 insertions, 29 deletions
diff --git a/src/main/java/gregtech/api/enums/GT_Values.java b/src/main/java/gregtech/api/enums/GT_Values.java
index 41e506273d..a65b79d42d 100644
--- a/src/main/java/gregtech/api/enums/GT_Values.java
+++ b/src/main/java/gregtech/api/enums/GT_Values.java
@@ -507,4 +507,7 @@ public class GT_Values {
+ EnumChatFormatting.BOLD + "a" + EnumChatFormatting.DARK_GREEN + EnumChatFormatting.BOLD + "6"
+ EnumChatFormatting.GREEN + EnumChatFormatting.BOLD + "0" + EnumChatFormatting.AQUA
+ EnumChatFormatting.BOLD + "0" + EnumChatFormatting.DARK_AQUA + EnumChatFormatting.BOLD + "0";
+
+ public static final String AuthorBlueWeabo = "Author: " + EnumChatFormatting.BLUE + EnumChatFormatting.BOLD + "Blue"
+ + EnumChatFormatting.AQUA + EnumChatFormatting.BOLD + "Weabo";
}
diff --git a/src/main/java/gregtech/api/enums/ItemList.java b/src/main/java/gregtech/api/enums/ItemList.java
index 0ca7ac06b4..3ebc0aa8eb 100644
--- a/src/main/java/gregtech/api/enums/ItemList.java
+++ b/src/main/java/gregtech/api/enums/ItemList.java
@@ -1684,6 +1684,7 @@ public enum ItemList implements IItemContainer {
OreDrill4,
PyrolyseOven,
OilCracker,
+ NanoForge,
Crop_Drop_UUMBerry,
Crop_Drop_UUABerry,
Empty_Board_Basic,
@@ -1959,7 +1960,13 @@ public enum ItemList implements IItemContainer {
Superconducting_Magnet_Solenoid_UHV,
Superconducting_Magnet_Solenoid_UEV,
Superconducting_Magnet_Solenoid_UIV,
- Superconducting_Magnet_Solenoid_UMV;
+ Superconducting_Magnet_Solenoid_UMV,
+ RadiantNaquadahAlloyCasing,
+ PCBFactory,
+ BasicPhotolithographicFrameworkCasing,
+ ReinforcedPhotolithographicFrameworkCasing,
+ RadiationProofPhotolithographicFrameworkCasing,
+ InfinityCooledCasing;
public static final ItemList[]
DYE_ONLY_ITEMS =
{
diff --git a/src/main/java/gregtech/api/enums/Materials.java b/src/main/java/gregtech/api/enums/Materials.java
index a205aa2be0..768dd1fa6f 100644
--- a/src/main/java/gregtech/api/enums/Materials.java
+++ b/src/main/java/gregtech/api/enums/Materials.java
@@ -891,7 +891,7 @@ public class Materials implements IColorModulationContainer, ISubTagContainer {
public static Materials SpaceTime = new Materials( 588, new TextureSet("spacetime", true) , 320.0F, 4*2621440, 25, 1|2|64|128, 255, 255, 255, 0, "SpaceTime" , "SpaceTime" , -1, -1, 0, 0, false, true, 2, 1, 1, Dyes._NULL , Collections.singletonList(new TC_AspectStack(TC_Aspects.AQUA, 1)));
public static Materials TranscendentMetal = new Materials( 581, TextureSet.SET_METALLIC , 290.0F, 3*2621440, 22, 1|2|64|128, 50, 50, 50,0, "TranscendentMetal" , "Transcendent Metal" , -1, -1, 0, 3000, true, true, 200, 1000, 1000, Dyes.dyeBlack , Collections.singletonList(new TC_AspectStack(TC_Aspects.AQUA, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
-
+ public static Materials EnrichedHolmium = new Materials(582, TextureSet.SET_METALLIC, 1.0F, 0, 2, 18, 100, 1|2|4|16, 255, 255, "EnrichedHolmium", "Enriched Holmium", -1, -1, 0, 3000, true, false, 200, 1, 1, Dyes.dyePurple);
// spotless:on
static {
@@ -1973,6 +1973,7 @@ public class Materials implements IColorModulationContainer, ISubTagContainer {
SuperconductorUMVBase.mChemicalFormula =
"?\u2086Or\u2083(Hy⚶)\u2081\u2081(((CW)\u2087Ti\u2083)\u2083???)\u2085۞\u2082";
Diatomite.mChemicalFormula = "(SiO\u2082)\u2088Fe\u2082O\u2083(Al\u2082O\u2083)";
+ EnrichedHolmium.mChemicalFormula = "Nq+Ho";
}
private static void initSubTags() {
@@ -2226,7 +2227,8 @@ public class Materials implements IColorModulationContainer, ISubTagContainer {
SuperconductorUMVBase,
Quantium,
RedstoneAlloy,
- Bedrockium);
+ Bedrockium,
+ EnrichedHolmium);
SubTag.FOOD.addTo(
MeatRaw,
@@ -3299,4 +3301,8 @@ public class Materials implements IColorModulationContainer, ISubTagContainer {
public static Materials getGtMaterialFromFluid(Fluid fluid) {
return FLUID_MAP.get(fluid);
}
+
+ public ItemStack getNanite(int amount) {
+ return GT_OreDictUnificator.get(OrePrefixes.nanite, this, amount);
+ }
}
diff --git a/src/main/java/gregtech/api/enums/OrePrefixes.java b/src/main/java/gregtech/api/enums/OrePrefixes.java
index 46bf1ce408..e8e6e102f7 100644
--- a/src/main/java/gregtech/api/enums/OrePrefixes.java
+++ b/src/main/java/gregtech/api/enums/OrePrefixes.java
@@ -3171,7 +3171,8 @@ public enum OrePrefixes {
-1,
64,
-1),
- beeComb("Bee Combs", "", "", true, false, true, false, false, false, false, false, false, false, 0, -1, 64, -1);
+ beeComb("Bee Combs", "", "", true, false, true, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ nanite("Nanites", "", " Nanites", true, true, true, false, false, false, false, false, false, false, 0, -1, 64, 50);
public static final ImmutableList<OrePrefixes> CELL_TYPES = ImmutableList.of(
cell,
@@ -3326,6 +3327,13 @@ public enum OrePrefixes {
stickLong.mGeneratedItems.add(Materials.Blaze);
+ nanite.mGeneratedItems.add(Materials.Carbon);
+ nanite.mGeneratedItems.add(Materials.Gold);
+ nanite.mGeneratedItems.add(Materials.Iron);
+ nanite.mGeneratedItems.add(Materials.Copper);
+ nanite.mGeneratedItems.add(Materials.Silver);
+ nanite.mGeneratedItems.add(Materials.TranscendentMetal);
+ nanite.mGeneratedItems.add(Materials.Neutronium);
// -----
dust.mGeneratedItems.addAll(dustPure.mGeneratedItems);
@@ -3547,7 +3555,8 @@ public enum OrePrefixes {
OrePrefixes.crateGtIngot,
OrePrefixes.crateGtGem,
OrePrefixes.crateGtPlate,
- OrePrefixes.itemCasing));
+ OrePrefixes.itemCasing,
+ OrePrefixes.nanite));
/**
* Yes this Value can be changed to add Bits for the MetaGenerated-Item-Check.
*/
diff --git a/src/main/java/gregtech/api/enums/TextureSet.java b/src/main/java/gregtech/api/enums/TextureSet.java
index 6bf6908734..7b8940a70a 100644
--- a/src/main/java/gregtech/api/enums/TextureSet.java
+++ b/src/main/java/gregtech/api/enums/TextureSet.java
@@ -187,7 +187,7 @@ public class TextureSet {
"/toolHeadScrewdriver",
"/toolHeadBuzzSaw",
"/toolHeadSoldering",
- aTextVoidDir,
+ "/nanites",
"/wireFine",
"/gearGtSmall",
"/rotor",
@@ -318,7 +318,14 @@ public class TextureSet {
if (IS_BLOCK_TEXTURE[i] == TextureType.BLOCK) {
mTextures[i] = new Textures.BlockIcons.CustomIcon(aTextMatIconDir + aSetName + SUFFIXES[i]);
} else {
- mTextures[i] = new Textures.ItemIcons.CustomIcon(aTextMatIconDir + aSetName + SUFFIXES[i]);
+ // Check nanites folder for nanites texture to avoid copy pasting large file multiple times.
+ // Exemption for CUSTOM textures so they can be overriden as normal by placing nanite image in
+ // their respective folder.
+ if (SUFFIXES[i].equals("/nanites") && (!aSetName.contains("CUSTOM"))) {
+ mTextures[i] = new Textures.ItemIcons.CustomIcon(aTextMatIconDir + "NANITES" + SUFFIXES[i]);
+ } else {
+ mTextures[i] = new Textures.ItemIcons.CustomIcon(aTextMatIconDir + aSetName + SUFFIXES[i]);
+ }
}
}
}
diff --git a/src/main/java/gregtech/api/enums/Textures.java b/src/main/java/gregtech/api/enums/Textures.java
index 89d7ee6a1f..0a9ff078b4 100644
--- a/src/main/java/gregtech/api/enums/Textures.java
+++ b/src/main/java/gregtech/api/enums/Textures.java
@@ -250,6 +250,7 @@ public class Textures {
MACHINE_CASING_RHODIUM_PALLADIUM,
MACHINE_CASING_IRIDIUM,
MACHINE_CASING_MAGICAL,
+ MACHINE_CASING_RADIANT_NAQUADAH_ALLOY,
MACHINE_CASING_FIREBOX_TITANIUM,
MACHINE_CASING_FUSION_COIL,
@@ -1117,6 +1118,7 @@ public class Textures {
MARBLE_COBBLE,
BLOCK_NICKELALUMINIUM,
BLOCK_SILICONSG,
+ BLOCK_TRANSCENDENTMETAL,
MARBLE_COBBLE_MOSSY,
MARBLE_BRICKS,
@@ -1305,7 +1307,11 @@ public class Textures {
UIV_SIDE_CYCLOTRON_SOLENOID,
UMV_SIDE_CYCLOTRON_SOLENOID,
ZPM_TOP_CYCLOTRON_SOLENOID,
- ZPM_SIDE_CYCLOTRON_SOLENOID;
+ ZPM_SIDE_CYCLOTRON_SOLENOID,
+ MACHINE_CASING_PCB_TIER_1,
+ MACHINE_CASING_PCB_TIER_2,
+ MACHINE_CASING_PCB_TIER_3,
+ INFINITY_COOLED_CASING;
/**
* Icon for Fresh CFoam
@@ -1850,15 +1856,15 @@ public class Textures {
BLOCK_TERRACRYSTAL
},
STORAGE_BLOCKS11 =
+ {BLOCK_TOPAZ, BLOCK_VINTEUM, BLOCK_YELLOWGARNET, BLOCK_NETHERSTAR, BLOCK_CHARCOAL, BLOCK_BLAZE},
+ STORAGE_BLOCKS12 =
{
- BLOCK_TOPAZ,
- BLOCK_VINTEUM,
- BLOCK_YELLOWGARNET,
- BLOCK_NETHERSTAR,
- BLOCK_CHARCOAL,
- BLOCK_BLAZE,
- },
- STORAGE_BLOCKS12 = {BLOCK_CRYOLITE, BLOCK_SILICONSG, BLOCK_NICKELALUMINIUM, BLOCK_SPACETIME};
+ BLOCK_CRYOLITE,
+ BLOCK_SILICONSG,
+ BLOCK_NICKELALUMINIUM,
+ BLOCK_SPACETIME,
+ BLOCK_TRANSCENDENTMETAL
+ };
public static final ITexture[] HIDDEN_TEXTURE = {
TextureFactory.builder().addIcon(HIDDEN_FACE).stdOrient().build()
diff --git a/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java b/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java
index 76b4874838..b82876d5cf 100644
--- a/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java
+++ b/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java
@@ -189,8 +189,9 @@ public class GT_UITextures {
public static final SteamTexture TAB_TITLE_ANGULAR_STEAM =
SteamTexture.adaptableTexture(MODID, "gui/tab/title_angular_%s", 28, 28, 4);
- public static final UITexture BUTTON_STANDARD = UITexture.fullImage(MODID, "gui/button/standard");
- public static final UITexture BUTTON_STANDARD_TOGGLE = UITexture.fullImage(MODID, "gui/button/standard_toggle");
+ public static final UITexture BUTTON_STANDARD = AdaptableUITexture.of(MODID, "gui/button/standard", 18, 18, 1);
+ public static final UITexture BUTTON_STANDARD_TOGGLE =
+ AdaptableUITexture.of(MODID, "gui/button/standard_toggle", 18, 18, 1);
public static final UITexture BUTTON_COVER_NORMAL = UITexture.fullImage(MODID, "gui/button/cover_normal");
public static final UITexture BUTTON_COVER_NORMAL_HOVERED =
UITexture.fullImage(MODID, "gui/button/cover_normal_hovered");
diff --git a/src/main/java/gregtech/api/interfaces/internal/IGT_RecipeAdder.java b/src/main/java/gregtech/api/interfaces/internal/IGT_RecipeAdder.java
index 8bb10d8580..2dd5ab9fa0 100644
--- a/src/main/java/gregtech/api/interfaces/internal/IGT_RecipeAdder.java
+++ b/src/main/java/gregtech/api/interfaces/internal/IGT_RecipeAdder.java
@@ -1278,4 +1278,49 @@ public interface IGT_RecipeAdder {
int[] aChances,
int aDuration,
int aEUt);
+
+ /**
+ * Add a Nano Forge Recipe. The Nano Forge's main use is to make nanites/nanorobots.
+ * Tier 1 Nano Forge - Can make partly biological, partly metal nanites
+ * TIer 2 Nano Forge - Can make mostly metal nanites with some biological aspects
+ * TIer 3 Nano Forge - Can make nanites entierly out of metal
+ *
+ * @param aInputs = must not be null
+ * @param aFluidInputs = can be null
+ * @param aOutputs = must not be null, the nanite or other output
+ * @param aFluidOutputs = can be null
+ * @param aChances = can be null
+ * @param aDuration
+ * @param aEUt
+ * @param aSpecialValue = defines the tier of nano forge required.
+ *
+ */
+ boolean addNanoForgeRecipe(
+ ItemStack[] aInputs,
+ FluidStack[] aFluidInputs,
+ ItemStack[] aOutputs,
+ FluidStack[] aFluidOutputs,
+ int[] aChances,
+ int aDuration,
+ int aEUt,
+ int aSpecialValue);
+
+ /**
+ * Add a Board Manufacturer Recipe. The Board Manufacturer's main use is to make the circuit boards
+ * needed to make circuits.
+ *
+ * @param aInputs = must not be null
+ * @param aFluidInputs = must not be null
+ * @param aOutputs = must not be null
+ * @param aDuration
+ * @param aEUt
+ * @param aSpecialValue = defines the tier of the board manufacturer required.
+ */
+ boolean addPCBFactoryRecipe(
+ ItemStack[] aInputs,
+ FluidStack[] aFluidInputs,
+ ItemStack[] aOutputs,
+ int aDuration,
+ int aEUt,
+ int aSpecialValue);
}
diff --git a/src/main/java/gregtech/api/util/GT_LanguageManager.java b/src/main/java/gregtech/api/util/GT_LanguageManager.java
index 1d6d794542..1b2d566fd0 100644
--- a/src/main/java/gregtech/api/util/GT_LanguageManager.java
+++ b/src/main/java/gregtech/api/util/GT_LanguageManager.java
@@ -479,6 +479,17 @@ public class GT_LanguageManager {
addStringLocalization("Interaction_DESCRIPTION_Index_333", "OR Gate");
addStringLocalization("Interaction_DESCRIPTION_Index_334", "NOR Gate");
addStringLocalization("Interaction_DESCRIPTION_Index_335", "Gate Mode");
+ addStringLocalization("Interaction_DESCRIPTION_Index_336", "PCB Factory Tier: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_337", "Upgrade Required: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_338", "Bio");
+ addStringLocalization("Interaction_DESCRIPTION_Index_339", "Bio Upgrade Enabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_339.1", "Bio Upgrade Disabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_340", "Rotate Bio Upgrade 90 Degrees Enabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_340.1", "Rotate Bio Upgrade 90 Degrees Disabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_341", "OC Tier 1 Enabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_341.1", "OC Tier 1 Disabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_342", "OC Tier 2 Enabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_342.1", "OC Tier 2 Disabled");
addStringLocalization("Interaction_DESCRIPTION_Index_500", "Fitting: Loose - More Flow");
addStringLocalization("Interaction_DESCRIPTION_Index_501", "Fitting: Tight - More Efficiency");
addStringLocalization("Interaction_DESCRIPTION_Index_502", "Mining chunk loading enabled");
diff --git a/src/main/java/gregtech/api/util/GT_OreDictUnificator.java b/src/main/java/gregtech/api/util/GT_OreDictUnificator.java
index 75ca3a7141..bf554e57df 100644
--- a/src/main/java/gregtech/api/util/GT_OreDictUnificator.java
+++ b/src/main/java/gregtech/api/util/GT_OreDictUnificator.java
@@ -118,6 +118,14 @@ public class GT_OreDictUnificator {
return get(aPrefix.get(aMaterial), aReplacement, aAmount, false, true);
}
+ public static ItemStack get(OrePrefixes aPrefix, Object aMaterial, long aAmount, boolean aNoInvalidAmounts) {
+ // if (Materials.mDefaultComponents.contains(aPrefix) && !aPrefix.mDynamicItems.contains((Materials)aMaterial))
+ // aPrefix.mDynamicItems.add((Materials) aMaterial);
+ if (OrePrefixes.mPreventableComponents.contains(aPrefix) && aPrefix.mDisabledItems.contains(aMaterial))
+ return null;
+ return get(aPrefix.get(aMaterial), null, aAmount, false, aNoInvalidAmounts);
+ }
+
public static ItemStack get(
Object aName,
ItemStack aReplacement,
diff --git a/src/main/java/gregtech/api/util/GT_PCBFactoryManager.java b/src/main/java/gregtech/api/util/GT_PCBFactoryManager.java
new file mode 100644
index 0000000000..1543a9d2a6
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_PCBFactoryManager.java
@@ -0,0 +1,22 @@
+package gregtech.api.util;
+
+import com.google.common.collect.HashBiMap;
+import gregtech.api.enums.Materials;
+
+public class GT_PCBFactoryManager {
+ private static final HashBiMap<Materials, Integer> mPlasticTiers = HashBiMap.create();
+ public static int mTiersOfPlastics = 0;
+
+ public static void addPlasticTier(Materials aMaterial, int aTier) {
+ mPlasticTiers.put(aMaterial, aTier);
+ mTiersOfPlastics++;
+ }
+
+ public static int getPlasticTier(Materials aMaterial) {
+ return mPlasticTiers.get(aMaterial);
+ }
+
+ public static Materials getPlasticMaterialFromTier(int aTier) {
+ return mPlasticTiers.inverse().get(aTier);
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_Recipe.java b/src/main/java/gregtech/api/util/GT_Recipe.java
index 09cc850ecd..b2506c63ad 100644
--- a/src/main/java/gregtech/api/util/GT_Recipe.java
+++ b/src/main/java/gregtech/api/util/GT_Recipe.java
@@ -2428,6 +2428,48 @@ public class GT_Recipe implements Comparable<GT_Recipe> {
(GT_Recipe_Map_LargeBoilerFakeFuels) new GT_Recipe_Map_LargeBoilerFakeFuels()
.setProgressBar(GT_UITextures.PROGRESSBAR_ARROW, ProgressBar.Direction.RIGHT);
+ public static final GT_Recipe_Map sNanoForge = new GT_Recipe_Map(
+ new HashSet<>(10),
+ "gt.recipe.nanoforge",
+ "Nano Forge",
+ null,
+ RES_PATH_GUI + "basicmachines/LCRNEI",
+ 6,
+ 2,
+ 2,
+ 1,
+ 1,
+ "Tier: ",
+ 1,
+ "",
+ false,
+ true)
+ .useModularUI(true)
+ .setUsualFluidInputCount(1)
+ .setSlotOverlay(false, false, true, GT_UITextures.OVERLAY_SLOT_LENS)
+ .setProgressBar(GT_UITextures.PROGRESSBAR_ASSEMBLE, ProgressBar.Direction.RIGHT);
+
+ public static final GT_Recipe_Map sPCBFactory = new GT_Recipe_Map(
+ new HashSet<>(10),
+ "gt.recipe.pcbfactory",
+ "PCB Factory",
+ null,
+ RES_PATH_GUI + "basicmachines/LCRNEI",
+ 6,
+ 9,
+ 3,
+ 1,
+ 1,
+ E,
+ 0,
+ E,
+ true,
+ true)
+ .useModularUI(true)
+ .setUsualFluidInputCount(3)
+ .setUsualFluidOutputCount(0)
+ .setProgressBar(GT_UITextures.PROGRESSBAR_ASSEMBLE, ProgressBar.Direction.RIGHT);
+
/**
* HashMap of Recipes based on their Items
*/
diff --git a/src/main/java/gregtech/api/util/GT_Utility.java b/src/main/java/gregtech/api/util/GT_Utility.java
index a4cea9ed2f..da98e97f8e 100644
--- a/src/main/java/gregtech/api/util/GT_Utility.java
+++ b/src/main/java/gregtech/api/util/GT_Utility.java
@@ -4301,6 +4301,11 @@ public class GT_Utility {
return signal;
}
+ public static ItemStack getNaniteAsCatalyst(Materials material) {
+ ItemStack aItem = material.getNanite(1);
+ return new ItemStack(aItem.getItem(), 0, aItem.getItemDamage());
+ }
+
@AutoValue
public abstract static class ItemId {
/** This method copies NBT, as it is mutable. */
diff --git a/src/main/java/gregtech/common/GT_RecipeAdder.java b/src/main/java/gregtech/common/GT_RecipeAdder.java
index 488ac0a5fb..ee056ddebd 100644
--- a/src/main/java/gregtech/common/GT_RecipeAdder.java
+++ b/src/main/java/gregtech/common/GT_RecipeAdder.java
@@ -3318,6 +3318,46 @@ public class GT_RecipeAdder implements IGT_RecipeAdder {
return true;
}
+ @Override
+ public boolean addNanoForgeRecipe(
+ ItemStack[] aInputs,
+ FluidStack[] aFluidInputs,
+ ItemStack[] aOutputs,
+ FluidStack[] aFluidOutputs,
+ int[] aChances,
+ int aDuration,
+ int aEUt,
+ int aSpecialValue) {
+ if (aInputs == null || aOutputs == null || aSpecialValue == 0) return false;
+
+ GT_Recipe.GT_Recipe_Map.sNanoForge.addRecipe(new GT_Recipe(
+ false, aInputs, aOutputs, null, aChances, aFluidInputs, aFluidOutputs, aDuration, aEUt, aSpecialValue));
+ return true;
+ }
+
+ @Override
+ public boolean addPCBFactoryRecipe(
+ ItemStack[] aInputs,
+ FluidStack[] aFluidInputs,
+ ItemStack[] aOutputs,
+ int aDuration,
+ int aEUt,
+ int aSpecialValue) {
+
+ if (aInputs == null || aFluidInputs == null || aOutputs == null) {
+ return false;
+ }
+
+ if (aSpecialValue <= 0 || aEUt < 0 || aDuration < 0) {
+ return false;
+ }
+
+ GT_Recipe.GT_Recipe_Map.sPCBFactory.addRecipe(new GT_Recipe(
+ false, aInputs, aOutputs, null, null, aFluidInputs, null, aDuration, aEUt, aSpecialValue));
+
+ return true;
+ }
+
private boolean areItemsAndFluidsBothNull(ItemStack[] items, FluidStack[] fluids) {
boolean itemsNull = true;
if (items != null) {
diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Casings8.java b/src/main/java/gregtech/common/blocks/GT_Block_Casings8.java
index 65583eaa28..ae67f52730 100644
--- a/src/main/java/gregtech/common/blocks/GT_Block_Casings8.java
+++ b/src/main/java/gregtech/common/blocks/GT_Block_Casings8.java
@@ -18,7 +18,7 @@ public class GT_Block_Casings8 extends GT_Block_Casings_Abstract {
// WATCH OUT FOR TEXTURE ID's
public GT_Block_Casings8() {
- super(GT_Item_Casings8.class, "gt.blockcasings8", GT_Material_Casings.INSTANCE, 10);
+ super(GT_Item_Casings8.class, "gt.blockcasings8", GT_Material_Casings.INSTANCE, 15);
/*
* DO NOT USE INDEX 15 !
* USED HERE: https://github.com/GTNewHorizons/Electro-Magic-Tools/pull/17
@@ -37,6 +37,14 @@ public class GT_Block_Casings8 extends GT_Block_Casings_Abstract {
getUnlocalizedName() + ".7.name", "Advanced Iridium Plated Machine Casing");
GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Magical Machine Casing");
GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "HSS-S Turbine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Radiant Naquadah Alloy Casing");
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName() + ".11.name", "Basic Photolithographic Framework Casing");
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName() + ".12.name", "Reinforced Photolithographic Framework Casing");
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName() + ".13.name", "Radiation Proof Photolithographic Framework Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Infinity Cooled Casing");
ItemList.Casing_Chemically_Inert.set(new ItemStack(this, 1, 0));
ItemList.Casing_Pipe_Polytetrafluoroethylene.set(new ItemStack(this, 1, 1));
@@ -48,6 +56,11 @@ public class GT_Block_Casings8 extends GT_Block_Casings_Abstract {
ItemList.Casing_Advanced_Iridium.set(new ItemStack(this, 1, 7));
ItemList.Casing_Magical.set(new ItemStack(this, 1, 8));
ItemList.Casing_TurbineGasAdvanced.set(new ItemStack(this, 1, 9));
+ ItemList.RadiantNaquadahAlloyCasing.set(new ItemStack(this, 1, 10));
+ ItemList.BasicPhotolithographicFrameworkCasing.set(new ItemStack(this, 1, 11));
+ ItemList.ReinforcedPhotolithographicFrameworkCasing.set(new ItemStack(this, 1, 12));
+ ItemList.RadiationProofPhotolithographicFrameworkCasing.set(new ItemStack(this, 1, 13));
+ ItemList.InfinityCooledCasing.set(new ItemStack(this, 1, 14));
}
@Override
@@ -80,6 +93,16 @@ public class GT_Block_Casings8 extends GT_Block_Casings_Abstract {
return Textures.BlockIcons.MACHINE_CASING_MAGICAL.getIcon();
case 9:
return Textures.BlockIcons.MACHINE_CASING_ADVANCEDGAS.getIcon();
+ case 10:
+ return Textures.BlockIcons.MACHINE_CASING_RADIANT_NAQUADAH_ALLOY.getIcon();
+ case 11:
+ return Textures.BlockIcons.MACHINE_CASING_PCB_TIER_1.getIcon();
+ case 12:
+ return Textures.BlockIcons.MACHINE_CASING_PCB_TIER_2.getIcon();
+ case 13:
+ return Textures.BlockIcons.MACHINE_CASING_PCB_TIER_3.getIcon();
+ case 14:
+ return Textures.BlockIcons.INFINITY_COOLED_CASING.getIcon();
}
return Textures.BlockIcons.MACHINE_CASING_ROBUST_TUNGSTENSTEEL.getIcon();
}
diff --git a/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_03.java b/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_03.java
index 01015515e8..00927497c6 100644
--- a/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_03.java
+++ b/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_03.java
@@ -21,7 +21,8 @@ public class GT_MetaGenerated_Item_03 extends GT_MetaGenerated_Item_X32 {
OrePrefixes.crateGtDust,
OrePrefixes.crateGtIngot,
OrePrefixes.crateGtGem,
- OrePrefixes.crateGtPlate);
+ OrePrefixes.crateGtPlate,
+ OrePrefixes.nanite);
INSTANCE = this;
int tLastID = 0;
Object[] o = new Object[0];
@@ -810,6 +811,6 @@ public class GT_MetaGenerated_Item_03 extends GT_MetaGenerated_Item_X32 {
@Override
public boolean doesShowInCreative(OrePrefixes aPrefix, Materials aMaterial, boolean aDoShowAllItems) {
- return aDoShowAllItems;
+ return aDoShowAllItems || (aPrefix.toString().toLowerCase().contains("nanite"));
}
}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_NanoForge.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_NanoForge.java
new file mode 100644
index 0000000000..6bff3c3338
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_NanoForge.java
@@ -0,0 +1,453 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.*;
+import static gregtech.api.enums.GT_HatchElement.*;
+import static gregtech.api.enums.GT_Values.AuthorBlueWeabo;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_GLOW;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofFrame;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ExoticEnergyInputHelper;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.blocks.GT_Block_Casings8;
+import java.util.ArrayList;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+public class GT_MetaTileEntity_NanoForge
+ extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase<GT_MetaTileEntity_NanoForge>
+ implements ISurvivalConstructable {
+ private static final String STRUCTURE_PIECE_MAIN = "main";
+ private static final String STRUCTURE_PIECE_TIER2 = "tier2";
+ private static final String STRUCTURE_PIECE_TIER3 = "tier3";
+ private static final IStructureDefinition<GT_MetaTileEntity_NanoForge> STRUCTURE_DEFINITION =
+ StructureDefinition.<GT_MetaTileEntity_NanoForge>builder()
+ // spotless:off
+ .addShape(STRUCTURE_PIECE_MAIN, transpose(new String[][] {
+ {" "," "," F "," C "," C "," C "," C "," F "," "," "},
+ {" "," "," F "," C "," C "," C "," C "," F "," "," "},
+ {" "," "," F "," C "," C "," C "," C "," F "," "," "},
+ {" "," "," F "," C "," C "," C "," C "," F "," "," "},
+ {" "," "," F "," C "," C "," C "," C "," F "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "},
+ {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "},
+ {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "},
+ {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "},
+ {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "},
+ {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "},
+ {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "},
+ {" C "," FCF "," CC CC "," CC CC "," CC CC "," CC CC "," CC CC "," CC CC "," FCF "," C "},
+ {" C "," FCF "," CC CC "," CC CC "," CC CC "," CC CC "," CC CC "," CC CC "," FCF "," C "},
+ {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "},
+ {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "},
+ {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "},
+ {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "},
+ {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "},
+ {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "},
+ {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," BB~BB "," BBBBBBB ","BBBBBBBBB","BBBBBBBBB","BBBBBBBBB","BBBBBBBBB"," BBBBBBB "," BBBBB "," "}
+ }))
+ .addShape(STRUCTURE_PIECE_TIER2, transpose(new String[][] {
+ {" ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " "},
+ {" ", " ", " AA ", " ACCA ", " ACCA ", " AA ", " ", " "},
+ {" ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " "},
+ {" ", " ", " ", " CC ", " CC ", " ", " ", " "},
+ {" ", " ", " ", " CC ", " CC ", " ", " ", " "},
+ {" ", " ", " ", " CC ", " CC ", " ", " ", " "},
+ {" ", " ", " ", " CC ", " CC ", " ", " ", " "},
+ {" ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " "},
+ {" ", " ", " AA ", " ACCA ", " ACCA ", " AA ", " ", " "},
+ {" ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " "},
+ {" ", " ", " ", " CC ", " CC ", " ", " ", " "},
+ {" ", " ", " ", " CC ", " CC ", " ", " ", " "},
+ {" ", " ", " ", " CC ", " CC ", " ", " ", " "},
+ {" ", " ", " ", " CC ", " CC ", " ", " ", " "},
+ {" CCCCCC ", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", " CCCCCC "}
+ }))
+ .addShape(STRUCTURE_PIECE_TIER3, transpose(new String[][] {
+ {" ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " "},
+ {" ", " ", " FFAA ", " ACCA ", " ACCA ", " AAFF ", " ", " "},
+ {" ", " ", "F CC ", "F CCCC ", " CCCC F", " CC F", " ", " "},
+ {" ", " ", " F", " CC F", "F CC ", "F ", " ", " "},
+ {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "},
+ {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "},
+ {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "},
+ {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "},
+ {" ", " ", "F ", "F CC ", " CC F", " F", " ", " "},
+ {" ", " ", " CC F", " CCCC F", "F CCCC ", "F CC ", " ", " "},
+ {" ", " F ", " CC ", " CCCC ", " CCCC ", " CC ", " F ", " "},
+ {" FF ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " FF "},
+ {" FF ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " FF "},
+ {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "},
+ {" ", " ", "F ", "F CC ", " CC F", " F", " ", " "},
+ {" ", " ", " F", " CC F", "F CC ", "F ", " ", " "},
+ {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "},
+ {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "},
+ {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "},
+ {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "},
+ {" ", " ", "F CC ", "F CCCC ", " CCCC F", " CC F", " ", " "},
+ {" ", " ", " AA F", " ACCA F", "F ACCA ", "F AA ", " ", " "},
+ {" ", " F ", " CC ", " CCCC ", " CCCC ", " CC ", " F ", " "},
+ {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "},
+ {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "},
+ {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "},
+ {" CCCCCC ", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", " CCCCCC "}
+ }))
+ //spotless:on
+ .addElement('F', ofFrame(Materials.StellarAlloy))
+ .addElement('C', ofBlock(GregTech_API.sBlockCasings8, 10))
+ .addElement('A', ofBlock(GregTech_API.sBlockCasings2, 5))
+ .addElement(
+ 'B',
+ buildHatchAdder(GT_MetaTileEntity_NanoForge.class)
+ .atLeast(InputHatch, OutputBus, InputBus, Maintenance, Energy.or(ExoticEnergy))
+ .dot(1)
+ .casingIndex(((GT_Block_Casings8) GregTech_API.sBlockCasings8).getTextureIndex(10))
+ .buildAndChain(GregTech_API.sBlockCasings8, 10))
+ .build();
+ private byte mSpecialTier = 0;
+ private boolean mSeparate = false;
+
+ public GT_MetaTileEntity_NanoForge(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_NanoForge(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public GT_Recipe.GT_Recipe_Map getRecipeMap() {
+ return GT_Recipe.GT_Recipe_Map.sNanoForge;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 4, 37, 1);
+ if (stackSize.stackSize > 1) {
+ buildPiece(STRUCTURE_PIECE_TIER2, stackSize, hintsOnly, -7, 14, 4);
+ }
+ if (stackSize.stackSize > 2) {
+ buildPiece(STRUCTURE_PIECE_TIER3, stackSize, hintsOnly, 14, 26, 4);
+ }
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_NanoForge(this.mName);
+ }
+
+ @Override
+ public ITexture[] getTexture(
+ IGregTechTileEntity aBaseMetaTileEntity,
+ byte aSide,
+ byte aFacing,
+ byte aColorIndex,
+ boolean aActive,
+ boolean aRedstone) {
+ if (aSide == aFacing) {
+ if (aActive)
+ return new ITexture[] {
+ BlockIcons.getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 10)),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW)
+ .extFacing()
+ .glow()
+ .build()
+ };
+ return new ITexture[] {
+ BlockIcons.getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 10)),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_GLOW)
+ .extFacing()
+ .glow()
+ .build()
+ };
+ }
+ return new ITexture[] {
+ BlockIcons.getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 10))
+ };
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_NanoForge> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public boolean checkRecipe(ItemStack aStack) {
+ GT_Recipe.GT_Recipe_Map map = getRecipeMap();
+ FluidStack[] tFluidInputs = getCompactedFluids();
+ if (mSeparate) {
+ ArrayList<ItemStack> tInputList = new ArrayList<ItemStack>();
+ for (GT_MetaTileEntity_Hatch_InputBus tBus : mInputBusses) {
+ for (int i = tBus.getSizeInventory() - 1; i >= 0; i--) {
+ if (tBus.getStackInSlot(i) != null) tInputList.add(tBus.getStackInSlot(i));
+ }
+ ItemStack[] tInputs = tInputList.toArray(new ItemStack[0]);
+ if (processRecipe(tInputs, tFluidInputs, map)) return true;
+ else tInputList.clear();
+ }
+ } else {
+ ItemStack[] tItemInputs = getStoredInputs().toArray(new ItemStack[0]);
+ return processRecipe(tItemInputs, tFluidInputs, map);
+ }
+ return false;
+ }
+
+ private boolean processRecipe(ItemStack[] tItemInputs, FluidStack[] tFluidInputs, GT_Recipe.GT_Recipe_Map map) {
+ lEUt = 0;
+ mOutputItems = null;
+ mOutputFluids = null;
+ long tVoltage = GT_ExoticEnergyInputHelper.getMaxInputVoltageMulti(getExoticAndNormalEnergyHatchList());
+ long tAmps = GT_ExoticEnergyInputHelper.getMaxInputAmpsMulti(getExoticAndNormalEnergyHatchList());
+ long tTotalEU = tVoltage * tAmps;
+ GT_Recipe tRecipe =
+ map.findRecipe(getBaseMetaTileEntity(), null, false, false, tTotalEU, tFluidInputs, null, tItemInputs);
+
+ if (tRecipe == null) return false;
+
+ if (tRecipe.mSpecialValue > mSpecialTier) return false;
+
+ if (tRecipe.isRecipeInputEqual(true, tFluidInputs, tItemInputs)) {
+ this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000);
+ this.mEfficiencyIncrease = 10000;
+ this.mMaxProgresstime = tRecipe.mDuration;
+ this.lEUt = -tRecipe.mEUt;
+ calculateOverclockedNessMultiInternal(
+ tRecipe.mEUt, tRecipe.mDuration, 1, tTotalEU, tRecipe.mSpecialValue < mSpecialTier);
+
+ if (this.lEUt == Long.MAX_VALUE - 1 || this.mMaxProgresstime == Integer.MAX_VALUE - 1) return false;
+
+ if (this.lEUt > 0) {
+ this.lEUt *= -1;
+ }
+
+ ArrayList<ItemStack> tOutputs = new ArrayList<ItemStack>();
+ for (int i = 0; i < tRecipe.mOutputs.length; i++) {
+ if (getBaseMetaTileEntity().getRandomNumber(10000) < tRecipe.getOutputChance(i)) {
+ tOutputs.add(tRecipe.getOutput(i));
+ }
+ }
+
+ this.mMaxProgresstime = Math.max(1, this.mMaxProgresstime);
+ mOutputItems = tOutputs.toArray(new ItemStack[0]);
+ mOutputFluids = tRecipe.mFluidOutputs.clone();
+ updateSlots();
+
+ return true;
+ }
+
+ return false;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mSpecialTier = 0;
+ if (aStack == null) return false;
+ if (aStack.isItemEqual(Materials.Carbon.getNanite(1)) && checkPiece(STRUCTURE_PIECE_MAIN, 4, 37, 1)) {
+ mSpecialTier = 1;
+ }
+
+ if (aStack.isItemEqual(Materials.Neutronium.getNanite(1))
+ && checkPiece(STRUCTURE_PIECE_MAIN, 4, 37, 1)
+ && checkPiece(STRUCTURE_PIECE_TIER2, -7, 14, 4)) {
+ mSpecialTier = 2;
+ }
+
+ if (aStack.isItemEqual(Materials.TranscendentMetal.getNanite(1))
+ && checkPiece(STRUCTURE_PIECE_MAIN, 4, 37, 1)
+ && checkPiece(STRUCTURE_PIECE_TIER2, -7, 14, 4)
+ && checkPiece(STRUCTURE_PIECE_TIER3, 14, 26, 4)) {
+ mSpecialTier = 3;
+ }
+
+ if (mMaintenanceHatches.size() != 1
+ || mInputBusses.isEmpty()
+ || mOutputBusses.isEmpty()
+ || mInputHatches.isEmpty()) {
+ return false;
+ }
+
+ // Makes sure that the multi can accept only 1 TT Energy Hatch OR up to 2 Normal Energy Hatches. Deform if both
+ // present or more than 1 TT Hatch.
+ boolean hatch = mExoticEnergyHatches.size() == 1 ^ (mEnergyHatches.size() <= 2 && !mEnergyHatches.isEmpty());
+
+ return mSpecialTier > 0 && hatch;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ int built = 0;
+ built += survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 4, 37, 1, elementBudget, env, false, true);
+ if (stackSize.stackSize > 1) {
+ built += survivialBuildPiece(STRUCTURE_PIECE_TIER2, stackSize, -7, 14, 4, elementBudget, env, false, true);
+ }
+ if (stackSize.stackSize > 2) {
+ built += survivialBuildPiece(STRUCTURE_PIECE_TIER3, stackSize, 14, 26, 4, elementBudget, env, false, true);
+ }
+ return built;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("mSeparate", mSeparate);
+ aNBT.setByte("mSpecialTier", mSpecialTier);
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mSeparate = aNBT.getBoolean("mSeparate");
+ mSpecialTier = aNBT.getByte("mSpecialTier");
+ }
+
+ /** Get possible alignments of this controller
+ *
+ * @return List of alignments that are possible or denied
+ */
+ @Override
+ public IAlignmentLimits getAlignmentLimits() {
+ // The nano forge should only be buildable upright
+ return IAlignmentLimits.Builder.allowAll()
+ .deny(ForgeDirection.DOWN)
+ .deny(ForgeDirection.UP)
+ .deny(Rotation.UPSIDE_DOWN)
+ .deny(Rotation.CLOCKWISE)
+ .deny(Rotation.COUNTER_CLOCKWISE)
+ .build();
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Nanite Fabricator")
+ .addInfo("Controller block for the Nano Forge")
+ .addInfo("Requires insane amounts of power to create nanites. Each tier")
+ .addInfo("the multi gains a new building next to it. The nanite in the")
+ .addInfo("controller slot controls the tier.")
+ .addInfo("--------------------------------------------")
+ .addInfo("Requires a Carbon Nanite to use tier tier " + EnumChatFormatting.DARK_PURPLE + 1)
+ .addInfo("Requires a Neutronium Nanite to use tier " + EnumChatFormatting.DARK_PURPLE + 2)
+ .addInfo("Requires a Transcendent Metal Nanite to use tier " + EnumChatFormatting.DARK_PURPLE + 3)
+ .addInfo("--------------------------------------------")
+ .addInfo("If a recipe's tier is lower than the tier of the Nano Forge")
+ .addInfo("it gains " + EnumChatFormatting.RED + "perfect overclock" + EnumChatFormatting.GRAY + ".")
+ .addInfo(AuthorBlueWeabo)
+ .addSeparator()
+ .beginStructureBlock(30, 38, 13, false)
+ .addStructureInfo("Nano Forge Structure is too complex! See schematic for details.")
+ .addStructureInfo("--------------------------------------------")
+ .addStructureInfo("Tier " + EnumChatFormatting.DARK_PURPLE + 1 + EnumChatFormatting.GRAY)
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "527" + EnumChatFormatting.GRAY + " Radiant Naquadah Alloy Casing")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "171" + EnumChatFormatting.GRAY + " Stellar Alloy Frame Box")
+ .addStructureInfo("--------------------------------------------")
+ .addStructureInfo("Tier " + EnumChatFormatting.DARK_PURPLE + 2 + EnumChatFormatting.GRAY)
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "148" + EnumChatFormatting.GRAY + " Radiant Naquadah Alloy Casing")
+ .addStructureInfo(EnumChatFormatting.GOLD + "16" + EnumChatFormatting.GRAY + " Assembling Line Casing")
+ .addStructureInfo("--------------------------------------------")
+ .addStructureInfo("Tier " + EnumChatFormatting.DARK_PURPLE + 3 + EnumChatFormatting.GRAY)
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "228" + EnumChatFormatting.GRAY + " Radiant Naquadah Alloy Casing")
+ .addStructureInfo(EnumChatFormatting.GOLD + "84" + EnumChatFormatting.GRAY + " Stellar Alloy Frame Box")
+ .addStructureInfo(EnumChatFormatting.GOLD + "16" + EnumChatFormatting.GRAY + " Assembling Line Casing")
+ .addStructureInfo("--------------------------------------------")
+ .addStructureInfo("Requires " + EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "-"
+ + EnumChatFormatting.GOLD + "2" + EnumChatFormatting.GRAY + " energy hatches or "
+ + EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + " TT energy hatch.")
+ .addStructureInfo(
+ "Requires " + EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + " maintenance hatch.")
+ .addStructureInfo("Requires " + EnumChatFormatting.GOLD + 0 + EnumChatFormatting.GRAY + "+"
+ + EnumChatFormatting.GRAY + " input hatches.")
+ .addStructureInfo("Requires " + EnumChatFormatting.GOLD + 0 + EnumChatFormatting.GRAY + "+"
+ + EnumChatFormatting.GRAY + " output hatches.")
+ .addStructureInfo("Requires " + EnumChatFormatting.GOLD + 1 + EnumChatFormatting.GRAY + "+"
+ + EnumChatFormatting.GRAY + " input busses.")
+ .addStructureInfo("Requires " + EnumChatFormatting.GOLD + 1 + EnumChatFormatting.GRAY + "+"
+ + EnumChatFormatting.GRAY + " output busses.")
+ .addStructureInfo("--------------------------------------------")
+ .toolTipFinisher("GregTech");
+ return tt;
+ }
+
+ @Override
+ public final void onScrewdriverRightClick(byte aSide, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ mSeparate = !mSeparate;
+ GT_Utility.sendChatToPlayer(
+ aPlayer, StatCollector.translateToLocal("GT5U.machines.separatebus") + " " + mSeparate);
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PCBFactory.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PCBFactory.java
new file mode 100644
index 0000000000..8b9cb2c373
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PCBFactory.java
@@ -0,0 +1,1120 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.*;
+import static gregtech.api.enums.GT_HatchElement.*;
+import static gregtech.api.enums.GT_Values.AuthorBlueWeabo;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_GLOW;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofFrame;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+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.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizons.modularui.api.drawable.Text;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.math.Color;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn;
+import com.gtnewhorizons.modularui.common.widget.DynamicPositionedRow;
+import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.GregTechTileClientEvents;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ExoticEnergyInputHelper;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.blocks.GT_Block_Casings8;
+import java.util.ArrayList;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+@SuppressWarnings("SpellCheckingInspection")
+public class GT_MetaTileEntity_PCBFactory
+ extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase<GT_MetaTileEntity_PCBFactory>
+ implements ISurvivalConstructable {
+ private static final String tier1 = "tier1";
+ private static final String tier2 = "tier2";
+ private static final String tier3 = "tier3";
+ private static final String bioUpgrade = "bioUpgrade";
+ private static final String ocTier1Upgrade = "ocTier1Upgrade";
+ private static final String ocTier2Upgrade = "ocTier2Upgrade";
+ private boolean mSeparate = false;
+ private float mRoughnessMultiplier = 1;
+ private int mTier = 1, mSetTier = 1, mUpgradesInstalled = 0;
+ private boolean mBioUpgrade = false, mBioRotate = false, mOCTier1 = false, mOCTier2 = false;
+ private int[] mBioOffsets = new int[] {-5, -1},
+ mOCTier1Offsets = new int[] {2, -11},
+ mOCTier2Offsets = new int[] {2, -11};
+ private GT_MetaTileEntity_Hatch_Input mCoolantInputHatch;
+ private static final int mBioBitMap = 0b1000;
+ private static final int mTier3BitMap = 0b100;
+ private static final int mTier2BitMap = 0b10;
+ private static final int mTier1BitMap = 0b1;
+ private static final int COOLANT_CONSUMED_PER_SEC = 10;
+ private static final IStructureDefinition<GT_MetaTileEntity_PCBFactory> STRUCTURE_DEFINITION =
+ StructureDefinition.<GT_MetaTileEntity_PCBFactory>builder()
+ .addShape(tier1, transpose(new String[][] {
+ // spotless:off
+ {" ","E E","E E","EEEEEEE","E E","E E"," "},
+ {"EEEEEEE","CAAAAAC","CAAAAAC","CCCCCCC","CCCCCCC","CCCCCCC","E E"},
+ {"EAAAAAE","C-----C","C-----C","C-----C","C-----C","C-----C","ECCCCCE"},
+ {"EAAAAAE","C-----C","B-----B","B-----B","B-----B","C-----C","ECCCCCE"},
+ {"EAAAAAE","C-----C","B-FFF-B","B-FFF-B","B-FFF-B","C-----C","EPPPPPE"},
+ {"ECC~CCE","CDDDDDC","CDDDDDC","CDDDDDC","CDDDDDC","CDDDDDC","EPPPPPE"}
+ //spotless:on
+ }))
+ .addShape(tier2, transpose(new String[][] {
+ // spotless:off
+ {" "," "," ","HGGH","HGGH","HGGH","HGGH","HGGH"," "," "," "},
+ {" "," ","HGGH","GGGG","GGGG","GGGG","GGGG","GGGG","HGGH"," "," "},
+ {" ","HGGH","GGGG","G G","G G","G G","G G","G G","GGGG","HGGH"," "},
+ {" ","HGGH","G G","G G","G G","G G","G G","G G","G G","HGGH"," "},
+ {"HGGH","G G","G G","G G","G G","G G","G G","G G","G G","G G","HGGH"},
+ {"HGGH","G G","G G","G G","G G","G G","G G","G G","G G","G G","HGGH"},
+ {"HGGH","GGGG","GGGG","GGGG","GGGG","GGGG","GGGG","GGGG","GGGG","GGGG","HGGH"}
+ //spotless:on
+ }))
+ .addShape(tier3, transpose(new String[][] {
+ // spotless:off
+ {" "," "," "," "," I "," I "," "," "," "," "},
+ {" "," "," "," I "," I "," I "," I "," "," "," "},
+ {" "," "," KKK "," KIK "," K K "," K K "," I "," "," "," "},
+ {" "," "," KKK "," K K "," K K "," K K "," I "," "," "," "},
+ {" "," III "," I I "," I I "," I I "," K K "," I "," "," "," "},
+ {" "," III "," I I "," I I "," I I "," K K "," I "," "," "," "},
+ {" "," III "," I I "," I I "," I I "," K K "," KIK "," "," "," "},
+ {" "," I I "," I K I "," I I "," I I "," K K "," KIK "," "," "," "},
+ {" "," I I "," I K I "," I I "," I I "," K K "," K K "," KKK "," "," "},
+ {" "," I I "," I K I "," I I "," I I "," K K "," K K "," KKK "," "," "},
+ {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "},
+ {" "," III "," I I "," K K "," K K "," K K "," K K "," I I "," III "," "},
+ {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "},
+ {" "," "," KKK "," K K "," K K "," I I "," I I "," I I "," III "," "},
+ {" "," "," KKK "," K K "," K K "," I I "," I I "," I I "," III "," "},
+ {" "," "," KKK "," K K "," K K "," I I "," I I "," I I "," III "," "},
+ {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "},
+ {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "},
+ {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "},
+ {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "},
+ {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "},
+ {" II~II ","IIJJJII","IJJJJJI","IJJJJJI","IJJJJJI","IJJJJJI","IJJJJJI","IJJJJJI","IIJJJII"," IIIII "}
+ //spotless:on
+ }))
+ .addShape(bioUpgrade, transpose(new String[][] {
+ // spotless:off
+ {" "," "," LLLLLL "," "," "},
+ {" "," "," L L "," "," "},
+ {"E E E E"," LLL LLL "," LLL LLL "," LLL LLL ","E E E E"},
+ {"EAAAE EAAAE","A A A A","A A A A","A A A A","EAAAE EAAAE"},
+ {"EAAAE EAAAE","A A A A","A A A A","A A A A","EAAAE EAAAE"},
+ {"EAAAE EAAAE","A A A A","A A A A","A A A A","EAAAE EAAAE"},
+ {"ELLLE ELLLE","LLLLL LLLLL","LLLLL LLLLL","LLLLL LLLLL","ELLLE ELLLE"}
+ //spotless:on
+ }))
+ .addShape(ocTier1Upgrade, transpose(new String[][] {
+ // spotless:off
+ {"EKKKE","K K","K K","K K","EKKKE"},
+ {"E E"," KKK "," K K "," KKK ","E E"},
+ {"E E"," NNN "," N N "," NNN ","E E"},
+ {"E E"," KKK "," K K "," KKK ","E E"},
+ {"E E"," KKK "," K K "," KKK ","E E"},
+ {"EOOOE","OKKKO","OK KO","OKKKO","EOOOE"},
+ {"E E"," KKK "," K K "," KKK ","E E"},
+ {"E E"," KKK "," K K "," KKK ","E E"},
+ {"ENNNE","NKKKN","NK KN","NKKKN","ENNNE"},
+ {"EMMME","MMMMM","MMMMM","MMMMM","EMMME"}
+ //spotless:on
+ }))
+ .addShape(ocTier2Upgrade, transpose(new String[][] {
+ // spotless:off
+ {"RGGGR","G G","G G","G G","RGGGR"},
+ {"R R"," GGG "," GTG "," GGG ","R R"},
+ {"R R"," NNN "," NTN "," NNN ","R R"},
+ {"R R"," QQQ "," QTQ "," QQQ ","R R"},
+ {"R R"," QQQ "," QTQ "," QQQ ","R R"},
+ {"R R"," QQQ "," QTQ "," QQQ ","R R"},
+ {"R R"," QQQ "," QTQ "," QQQ ","R R"},
+ {"R R"," QQQ "," QTQ "," QQQ ","R R"},
+ {"RNNNR","NQQQN","NQPQN","NQQQN","RNNNR"},
+ {"RSSSR","SSSSS","SSSSS","SSSSS","RSSSR"}
+ //spotless:on
+ }))
+ .addElement('E', ofFrame(Materials.DamascusSteel))
+ .addElement('C', ofBlock(GregTech_API.sBlockCasings8, 11))
+ .addElement('D', ofBlock(GregTech_API.sBlockReinforced, 2))
+ .addElement(
+ 'A',
+ ofChain(
+ ofBlockUnlocalizedName("IC2", "blockAlloyGlass", 0, true),
+ ofBlockUnlocalizedName("bartworks", "BW_GlasBlocks", 0, true),
+ ofBlockUnlocalizedName("bartworks", "BW_GlasBlocks2", 0, true),
+ // warded glass
+ ofBlockUnlocalizedName("Thaumcraft", "blockCosmeticOpaque", 2, false)))
+ .addElement('B', ofBlock(GregTech_API.sBlockCasings3, 10))
+ .addElement('F', ofFrame(Materials.VibrantAlloy))
+ .addElement(
+ 'P',
+ buildHatchAdder(GT_MetaTileEntity_PCBFactory.class)
+ .atLeast(InputHatch, OutputBus, InputBus, Maintenance, Energy.or(ExoticEnergy))
+ .dot(1)
+ .casingIndex(((GT_Block_Casings8) GregTech_API.sBlockCasings8).getTextureIndex(11))
+ .buildAndChain(GregTech_API.sBlockCasings8, 11))
+ .addElement('H', ofFrame(Materials.Duranium))
+ .addElement('G', ofBlock(GregTech_API.sBlockCasings8, 12))
+ .addElement('I', ofBlock(GregTech_API.sBlockCasings8, 13))
+ .addElement('K', ofBlock(GregTech_API.sBlockCasings8, 10))
+ .addElement(
+ 'J',
+ buildHatchAdder(GT_MetaTileEntity_PCBFactory.class)
+ .atLeast(InputHatch, OutputBus, InputBus, Maintenance, Energy.or(ExoticEnergy))
+ .dot(1)
+ .casingIndex(((GT_Block_Casings8) GregTech_API.sBlockCasings8).getTextureIndex(13))
+ .buildAndChain(GregTech_API.sBlockCasings8, 13))
+ .addElement('L', ofBlock(GregTech_API.sBlockCasings4, 1))
+ .addElement(
+ 'M',
+ // spotless:off
+ ofChain(
+ ofChain(InputHatch.withAdder(GT_MetaTileEntity_PCBFactory::addCoolantInputToMachineList)
+ .withCount(t -> isValidMetaTileEntity(t.mCoolantInputHatch) ? 1 : 0)
+ .newAny(((GT_Block_Casings8) GregTech_API.sBlockCasings8).getTextureIndex(10),2),
+ ofBlock(GregTech_API.sBlockCasings8, 12))))
+ //spotless:on
+ .addElement('N', ofBlock(GregTech_API.sBlockCasings2, 15))
+ .addElement('O', ofBlock(GregTech_API.sBlockCasings8, 4))
+ .addElement(
+ 'S',
+ // spotless:off
+ ofChain(InputHatch.withAdder(GT_MetaTileEntity_PCBFactory::addCoolantInputToMachineList)
+ .withCount(t -> isValidMetaTileEntity(t.mCoolantInputHatch) ? 1 : 0)
+ .newAny(((GT_Block_Casings8) GregTech_API.sBlockCasings8).getTextureIndex(12),2),
+ ofBlock(GregTech_API.sBlockCasings8, 12)))
+ //spotless:on
+ .addElement('R', ofFrame(Materials.Americium))
+ .addElement('Q', ofBlock(GregTech_API.sBlockCasings8, 14))
+ .addElement('T', ofBlock(GregTech_API.sBlockCasings1, 15))
+ .build();
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ if (mSetTier < 3) {
+ buildPiece(tier1, stackSize, hintsOnly, 3, 5, 0);
+ if (mSetTier == 2) {
+ buildPiece(tier2, stackSize, hintsOnly, 7, 6, 2);
+ }
+ } else {
+ buildPiece(tier3, stackSize, hintsOnly, 3, 21, 0);
+ }
+
+ if (mBioUpgrade) {
+ if (mBioRotate) {
+ final IGregTechTileEntity tTile = getBaseMetaTileEntity();
+ getStructureDefinition()
+ .buildOrHints(
+ this,
+ stackSize,
+ bioUpgrade,
+ tTile.getWorld(),
+ transformFacing(getExtendedFacing()),
+ tTile.getXCoord(),
+ tTile.getYCoord(),
+ tTile.getZCoord(),
+ mBioOffsets[1],
+ 6,
+ mBioOffsets[0],
+ hintsOnly);
+ } else {
+ buildPiece(bioUpgrade, stackSize, hintsOnly, mBioOffsets[0], 6, mBioOffsets[1]);
+ }
+ }
+
+ if (mOCTier1 && !mOCTier2) {
+ buildPiece(ocTier1Upgrade, stackSize, hintsOnly, mOCTier1Offsets[0], 9, mOCTier1Offsets[1]);
+ }
+
+ if (!mOCTier1 && mOCTier2) {
+ buildPiece(ocTier2Upgrade, stackSize, hintsOnly, mOCTier2Offsets[0], 9, mOCTier2Offsets[1]);
+ }
+ }
+
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ int built = 0;
+ if (mSetTier < 3) {
+ built += survivialBuildPiece(tier1, stackSize, 3, 5, 0, elementBudget, env, false, true);
+ if (mSetTier == 2) {
+ built += survivialBuildPiece(tier2, stackSize, 7, 6, 2, elementBudget, env, false, true);
+ }
+ } else {
+ built += survivialBuildPiece(tier3, stackSize, 3, 21, 0, elementBudget, env, false, true);
+ }
+
+ if (mBioUpgrade) {
+ if (mBioRotate) {
+ final IGregTechTileEntity tTile = getBaseMetaTileEntity();
+ getStructureDefinition()
+ .survivalBuild(
+ this,
+ stackSize,
+ bioUpgrade,
+ tTile.getWorld(),
+ transformFacing(getExtendedFacing()),
+ tTile.getXCoord(),
+ tTile.getYCoord(),
+ tTile.getZCoord(),
+ mBioOffsets[1],
+ 6,
+ mBioOffsets[0],
+ elementBudget,
+ env,
+ false);
+ } else {
+ built += survivialBuildPiece(
+ bioUpgrade, stackSize, mBioOffsets[0], 6, mBioOffsets[2], elementBudget, env, false, true);
+ }
+ }
+
+ if (mOCTier1 && !mOCTier2) {
+ built += survivialBuildPiece(
+ ocTier1Upgrade,
+ stackSize,
+ mOCTier1Offsets[0],
+ 9,
+ mOCTier1Offsets[1],
+ elementBudget,
+ env,
+ false,
+ true);
+ }
+ if (!mOCTier1 && mOCTier2) {
+ built += survivialBuildPiece(
+ ocTier2Upgrade,
+ stackSize,
+ mOCTier2Offsets[0],
+ 9,
+ mOCTier2Offsets[1],
+ elementBudget,
+ env,
+ false,
+ true);
+ }
+
+ return built;
+ }
+
+ public GT_MetaTileEntity_PCBFactory(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_PCBFactory(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_PCBFactory(this.mName);
+ }
+
+ @Override
+ public ITexture[] getTexture(
+ IGregTechTileEntity aBaseMetaTileEntity,
+ byte aSide,
+ byte aFacing,
+ byte aColorIndex,
+ boolean aActive,
+ boolean aRedstone) {
+ if (aSide == aFacing) {
+ if (aActive)
+ return new ITexture[] {
+ BlockIcons.getCasingTextureForId(
+ getTier() < 3
+ ? GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 11)
+ : GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 11)),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW)
+ .extFacing()
+ .glow()
+ .build()
+ };
+ return new ITexture[] {
+ BlockIcons.getCasingTextureForId(
+ getTier() < 3
+ ? GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 11)
+ : GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 11)),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_GLOW)
+ .extFacing()
+ .glow()
+ .build()
+ };
+ }
+ return new ITexture[] {
+ BlockIcons.getCasingTextureForId(
+ mSetTier < 3
+ ? ((GT_Block_Casings8) GregTech_API.sBlockCasings8).getTextureIndex(11)
+ : ((GT_Block_Casings8) GregTech_API.sBlockCasings8).getTextureIndex(13))
+ };
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_PCBFactory> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mTier = 0;
+ if (mSetTier < 3) {
+ if (!checkPiece(tier1, 3, 5, 0)) {
+ return false;
+ }
+
+ if (mSetTier == 2 && checkPiece(tier2, 7, 6, 2)) {
+ mTier = 2;
+ } else {
+ mTier = 1;
+ }
+ } else {
+ if (!checkPiece(tier3, 3, 21, 0)) {
+ return false;
+ }
+ mTier = 3;
+ }
+
+ if (mBioUpgrade) {
+ if (mBioRotate) {
+ final IGregTechTileEntity tTile = getBaseMetaTileEntity();
+ if (!getStructureDefinition()
+ .check(
+ this,
+ bioUpgrade,
+ tTile.getWorld(),
+ transformFacing(getExtendedFacing()),
+ tTile.getXCoord(),
+ tTile.getYCoord(),
+ tTile.getZCoord(),
+ mBioOffsets[1],
+ 6,
+ mBioOffsets[0],
+ !mMachine)) {
+ return false;
+ }
+ } else {
+ if (!checkPiece(bioUpgrade, mBioOffsets[0], 6, mBioOffsets[1])) {
+ return false;
+ }
+ }
+ mUpgradesInstalled++;
+ }
+
+ if (mOCTier1 && !mOCTier2) {
+ if (!checkPiece(ocTier1Upgrade, mOCTier1Offsets[0], 9, mOCTier1Offsets[1])) {
+ return false;
+ }
+ mUpgradesInstalled++;
+ }
+
+ if (mOCTier2 && !mOCTier1) {
+ if (!checkPiece(ocTier2Upgrade, mOCTier2Offsets[0], 9, mOCTier2Offsets[1])) {
+ return false;
+ }
+ mUpgradesInstalled++;
+ }
+
+ getBaseMetaTileEntity().sendBlockEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, getUpdateData());
+
+ if (mMaintenanceHatches.size() != 1
+ || mOutputBusses.isEmpty()
+ || mInputBusses.isEmpty()
+ || mInputHatches.isEmpty()) {
+ return false;
+ }
+
+ // Makes sure that the multi can accept only 1 TT Energy Hatch OR up to 2 Normal Energy Hatches. Deform if both
+ // present or more than 1 TT Hatch.
+ boolean hatch = mExoticEnergyHatches.size() == 1 ^ (mEnergyHatches.size() <= 2 && !mEnergyHatches.isEmpty());
+
+ return mTier > 0 && hatch;
+ }
+
+ @Override
+ public GT_Recipe.GT_Recipe_Map getRecipeMap() {
+ return GT_Recipe.GT_Recipe_Map.sPCBFactory;
+ }
+
+ @Override
+ public boolean checkRecipe(ItemStack aStack) {
+ GT_Recipe.GT_Recipe_Map aMap = getRecipeMap();
+ FluidStack[] tFluidInputs = getCompactedFluids();
+ if (mSeparate) {
+ ArrayList<ItemStack> tInputList = new ArrayList<ItemStack>();
+ for (GT_MetaTileEntity_Hatch_InputBus tBus : mInputBusses) {
+ for (int i = tBus.getSizeInventory() - 1; i >= 0; i--) {
+ if (tBus.getStackInSlot(i) != null) tInputList.add(tBus.getStackInSlot(i));
+ }
+ ItemStack[] tInputs = tInputList.toArray(new ItemStack[0]);
+ if (processRecipe(aStack, tInputs, tFluidInputs, aMap)) return true;
+ else tInputList.clear();
+ }
+ } else {
+ ItemStack[] tItemInputs = getStoredInputs().toArray(new ItemStack[0]);
+ return processRecipe(aStack, tItemInputs, tFluidInputs, aMap);
+ }
+
+ return false;
+ }
+
+ private boolean processRecipe(
+ ItemStack aStack, ItemStack[] tItemInputs, FluidStack[] aFluidInputs, GT_Recipe.GT_Recipe_Map aMap) {
+ mOutputItems = null;
+ mOutputFluids = null;
+ if (tItemInputs == null || aFluidInputs == null) {
+ return false;
+ }
+
+ long voltage = GT_ExoticEnergyInputHelper.getMaxInputVoltageMulti(getExoticAndNormalEnergyHatchList());
+ long amps = GT_ExoticEnergyInputHelper.getMaxInputAmpsMulti(getExoticAndNormalEnergyHatchList());
+ long tTotalEU = voltage * amps;
+
+ GT_Recipe tRecipe = aMap.findRecipe(getBaseMetaTileEntity(), true, true, voltage, aFluidInputs, tItemInputs);
+
+ if (tRecipe == null) {
+ return false;
+ }
+
+ int recipeBitMap = tRecipe.mSpecialValue;
+
+ int aNanitesOfRecipe = 0;
+
+ ItemStack aNanite = tRecipe.getRepresentativeInput(0);
+ if (GT_OreDictUnificator.getAssociation(aNanite).mPrefix.equals(OrePrefixes.nanite)) {
+ for (ItemStack aItem : tItemInputs) {
+ if (aItem.isItemEqual(aNanite)) {
+ aNanitesOfRecipe += aItem.stackSize;
+ }
+ }
+ }
+
+ int aMaxParallel = (int) Math.max(Math.ceil(Math.log(aNanitesOfRecipe) / Math.log(2)), 1);
+ float aExtraPower = (float) Math.ceil(Math.sqrt(mUpgradesInstalled == 0 ? 1 : mUpgradesInstalled));
+
+ if (tRecipe.mEUt > voltage) {
+ return false;
+ }
+
+ if (((recipeBitMap & mTier1BitMap) == 1
+ || (recipeBitMap & mTier2BitMap) == 1
+ || (recipeBitMap & mTier3BitMap) == 1)
+ && ((recipeBitMap & mBioBitMap) == 0 || (recipeBitMap & mBioBitMap) == 1 == mBioUpgrade)) {
+
+ int aCurrentParallel = 0;
+ for (int i = 0; i < aMaxParallel; i++) {
+ if (tRecipe.isRecipeInputEqual(true, aFluidInputs, tItemInputs)) {
+ aCurrentParallel++;
+ } else {
+ break;
+ }
+ }
+
+ if (aCurrentParallel > 0) {
+ this.mEfficiency = (getMaxEfficiency(aStack) - (getIdealStatus() - getRepairStatus()) * 1000);
+ this.mEfficiencyIncrease = getMaxEfficiency(aStack);
+ this.lEUt = (long) -Math.ceil(tRecipe.mEUt * aCurrentParallel * aExtraPower);
+ this.mMaxProgresstime = (int) Math.ceil(tRecipe.mDuration * Math.pow(mRoughnessMultiplier, 2));
+
+ if (mOCTier1 || mOCTier2) {
+ calculateOverclockedNessMultiInternal(
+ (long) Math.ceil(tRecipe.mEUt * aCurrentParallel * aExtraPower),
+ (int) Math.ceil(tRecipe.mDuration * Math.pow(mRoughnessMultiplier, 2)),
+ 1,
+ tTotalEU,
+ mOCTier2);
+ }
+
+ if (this.lEUt == Long.MAX_VALUE - 1 || this.mProgresstime == Integer.MAX_VALUE - 1) return false;
+
+ if (this.lEUt > 0) {
+ this.lEUt *= -1;
+ }
+
+ mOutputItems = new ItemStack[tRecipe.mOutputs.length];
+ ArrayList<ItemStack> tOutputs = new ArrayList<ItemStack>();
+ int remainingEfficiency = getMaxEfficiency(aStack);
+ int repeats = (int) Math.ceil(getMaxEfficiency(aStack) / 10000);
+ for (int j = 0; j < repeats; j++) {
+ int chanced = getBaseMetaTileEntity().getRandomNumber(10000);
+ for (int i = 0; i < tRecipe.mOutputs.length; i++) {
+ if (chanced < remainingEfficiency) {
+ tOutputs.add(tRecipe.getOutput(i));
+ }
+ }
+ remainingEfficiency -= 10000;
+ }
+
+ mOutputItems = tOutputs.toArray(new ItemStack[0]);
+ mOutputFluids = tRecipe.mFluidOutputs.clone();
+ updateSlots();
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private int ticker = 0;
+
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ if (!super.onRunningTick(aStack)) {
+ criticalStopMachine();
+ return false;
+ }
+
+ if (ticker % 20 == 0) {
+ if (mOCTier1) {
+ if (!depleteInput(GT_ModHandler.getDistilledWater(COOLANT_CONSUMED_PER_SEC))) {
+ criticalStopMachine();
+ return false;
+ }
+ }
+
+ if (mOCTier2) {
+ Fluid superCoolant = FluidRegistry.getFluid("supercoolant");
+ if (!depleteInput(new FluidStack(superCoolant, COOLANT_CONSUMED_PER_SEC))) {
+ criticalStopMachine();
+ return false;
+ }
+ }
+ ticker = 0;
+ }
+
+ ticker++;
+
+ return true;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return (int) (mRoughnessMultiplier * 10000);
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ private int getTier() {
+ return mSetTier;
+ }
+
+ @Override
+ public void receiveClientEvent(byte aEventID, byte aValue) {
+ if (aEventID == 1) {
+ mSetTier = aValue;
+ }
+ }
+
+ private ExtendedFacing transformFacing(ExtendedFacing facing) {
+ ForgeDirection curDirection = facing.getDirection();
+ Rotation curRotation = facing.getRotation();
+ Flip curFlip = facing.getFlip();
+ ForgeDirection newDirection = curDirection;
+ Rotation newRotation = curRotation;
+ Flip newFlip = curFlip;
+
+ if (curDirection == ForgeDirection.UP || curDirection == ForgeDirection.DOWN) {
+ switch (curRotation) {
+ case CLOCKWISE:
+ case COUNTER_CLOCKWISE:
+ newFlip = curFlip == Flip.NONE ? Flip.HORIZONTAL : Flip.NONE;
+ newDirection = curDirection == ForgeDirection.UP ? ForgeDirection.NORTH : ForgeDirection.SOUTH;
+ break;
+ case NORMAL:
+ newRotation = curDirection == ForgeDirection.UP ? Rotation.CLOCKWISE : Rotation.COUNTER_CLOCKWISE;
+ newDirection = curDirection == ForgeDirection.UP ? ForgeDirection.EAST : ForgeDirection.WEST;
+ newFlip = Flip.NONE;
+ break;
+ case UPSIDE_DOWN:
+ newRotation = curDirection == ForgeDirection.UP ? Rotation.COUNTER_CLOCKWISE : Rotation.CLOCKWISE;
+ newDirection = curDirection == ForgeDirection.UP ? ForgeDirection.EAST : ForgeDirection.WEST;
+ newFlip = Flip.NONE;
+ break;
+ }
+ } else if (curRotation == Rotation.CLOCKWISE || curRotation == Rotation.COUNTER_CLOCKWISE) {
+ newFlip = curRotation == Rotation.CLOCKWISE
+ ? curFlip == Flip.NONE ? Flip.NONE : Flip.HORIZONTAL
+ : curFlip != Flip.NONE ? Flip.NONE : Flip.HORIZONTAL;
+ newDirection = curRotation == Rotation.CLOCKWISE ? ForgeDirection.UP : ForgeDirection.DOWN;
+ } else {
+ switch (curDirection) {
+ case EAST:
+ newDirection = ForgeDirection.SOUTH;
+ break;
+ case NORTH:
+ newDirection = ForgeDirection.EAST;
+ break;
+ case WEST:
+ newDirection = ForgeDirection.NORTH;
+ break;
+ case SOUTH:
+ newDirection = ForgeDirection.WEST;
+ break;
+ default:
+ newDirection = curDirection;
+ }
+ }
+
+ if (curRotation == Rotation.UPSIDE_DOWN) {
+ if (curDirection != ForgeDirection.UP && curDirection != ForgeDirection.DOWN) {
+ newFlip = curFlip == Flip.NONE ? Flip.HORIZONTAL : Flip.NONE;
+ }
+ }
+
+ return ExtendedFacing.of(newDirection, newRotation, newFlip);
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ public boolean addCoolantInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mRecipeMap = getRecipeMap();
+ mCoolantInputHatch = (GT_MetaTileEntity_Hatch_Input) aMetaTileEntity;
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Circuit Board Fabricator")
+ .addInfo("Controller block for the PCB Factory")
+ .addInfo(EnumChatFormatting.GOLD.toString() + EnumChatFormatting.BOLD + "IMPORTANT!"
+ + " Check out the configurations menu before building.")
+ .addInfo("The tier is selected in the controller GUI. Determines avaliable recipes.")
+ .addInfo("The configuration menu can be used to add upgrades.")
+ .addInfo("The parallel of the current recipe is Log₂(nanites used), rounded up.")
+ .addInfo("Coolant tier determines overclock ability. No cooler allows no overclocking.")
+ .addInfo("Tier " + EnumChatFormatting.DARK_PURPLE + 1 + EnumChatFormatting.GRAY
+ + " cooler allows regular overclocking, takes 10L/s of coolant.")
+ .addInfo("Tier " + EnumChatFormatting.DARK_PURPLE + 2 + EnumChatFormatting.GRAY
+ + " allows perfect overclocking, takes 10L/s of space coolant.")
+ .addInfo("Machine power consumption multiplies by sqrt(upgrade count).")
+ .addInfo("I.e. cooler + bio upgrade = sqrt(2) power consumption multiplier.")
+ .addInfo(AuthorBlueWeabo)
+ .beginStructureBlock(30, 38, 13, false)
+ .addSeparator()
+ .addMaintenanceHatch(EnumChatFormatting.GOLD + "1", 1)
+ .addEnergyHatch(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+", 1)
+ .addInputBus(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+", 1)
+ .addOutputBus(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+", 1)
+ .addInputHatch(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "+", 1)
+ .addStructureInfo("Coolant Hatch (Input Hatch): " + EnumChatFormatting.GOLD + "1")
+ .addStructureInfo(EnumChatFormatting.BLUE + "Base Multi (Tier " + EnumChatFormatting.DARK_PURPLE + 1
+ + EnumChatFormatting.BLUE + "):")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "40" + EnumChatFormatting.GRAY + " Damascus Steel Frame Box")
+ .addStructureInfo(EnumChatFormatting.GOLD + "9" + EnumChatFormatting.GRAY + " Vibrant Alloy Frame Box")
+ .addStructureInfo(EnumChatFormatting.GOLD + "25" + EnumChatFormatting.GRAY + " Reinforced Glass")
+ .addStructureInfo(EnumChatFormatting.GOLD + "77" + EnumChatFormatting.GRAY
+ + " Basic Photolithography Framework Casing")
+ .addStructureInfo(EnumChatFormatting.GOLD + "12" + EnumChatFormatting.GRAY + " Grate Machine Casing")
+ .addStructureInfo(EnumChatFormatting.GOLD + "25" + EnumChatFormatting.GRAY + " Plascrete Block")
+ .addStructureInfo(EnumChatFormatting.BLUE + "Tier " + EnumChatFormatting.DARK_PURPLE + 2
+ + EnumChatFormatting.BLUE + " (Adds to Tier " + EnumChatFormatting.DARK_PURPLE + 1
+ + EnumChatFormatting.BLUE + "):")
+ .addStructureInfo(EnumChatFormatting.GOLD + "34" + EnumChatFormatting.GRAY + " Duranium Frame Box")
+ .addStructureInfo(EnumChatFormatting.GOLD + "158" + EnumChatFormatting.GRAY
+ + " Reinforced Photolithography Framework Casing")
+ .addStructureInfo(EnumChatFormatting.BLUE + "Tier " + EnumChatFormatting.DARK_PURPLE + 3
+ + EnumChatFormatting.BLUE + ":")
+ .addStructureInfo(EnumChatFormatting.GOLD + "292" + EnumChatFormatting.GRAY
+ + " Radiation Proof Photolithography Framework Casing")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "76" + EnumChatFormatting.GRAY + " Radiant Naquadah Alloy Casing")
+ .addStructureInfo(EnumChatFormatting.BLUE + "Bio Upgrade")
+ .addStructureInfo(EnumChatFormatting.GOLD + "68" + EnumChatFormatting.GRAY
+ + " Clean Stainless Steel Machine Casing")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "40" + EnumChatFormatting.GRAY + " Damascus Steel Frame Box")
+ .addStructureInfo(EnumChatFormatting.GOLD + "72" + EnumChatFormatting.GRAY + " Reinforced Glass")
+ .addStructureInfo(EnumChatFormatting.BLUE + "Cooler Upgrade Tier " + EnumChatFormatting.DARK_PURPLE + 1
+ + EnumChatFormatting.BLUE + ":")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "40" + EnumChatFormatting.GRAY + " Damascus Steel Frame Box")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "68" + EnumChatFormatting.GRAY + " Radiant Naquadah Alloy Casing")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "12" + EnumChatFormatting.GRAY + " Extreme Engine Intake Casing")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "20" + EnumChatFormatting.GRAY + " Tungstensteel Pipe Casing")
+ .addStructureInfo(EnumChatFormatting.GOLD + "21" + EnumChatFormatting.GRAY
+ + " Reinforced Photolithography Framework Casing")
+ .addStructureInfo(EnumChatFormatting.BLUE + "Cooler Upgrade Tier " + EnumChatFormatting.DARK_PURPLE + 2
+ + EnumChatFormatting.BLUE + ":")
+ .addStructureInfo(EnumChatFormatting.GOLD + "40" + EnumChatFormatting.GRAY + " Americium Frame Box")
+ .addStructureInfo(EnumChatFormatting.GOLD + "41" + EnumChatFormatting.GRAY
+ + " Reinforced Photolithography Framework Casing")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "8" + EnumChatFormatting.GRAY + " Superconducting Coil Block")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "20" + EnumChatFormatting.GRAY + " Tungstensteel Pipe Casing")
+ .addStructureInfo(EnumChatFormatting.GOLD + "48" + EnumChatFormatting.GRAY + " Infinity Cooled Casing")
+ .toolTipFinisher("GregTech");
+ return tt;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("mSeparate", mSeparate);
+ aNBT.setBoolean("mBioUpgrade", mBioUpgrade);
+ aNBT.setBoolean("mBioRotate", mBioRotate);
+ aNBT.setInteger("mBioOffsetX", mBioOffsets[0]);
+ aNBT.setInteger("mBioOffsetZ", mBioOffsets[1]);
+ aNBT.setBoolean("mOCTier1Upgrade", mOCTier1);
+ aNBT.setInteger("mOCTier1OffsetX", mOCTier1Offsets[0]);
+ aNBT.setInteger("mOCTier1OffsetZ", mOCTier1Offsets[1]);
+ aNBT.setBoolean("mOCTier2Upgrade", mOCTier2);
+ aNBT.setInteger("mOCTier2OffsetX", mOCTier2Offsets[0]);
+ aNBT.setInteger("mOCTier2OffsetZ", mOCTier2Offsets[1]);
+ aNBT.setFloat("mRoughnessMultiplier", mRoughnessMultiplier);
+ aNBT.setInteger("mSetTier", mSetTier);
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mSeparate = aNBT.getBoolean("mSeparate");
+ mBioUpgrade = aNBT.getBoolean("mBioUpgrade");
+ mBioRotate = aNBT.getBoolean("mBioRotate");
+ mBioOffsets[0] = aNBT.getInteger("mBioOffsetX");
+ mBioOffsets[1] = aNBT.getInteger("mBioOffsetZ");
+ mOCTier1 = aNBT.getBoolean("mOCTier1Upgrade");
+ mOCTier1Offsets[0] = aNBT.getInteger("mOCTier1OffsetX");
+ mOCTier1Offsets[1] = aNBT.getInteger("mOCTier1OffsetZ");
+ mOCTier2 = aNBT.getBoolean("mOCTier2Upgrade");
+ mOCTier2Offsets[0] = aNBT.getInteger("mOCTier2OffsetX");
+ mOCTier2Offsets[1] = aNBT.getInteger("mOCTier2OffsetZ");
+ mRoughnessMultiplier = aNBT.getFloat("mRoughnessMultiplier");
+ mSetTier = aNBT.getInteger("mSetTier");
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public byte getUpdateData() {
+ return (byte) mSetTier;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ buildContext.addSyncedWindow(10, this::createConfigurationWindow);
+ builder.widget(new ButtonWidget()
+ .setOnClick((clickData, widget) -> {
+ if (!widget.isClient()) widget.getContext().openSyncedWindow(10);
+ })
+ .setSize(18, 18)
+ .setBackground(GT_UITextures.BUTTON_STANDARD)
+ .setBackground(GT_UITextures.OVERLAY_BUTTON_CYCLIC)
+ .addTooltip("Configuration Menu")
+ .setPos(151, 24))
+ .widget(new TextWidget(new Text("Tier"))
+ .setTextAlignment(Alignment.Center)
+ .setScale(0.91f)
+ .setSize(20, 16)
+ .setPos(152, 46))
+ .widget(new TextFieldWidget()
+ .setGetterInt(() -> mSetTier)
+ .setSetterInt(val -> {
+ mSetTier = val;
+ })
+ .setNumbers(-16, 16)
+ .setTextColor(Color.WHITE.normal)
+ .setTextAlignment(Alignment.Center)
+ .addTooltip("PCB Factory Tier")
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)
+ .setSize(18, 18)
+ .setPos(151, 61));
+ }
+
+ protected ModularWindow createConfigurationWindow(final EntityPlayer player) {
+ ModularWindow.Builder builder = ModularWindow.builder(200, 160);
+ builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT);
+ builder.setGuiTint(getGUIColorization());
+ builder.widget(new DrawableWidget()
+ .setDrawable(GT_UITextures.OVERLAY_BUTTON_CYCLIC)
+ .setPos(5, 5)
+ .setSize(16, 16))
+ .widget(new TextWidget("Configuration Menu").setPos(25, 9))
+ .widget(ButtonWidget.closeWindowButton(true).setPos(185, 3))
+ .widget(new DynamicPositionedColumn()
+ .setSynced(false)
+ .widget(new MultiChildWidget()
+ .addChild(new CycleButtonWidget()
+ .setToggle(() -> mBioUpgrade, val -> {
+ mBioUpgrade = val;
+ if (!mBioUpgrade) {
+ GT_Utility.sendChatToPlayer(
+ player, GT_Utility.trans("339.1", "Bio Upgrade Disabled"));
+ } else {
+ GT_Utility.sendChatToPlayer(
+ player, GT_Utility.trans("339", "Bio Upgrade Enabled"));
+ }
+ })
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setSize(90, 18)
+ .addTooltip("Required for Bioware and Wetware boards."))
+ .addChild(new DrawableWidget()
+ .setDrawable(GT_UITextures.OVERLAY_BUTTON_CYCLIC)
+ .setSize(18, 18))
+ .addChild(new TextWidget("Bio Upgrade")
+ .setTextAlignment(Alignment.Center)
+ .setPos(23, 5))
+ .setEnabled(widget -> !getBaseMetaTileEntity().isActive()))
+ .widget(new MultiChildWidget()
+ .addChild(new CycleButtonWidget()
+ .setToggle(() -> mBioRotate, val -> {
+ mBioRotate = val;
+ if (!mBioRotate) {
+ GT_Utility.sendChatToPlayer(
+ player,
+ GT_Utility.trans(
+ "340.1", "Rotate Bio Upgrade 90 Degrees Disabled"));
+ } else {
+ GT_Utility.sendChatToPlayer(
+ player,
+ GT_Utility.trans(
+ "340", "Rotate Bio Upgrade 90 Degrees Enabled"));
+ }
+ })
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setSize(90, 18)
+ .addTooltip("Switches around the X and Z axis, rotates the shape 90 degrees"))
+ .addChild(new DrawableWidget()
+ .setDrawable(GT_UITextures.OVERLAY_BUTTON_CYCLIC)
+ .setSize(18, 18))
+ .addChild(new TextWidget("Bio Rotation")
+ .setTextAlignment(Alignment.Center)
+ .setPos(23, 5))
+ .setEnabled(widget -> !getBaseMetaTileEntity().isActive()))
+ .widget(new MultiChildWidget()
+ .addChild(
+ new CycleButtonWidget()
+ .setToggle(() -> mOCTier1, val -> {
+ mOCTier1 = val;
+ if (!mOCTier1) {
+ GT_Utility.sendChatToPlayer(
+ player,
+ GT_Utility.trans("341.1", "Tier 1 OC Disabled"));
+ } else {
+ GT_Utility.sendChatToPlayer(
+ player, GT_Utility.trans("341", "Tier 1 OC Enabled"));
+ }
+ })
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setSize(90, 18)
+ .addTooltip(
+ "Incompatible with Tier 2, Requires a constant supply of distilled water. Allows for overclocking"))
+ .addChild(new DrawableWidget()
+ .setDrawable(GT_UITextures.OVERLAY_BUTTON_CYCLIC)
+ .setSize(18, 18))
+ .addChild(new TextWidget("Cooler Tier 1")
+ .setTextAlignment(Alignment.Center)
+ .setPos(20, 5))
+ .setEnabled(widget -> !getBaseMetaTileEntity().isActive()))
+ .widget(new MultiChildWidget()
+ .addChild(
+ new CycleButtonWidget()
+ .setToggle(() -> mOCTier2, val -> {
+ mOCTier2 = val;
+ if (!mOCTier2) {
+ GT_Utility.sendChatToPlayer(
+ player,
+ GT_Utility.trans("342.1", "Tier 2 OC Disabled"));
+ } else {
+ GT_Utility.sendChatToPlayer(
+ player, GT_Utility.trans("342", "Tier 2 OC Enabled"));
+ }
+ })
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setSize(90, 18)
+ .addTooltip(
+ "Incompatible with Tier 1, Requires a constant supply of super coolant. Allows for perfect overclocking"))
+ .addChild(new DrawableWidget()
+ .setDrawable(GT_UITextures.OVERLAY_BUTTON_CYCLIC)
+ .setSize(18, 18))
+ .addChild(new TextWidget("Cooler Tier 2")
+ .setTextAlignment(Alignment.Center)
+ .setPos(20, 5))
+ .setEnabled(widget -> !getBaseMetaTileEntity().isActive()))
+ .widget(new TextWidget(new Text("Roughness Multiplier"))
+ .setSize(90, 18)
+ .setEnabled(widget -> !getBaseMetaTileEntity().isActive())
+ .setPos(0, 4))
+ .widget(new TextFieldWidget()
+ .setGetterInt(() -> (int) (mRoughnessMultiplier * 10000))
+ .setSetterInt(val -> {
+ mRoughnessMultiplier = val / 10000f;
+ })
+ .setNumbers(100, 20000)
+ .setTextColor(Color.WHITE.normal)
+ .setTextAlignment(Alignment.Center)
+ .addTooltip("The roughness multiplier is multiplied by 10,000 before displaying!")
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)
+ .setSize(90, 16))
+ .widget(new DrawableWidget()
+ .setDrawable(GT_UITextures.OVERLAY_BUTTON_CROSS)
+ .setSize(18, 18)
+ .addTooltip(
+ new Text("Can't change configuration when running !").color(Color.RED.dark(3)))
+ .setEnabled(widget -> getBaseMetaTileEntity().isActive()))
+ .setPos(10, 25))
+ .widget(new DynamicPositionedColumn()
+ .setSynced(false)
+ .widget(new TextWidget(new Text("Bio Upgrade Offsets"))
+ .setSize(72, 18)
+ .setEnabled(widget -> !getBaseMetaTileEntity().isActive()))
+ .widget(new DynamicPositionedRow()
+ .setSynced(false)
+ .widget(new TextFieldWidget()
+ .setGetterInt(() -> mBioOffsets[0])
+ .setSetterInt(val -> {
+ mBioOffsets[0] = val;
+ })
+ .setNumbers(-16, 16)
+ .setTextColor(Color.WHITE.normal)
+ .setTextAlignment(Alignment.Center)
+ .addTooltip("X Offset")
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)
+ .setSize(36, 18))
+ .widget(new TextFieldWidget()
+ .setGetterInt(() -> mBioOffsets[1])
+ .setSetterInt(val -> {
+ mBioOffsets[1] = val;
+ })
+ .setNumbers(-16, 16)
+ .setTextColor(Color.WHITE.normal)
+ .setTextAlignment(Alignment.Center)
+ .addTooltip("Z Offset")
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)
+ .setSize(36, 18))
+ .setEnabled(widget -> !getBaseMetaTileEntity().isActive()))
+ .widget(new TextWidget(new Text("Cooler Tier 1 Offsets"))
+ .setSize(72, 18)
+ .setEnabled(widget -> !getBaseMetaTileEntity().isActive()))
+ .widget(new DynamicPositionedRow()
+ .setSynced(false)
+ .widget(new TextFieldWidget()
+ .setGetterInt(() -> mOCTier1Offsets[0])
+ .setSetterInt(val -> {
+ mOCTier1Offsets[0] = val;
+ })
+ .setNumbers(-16, 16)
+ .setTextColor(Color.WHITE.normal)
+ .setTextAlignment(Alignment.Center)
+ .addTooltip("X Offset")
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)
+ .setSize(36, 18))
+ .widget(new TextFieldWidget()
+ .setGetterInt(() -> mOCTier1Offsets[1])
+ .setSetterInt(val -> {
+ mOCTier1Offsets[1] = val;
+ })
+ .setNumbers(-16, 16)
+ .setTextColor(Color.WHITE.normal)
+ .setTextAlignment(Alignment.Center)
+ .addTooltip("Z Offset")
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)
+ .setSize(36, 18))
+ .setEnabled(widget -> !getBaseMetaTileEntity().isActive()))
+ .widget(new TextWidget(new Text("Cooler Tier 2 Offsets"))
+ .setSize(72, 18)
+ .setEnabled(widget -> !getBaseMetaTileEntity().isActive()))
+ .widget(new DynamicPositionedRow()
+ .setSynced(false)
+ .widget(new TextFieldWidget()
+ .setGetterInt(() -> mOCTier2Offsets[0])
+ .setSetterInt(val -> {
+ mOCTier2Offsets[0] = val;
+ })
+ .setNumbers(-16, 16)
+ .setTextColor(Color.WHITE.normal)
+ .setTextAlignment(Alignment.Center)
+ .addTooltip("X Offset")
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)
+ .setSize(36, 18))
+ .widget(new TextFieldWidget()
+ .setGetterInt(() -> mOCTier2Offsets[1])
+ .setSetterInt(val -> {
+ mOCTier2Offsets[1] = val;
+ })
+ .setNumbers(-16, 16)
+ .setTextColor(Color.WHITE.normal)
+ .setTextAlignment(Alignment.Center)
+ .addTooltip("Z Offset")
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)
+ .setSize(36, 18))
+ .setEnabled(widget -> !getBaseMetaTileEntity().isActive()))
+ .setPos(110, 25));
+ return builder.build();
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PlasmaForge.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PlasmaForge.java
index ad60853d50..42170779df 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PlasmaForge.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PlasmaForge.java
@@ -1000,12 +1000,12 @@ public class GT_MetaTileEntity_PlasmaForge extends GT_MetaTileEntity_AbstractMul
.beginStructureBlock(33, 24, 33, false)
.addStructureInfo("DTPF Structure is too complex! See schematic for details.")
.addStructureInfo(
- EnumChatFormatting.GOLD + "2112" + EnumChatFormatting.GRAY + " Heating coils required.")
+ EnumChatFormatting.GOLD + "2,112" + EnumChatFormatting.GRAY + " Heating coils required.")
.addStructureInfo(EnumChatFormatting.GOLD + "120" + EnumChatFormatting.GRAY
+ " Dimensional bridge blocks required.")
- .addStructureInfo(EnumChatFormatting.GOLD + "1270" + EnumChatFormatting.GRAY
+ .addStructureInfo(EnumChatFormatting.GOLD + "1,270" + EnumChatFormatting.GRAY
+ " Dimensional injection casings required.")
- .addStructureInfo(EnumChatFormatting.GOLD + "2121" + EnumChatFormatting.GRAY
+ .addStructureInfo(EnumChatFormatting.GOLD + "2,121" + EnumChatFormatting.GRAY
+ " Dimensionally transcendent casings required.")
.addStructureInfo("--------------------------------------------")
.addStructureInfo("Requires " + EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + "-"
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingLens.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingLens.java
index 943d711d59..c1771c4cee 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingLens.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingLens.java
@@ -34,6 +34,13 @@ public class ProcessingLens implements gregtech.api.interfaces.IOreRecipeRegistr
2400,
16);
break;
+ case "ChromaticGlass":
+ GT_Values.RA.addCompressorRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 16L),
+ GT_OreDictUnificator.get(OrePrefixes.lens, aMaterial, 1L),
+ 600 * 20,
+ 1966080);
+ break;
default:
GT_Values.RA.addLatheRecipe(
GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L),
diff --git a/src/main/java/gregtech/loaders/postload/GT_MachineRecipeLoader.java b/src/main/java/gregtech/loaders/postload/GT_MachineRecipeLoader.java
index 56780c22e5..10780408c0 100644
--- a/src/main/java/gregtech/loaders/postload/GT_MachineRecipeLoader.java
+++ b/src/main/java/gregtech/loaders/postload/GT_MachineRecipeLoader.java
@@ -14,6 +14,8 @@ import gregtech.api.util.*;
import gregtech.common.GT_DummyWorld;
import gregtech.common.items.GT_MetaGenerated_Item_03;
import gregtech.loaders.postload.chains.GT_BauxiteRefineChain;
+import gregtech.loaders.postload.chains.GT_NaniteChain;
+import gregtech.loaders.postload.chains.GT_PCBFactoryRecipes;
import ic2.api.recipe.ILiquidHeatExchangerManager;
import ic2.api.recipe.Recipes;
import java.util.Arrays;
@@ -1345,6 +1347,17 @@ public class GT_MachineRecipeLoader implements Runnable {
ItemList.Block_SSFUEL.get(1),
100,
250);
+ GT_Values.RA.addMixerRecipe(
+ new ItemStack[] {
+ Materials.NaquadahEnriched.getDust(8),
+ Materials.Holmium.getDust(2),
+ GT_Utility.getIntegratedCircuit(4)
+ },
+ null,
+ new ItemStack[] {Materials.EnrichedHolmium.getDust(10)},
+ null,
+ 30 * 20,
+ 120000);
GT_Values.RA.addExtruderRecipe(
ItemList.FR_Wax.get(1L), ItemList.Shape_Extruder_Cell.get(0L), ItemList.FR_WaxCapsule.get(1L), 64, 16);
@@ -9762,6 +9775,15 @@ public class GT_MachineRecipeLoader implements Runnable {
ItemList.neutroniumHeatCapacitor.get(1L),
100,
120000);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] {
+ Materials.NaquadahAlloy.getPlates(8),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.NaquadahAlloy, 1)
+ },
+ null,
+ ItemList.RadiantNaquadahAlloyCasing.get(1),
+ 10,
+ 400000);
GT_ModHandler.removeRecipe(new ItemStack(Items.lava_bucket), ItemList.Cell_Empty.get(1L));
GT_ModHandler.removeRecipe(new ItemStack(Items.water_bucket), ItemList.Cell_Empty.get(1L));
@@ -13285,6 +13307,9 @@ public class GT_MachineRecipeLoader implements Runnable {
1200,
900000);
+ GT_NaniteChain.run();
+ GT_PCBFactoryRecipes.load();
+
if (GregTech_API.sThaumcraftCompat != null) {
String tKey = "GT_WOOD_TO_CHARCOAL";
GT_LanguageManager.addStringLocalization(
diff --git a/src/main/java/gregtech/loaders/postload/GT_PCBFactoryMaterialLoader.java b/src/main/java/gregtech/loaders/postload/GT_PCBFactoryMaterialLoader.java
new file mode 100644
index 0000000000..acec328324
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/GT_PCBFactoryMaterialLoader.java
@@ -0,0 +1,18 @@
+package gregtech.loaders.postload;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsKevlar;
+import gregtech.api.util.GT_PCBFactoryManager;
+
+public class GT_PCBFactoryMaterialLoader {
+ public static void load() {
+ // add Plastics
+ GT_PCBFactoryManager.addPlasticTier(Materials.Plastic, 1);
+ GT_PCBFactoryManager.addPlasticTier(Materials.PolyvinylChloride, 2);
+ GT_PCBFactoryManager.addPlasticTier(Materials.Polytetrafluoroethylene, 3);
+ GT_PCBFactoryManager.addPlasticTier(Materials.Epoxid, 4);
+ GT_PCBFactoryManager.addPlasticTier(Materials.EpoxidFiberReinforced, 5);
+ GT_PCBFactoryManager.addPlasticTier(Materials.Polybenzimidazole, 6);
+ GT_PCBFactoryManager.addPlasticTier(MaterialsKevlar.Kevlar, 7);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/chains/GT_NaniteChain.java b/src/main/java/gregtech/loaders/postload/chains/GT_NaniteChain.java
new file mode 100644
index 0000000000..bf2b7ecebd
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/chains/GT_NaniteChain.java
@@ -0,0 +1,146 @@
+package gregtech.loaders.postload.chains;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+public class GT_NaniteChain {
+
+ public static void run() {
+
+ ItemStack aUVTierLens = GT_ModHandler.getModItem("dreamcraft", "item.MysteriousCrystalLens", 0);
+ ItemStack aUHVTierLens = GT_ModHandler.getModItem("dreamcraft", "item.ChromaticLens", 0);
+ ItemStack aUEVTierLens = GT_ModHandler.getModItem("dreamcraft", "item.RadoxPolymerLens", 0);
+ ItemStack aUIVTierLens = ItemList.EnergisedTesseract.get(0);
+ ItemStack aUMVTierLens = GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Dilithium, 0, false);
+
+ // Carbon Nanite Recipe Before Nano Forge
+ Fluid solderIndalloy = FluidRegistry.getFluid("molten.indalloy140") != null
+ ? FluidRegistry.getFluid("molten.indalloy140")
+ : FluidRegistry.getFluid("molten.solderingalloy");
+
+ GT_Values.RA.addAssemblylineRecipe(
+ Materials.Carbon.getNanite(1),
+ 3600 * 20,
+ new Object[] {
+ ItemList.Hull_UV.get(16),
+ Materials.Carbon.getNanite(16),
+ ItemList.Field_Generator_ZPM.get(16),
+ ItemList.Conveyor_Module_UV.get(16),
+ ItemList.Electric_Motor_UV.get(32),
+ new Object[] {OrePrefixes.circuit.get(Materials.Master), 16},
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Naquadah, 32)
+ },
+ new FluidStack[] {
+ new FluidStack(solderIndalloy, 144 * 32),
+ Materials.HSSS.getMolten(144L * 32),
+ Materials.Osmiridium.getMolten(144L * 16)
+ },
+ ItemList.NanoForge.get(1),
+ 2400 * 20,
+ (int) GT_Values.VP[7]);
+
+ GT_Values.RA.addAssemblylineRecipe(
+ ItemList.Circuit_Crystalmainframe.get(1),
+ 144000,
+ new Object[] {
+ new Object[] {OrePrefixes.circuit.get(Materials.SuperconductorUHV), 16},
+ ItemList.Robot_Arm_UV.get(16),
+ ItemList.Circuit_Chip_Stemcell.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.NaquadahAlloy, 32),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.NaquadahAlloy, 16),
+ Materials.Carbon.getDust(64)
+ },
+ new FluidStack[] {Materials.UUMatter.getFluid(10000), new FluidStack(solderIndalloy, 144 * 32)},
+ Materials.Carbon.getNanite(2),
+ 50 * 20,
+ (int) GT_Values.VP[8]);
+
+ /*
+ * General Rules for making nanite recipes:
+ * 1. Never make a nanite that takes a long time to make and only gives 1, just to be consumed.
+ * 2. Nanites meant to be consumed should either have a short duration or a big output.
+ * 3. Nanites which aren't consumed should have a long duration and output less than 16.
+ * 4. Nanites should always take UUM as a fluid and a lot of power to make.
+ */
+
+ // Carbon Nanites - Used to make more Nano Forge Controllers
+ GT_Values.RA.addNanoForgeRecipe(
+ new ItemStack[] {
+ aUVTierLens,
+ GT_ModHandler.getModItem("bartworks", "bw.werkstoffblockscasingadvanced.01", 8, 31776),
+ ItemList.Circuit_Chip_SoC.get(64)
+ },
+ new FluidStack[] {Materials.UUMatter.getFluid(200000)},
+ new ItemStack[] {
+ Materials.Carbon.getNanite(64),
+ },
+ null,
+ null,
+ 500 * 20,
+ 10000000,
+ 1);
+
+ // Silver Nanites - Used in Tier 2 PCB Factory to improve board production
+ GT_Values.RA.addNanoForgeRecipe(
+ new ItemStack[] {aUHVTierLens, Materials.Silver.getBlocks(8), ItemList.Circuit_Chip_SoC.get(16)},
+ new FluidStack[] {Materials.UUMatter.getFluid(200000)},
+ new ItemStack[] {Materials.Silver.getNanite(1)},
+ null,
+ null,
+ 750 * 20,
+ 10000000,
+ 2);
+
+ // Neutronium Nanites - Used to upgrade the Nano Forge to Tier 2
+ GT_Values.RA.addNanoForgeRecipe(
+ new ItemStack[] {
+ aUEVTierLens,
+ Materials.Neutronium.getBlocks(8),
+ ItemList.Circuit_Chip_SoC2.get(64),
+ ItemList.Circuit_Chip_SoC2.get(32)
+ },
+ new FluidStack[] {Materials.UUMatter.getFluid(200000)},
+ new ItemStack[] {Materials.Neutronium.getNanite(1)},
+ null,
+ null,
+ 100 * 20,
+ 100000000,
+ 1);
+
+ // Gold Nanites - Used in Tier 3 PCB Factory to improve board production
+ GT_Values.RA.addNanoForgeRecipe(
+ new ItemStack[] {aUIVTierLens, Materials.Gold.getBlocks(8), ItemList.Circuit_Chip_SoC.get(16)},
+ new FluidStack[] {Materials.UUMatter.getFluid(300000)},
+ new ItemStack[] {Materials.Gold.getNanite(1)},
+ null,
+ null,
+ 1000 * 20,
+ 100000000,
+ 3);
+
+ // Transcendent Metal Nanites - Used to upgrade the Nano Forge to Tier 3
+ GT_Values.RA.addNanoForgeRecipe(
+ new ItemStack[] {
+ aUMVTierLens,
+ Materials.TranscendentMetal.getBlocks(8),
+ ItemList.Circuit_Chip_SoC2.get(64),
+ ItemList.Circuit_Chip_SoC2.get(64),
+ ItemList.Circuit_Chip_SoC2.get(64)
+ },
+ new FluidStack[] {Materials.UUMatter.getFluid(2000000)},
+ new ItemStack[] {Materials.TranscendentMetal.getNanite(1)},
+ null,
+ null,
+ 750 * 20,
+ 1000000000,
+ 2);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/chains/GT_PCBFactoryRecipes.java b/src/main/java/gregtech/loaders/postload/chains/GT_PCBFactoryRecipes.java
new file mode 100644
index 0000000000..6c657c2676
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/chains/GT_PCBFactoryRecipes.java
@@ -0,0 +1,577 @@
+package gregtech.loaders.postload.chains;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_PCBFactoryManager;
+import gregtech.api.util.GT_Utility;
+import java.util.ArrayList;
+import java.util.List;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+@SuppressWarnings("SpellCheckingInspection")
+public class GT_PCBFactoryRecipes {
+
+ public static void load() {
+ final int mBioUpgradeBitMap = 0b1000;
+ final int mTier3BitMap = 0b100;
+ final int mTier2BitMap = 0b10;
+ final int mTier1BitMap = 0b1;
+
+ final Fluid solderLuV = FluidRegistry.getFluid("molten.indalloy140") != null
+ ? FluidRegistry.getFluid("molten.indalloy140")
+ : FluidRegistry.getFluid("molten.solderingalloy");
+
+ // Load Multi Recipes
+ GT_Values.RA.addAssemblylineRecipe(
+ ItemList.Circuit_Board_Wetware.get(1),
+ 3600,
+ new Object[] {
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 32),
+ ItemList.Machine_ZPM_CircuitAssembler.get(4),
+ new Object[] {OrePrefixes.circuit.get(Materials.Master), 16},
+ ItemList.Robot_Arm_ZPM.get(8)
+ },
+ new FluidStack[] {new FluidStack(solderLuV, 144 * 36), Materials.Naquadah.getMolten(144 * 18)},
+ ItemList.PCBFactory.get(1),
+ 6000 * 20,
+ (int) GT_Values.VP[8]);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] {
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.NaquadahAlloy, 1),
+ Materials.get("Artherium-Sn").getPlates(6)
+ },
+ null,
+ ItemList.BasicPhotolithographicFrameworkCasing.get(1),
+ 30 * 20,
+ (int) GT_Values.VP[7]);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] {
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Infinity, 1),
+ Materials.EnrichedHolmium.getPlates(6)
+ },
+ null,
+ ItemList.ReinforcedPhotolithographicFrameworkCasing.get(1),
+ 30 * 20,
+ (int) GT_Values.VP[9]);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] {
+ GT_ModHandler.getModItem("miscutils", "blockFrameGtCelestialTungsten", 1),
+ Materials.get("Quantum").getPlates(6)
+ },
+ null,
+ ItemList.RadiationProofPhotolithographicFrameworkCasing.get(1),
+ 30 * 20,
+ (int) GT_Values.VP[11]);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] {
+ GT_ModHandler.getModItem("miscutils", "blockFrameGtHypogen", 1),
+ GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Infinity, 2),
+ Materials.Thulium.getPlates(6)
+ },
+ Materials.SpaceTime.getMolten(144 * 8),
+ ItemList.InfinityCooledCasing.get(1),
+ 10 * 20,
+ (int) GT_Values.VP[12]);
+
+ // Load CircuitBoard Recipes
+
+ // Plastic Circuit Board
+ for (int tier = 1; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 1))));
+ List<ItemStack> aBoards = new ArrayList<ItemStack>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(64));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(amountOfBoards));
+ GT_Values.RA.addPCBFactoryRecipe(
+ new ItemStack[] {
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier).getPlates(1),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.AnnealedCopper, (long) (16 * (Math.sqrt(tier)))),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Copper, (long) (16 * (Math.sqrt(tier)))),
+ GT_Utility.getIntegratedCircuit(1)
+ },
+ new FluidStack[] {
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier)))),
+ Materials.IronIIIChloride.getFluid((long) (250 * (Math.sqrt(tier))))
+ },
+ aBoards.toArray(new ItemStack[0]),
+ (int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 1.5))),
+ (int) GT_Values.VP[tier] * 3 / 4,
+ mTier1BitMap | mTier2BitMap | mTier3BitMap);
+ }
+ for (int tier = 1; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 0.5))));
+ List<ItemStack> aBoards = new ArrayList<ItemStack>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(64));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(amountOfBoards));
+ GT_Values.RA.addPCBFactoryRecipe(
+ new ItemStack[] {
+ GT_Utility.getNaniteAsCatalyst(Materials.Silver),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier).getPlates(1),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.AnnealedCopper, (long) (16 * (Math.sqrt(tier)))),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Copper, (long) (16 * (Math.sqrt(tier)))),
+ GT_Utility.getIntegratedCircuit(2)
+ },
+ new FluidStack[] {
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier)))),
+ Materials.IronIIIChloride.getFluid((long) (250 * (Math.sqrt(tier))))
+ },
+ aBoards.toArray(new ItemStack[0]),
+ (int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 1.5))),
+ (int) GT_Values.VP[tier + 1] * 3 / 4,
+ mTier2BitMap | mTier3BitMap);
+ }
+ for (int tier = 1; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier))));
+ List<ItemStack> aBoards = new ArrayList<ItemStack>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(64));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(amountOfBoards));
+ GT_Values.RA.addPCBFactoryRecipe(
+ new ItemStack[] {
+ GT_Utility.getNaniteAsCatalyst(Materials.Gold),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier).getPlates(1),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.AnnealedCopper, (long) (16 * (Math.sqrt(tier)))),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Copper, (long) (16 * (Math.sqrt(tier)))),
+ GT_Utility.getIntegratedCircuit(3)
+ },
+ new FluidStack[] {
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier)))),
+ Materials.IronIIIChloride.getFluid((long) (250 * (Math.sqrt(tier))))
+ },
+ aBoards.toArray(new ItemStack[0]),
+ (int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 1.5))),
+ (int) GT_Values.VP[tier + 1] * 3 / 4,
+ mTier3BitMap);
+ }
+
+ // Advanced Circuit Board
+ for (int tier = 2; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 2))));
+ List<ItemStack> aBoards = new ArrayList<ItemStack>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(amountOfBoards));
+ GT_Values.RA.addPCBFactoryRecipe(
+ new ItemStack[] {
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier).getPlates(1),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gold, (long) (16 * (Math.sqrt(tier - 1)))),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.Electrum, (long) (16 * (Math.sqrt(tier - 1)))),
+ GT_Utility.getIntegratedCircuit(1)
+ },
+ new FluidStack[] {
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 1)))),
+ Materials.IronIIIChloride.getFluid((long) (500 * (Math.sqrt(tier - 1))))
+ },
+ aBoards.toArray(new ItemStack[0]),
+ (int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 2.5))),
+ (int) GT_Values.VP[tier] * 3 / 4,
+ mTier1BitMap | mTier2BitMap | mTier3BitMap);
+ }
+ for (int tier = 2; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 1.5))));
+ List<ItemStack> aBoards = new ArrayList<ItemStack>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(amountOfBoards));
+ GT_Values.RA.addPCBFactoryRecipe(
+ new ItemStack[] {
+ GT_Utility.getNaniteAsCatalyst(Materials.Silver),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier).getPlates(1),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gold, (long) (16 * (Math.sqrt(tier - 1)))),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.Electrum, (long) (16 * (Math.sqrt(tier - 1)))),
+ GT_Utility.getIntegratedCircuit(2)
+ },
+ new FluidStack[] {
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 1)))),
+ Materials.IronIIIChloride.getFluid((long) (500 * (Math.sqrt(tier - 1))))
+ },
+ aBoards.toArray(new ItemStack[0]),
+ (int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 2.5))),
+ (int) GT_Values.VP[tier + 1] * 3 / 4,
+ mTier2BitMap | mTier3BitMap);
+ }
+ for (int tier = 2; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 1))));
+ List<ItemStack> aBoards = new ArrayList<ItemStack>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(amountOfBoards));
+ GT_Values.RA.addPCBFactoryRecipe(
+ new ItemStack[] {
+ GT_Utility.getNaniteAsCatalyst(Materials.Gold),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier).getPlates(1),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gold, (long) (16 * (Math.sqrt(tier - 1)))),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.Electrum, (long) (16 * (Math.sqrt(tier - 1)))),
+ GT_Utility.getIntegratedCircuit(3)
+ },
+ new FluidStack[] {
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 1)))),
+ Materials.IronIIIChloride.getFluid((long) (500 * (Math.sqrt(tier - 1))))
+ },
+ aBoards.toArray(new ItemStack[0]),
+ (int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 2.5))),
+ (int) GT_Values.VP[tier + 1] * 3 / 4,
+ mTier3BitMap);
+ }
+
+ // More Advanced Circuit Board
+ for (int tier = 3; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 3))));
+ List<ItemStack> aBoards = new ArrayList<ItemStack>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(amountOfBoards));
+ GT_Values.RA.addPCBFactoryRecipe(
+ new ItemStack[] {
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier).getPlates(1),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.Aluminium, (long) (16 * (Math.sqrt(tier - 2)))),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.EnergeticAlloy, (long) (16 * (Math.sqrt(tier - 2)))),
+ GT_Utility.getIntegratedCircuit(1)
+ },
+ new FluidStack[] {
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 2)))),
+ Materials.IronIIIChloride.getFluid((long) (1000 * (Math.sqrt(tier - 2))))
+ },
+ aBoards.toArray(new ItemStack[0]),
+ (int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 3.5))),
+ (int) GT_Values.VP[tier] * 3 / 4,
+ mTier1BitMap | mTier2BitMap | mTier3BitMap);
+ }
+ for (int tier = 3; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 2.5))));
+ List<ItemStack> aBoards = new ArrayList<ItemStack>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(amountOfBoards));
+ GT_Values.RA.addPCBFactoryRecipe(
+ new ItemStack[] {
+ GT_Utility.getNaniteAsCatalyst(Materials.Silver),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier).getPlates(1),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.Aluminium, (long) (16 * (Math.sqrt(tier - 2)))),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.EnergeticAlloy, (long) (16 * (Math.sqrt(tier - 2)))),
+ GT_Utility.getIntegratedCircuit(2)
+ },
+ new FluidStack[] {
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 2)))),
+ Materials.IronIIIChloride.getFluid((long) (1000 * (Math.sqrt(tier - 2))))
+ },
+ aBoards.toArray(new ItemStack[0]),
+ (int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 3.5))),
+ (int) GT_Values.VP[tier + 1] * 3 / 4,
+ mTier2BitMap | mTier3BitMap);
+ }
+ for (int tier = 3; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 2))));
+ List<ItemStack> aBoards = new ArrayList<ItemStack>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(amountOfBoards));
+ GT_Values.RA.addPCBFactoryRecipe(
+ new ItemStack[] {
+ GT_Utility.getNaniteAsCatalyst(Materials.Gold),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier).getPlates(1),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.Aluminium, (long) (16 * (Math.sqrt(tier - 2)))),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.EnergeticAlloy, (long) (16 * (Math.sqrt(tier - 2)))),
+ GT_Utility.getIntegratedCircuit(3)
+ },
+ new FluidStack[] {
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 2)))),
+ Materials.IronIIIChloride.getFluid((long) (1000 * (Math.sqrt(tier - 2))))
+ },
+ aBoards.toArray(new ItemStack[0]),
+ (int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 3.5))),
+ (int) GT_Values.VP[tier + 1] * 3 / 4,
+ mTier3BitMap);
+ }
+
+ // Elite Circuit Board
+ for (int tier = 4; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 4))));
+ List<ItemStack> aBoards = new ArrayList<ItemStack>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(amountOfBoards));
+ GT_Values.RA.addPCBFactoryRecipe(
+ new ItemStack[] {
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier).getPlates(1),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.Palladium, (long) (16 * (Math.sqrt(tier - 3)))),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.Platinum, (long) (16 * (Math.sqrt(tier - 3)))),
+ GT_Utility.getIntegratedCircuit(1)
+ },
+ new FluidStack[] {
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 3)))),
+ Materials.IronIIIChloride.getFluid((long) (2000 * (Math.sqrt(tier - 3))))
+ },
+ aBoards.toArray(new ItemStack[0]),
+ (int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 4.5))),
+ (int) GT_Values.VP[tier] * 3 / 4,
+ mTier1BitMap | mTier2BitMap | mTier3BitMap);
+ }
+ for (int tier = 4; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 3.5))));
+ List<ItemStack> aBoards = new ArrayList<ItemStack>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(amountOfBoards));
+ GT_Values.RA.addPCBFactoryRecipe(
+ new ItemStack[] {
+ GT_Utility.getNaniteAsCatalyst(Materials.Silver),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier).getPlates(1),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.Palladium, (long) (16 * (Math.sqrt(tier - 3)))),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.Platinum, (long) (16 * (Math.sqrt(tier - 3)))),
+ GT_Utility.getIntegratedCircuit(2)
+ },
+ new FluidStack[] {
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 3)))),
+ Materials.IronIIIChloride.getFluid((long) (2000 * (Math.sqrt(tier - 3))))
+ },
+ aBoards.toArray(new ItemStack[0]),
+ (int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 4.5))),
+ (int) GT_Values.VP[tier + 1] * 3 / 4,
+ mTier2BitMap | mTier3BitMap);
+ }
+ for (int tier = 4; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 3))));
+ List<ItemStack> aBoards = new ArrayList<ItemStack>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(amountOfBoards));
+ GT_Values.RA.addPCBFactoryRecipe(
+ new ItemStack[] {
+ GT_Utility.getNaniteAsCatalyst(Materials.Gold),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier).getPlates(1),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.Palladium, (long) (16 * (Math.sqrt(tier - 3)))),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.Platinum, (long) (16 * (Math.sqrt(tier - 3)))),
+ GT_Utility.getIntegratedCircuit(3)
+ },
+ new FluidStack[] {
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 3)))),
+ Materials.IronIIIChloride.getFluid((long) (2000 * (Math.sqrt(tier - 3))))
+ },
+ aBoards.toArray(new ItemStack[0]),
+ (int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 4.5))),
+ (int) GT_Values.VP[tier + 1] * 3 / 4,
+ mTier3BitMap);
+ }
+
+ // Wetware Circuit Board
+ for (int tier = 5; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 5))));
+ List<ItemStack> aBoards = new ArrayList<ItemStack>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(amountOfBoards));
+ GT_Values.RA.addPCBFactoryRecipe(
+ new ItemStack[] {
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier).getPlates(1),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.EnrichedHolmium, (long) (16 * (Math.sqrt(tier - 4)))),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.NiobiumTitanium, (long) (16 * (Math.sqrt(tier - 4)))),
+ GT_Utility.getIntegratedCircuit(1)
+ },
+ new FluidStack[] {
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 4)))),
+ Materials.IronIIIChloride.getFluid((long) (5000 * (Math.sqrt(tier - 4)))),
+ Materials.GrowthMediumSterilized.getFluid((long) (2000 * (Math.sqrt(tier - 4))))
+ },
+ aBoards.toArray(new ItemStack[0]),
+ (int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 5.5))),
+ (int) GT_Values.VP[tier] * 3 / 4,
+ mTier1BitMap | mTier2BitMap | mTier3BitMap | mBioUpgradeBitMap);
+ }
+ for (int tier = 5; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 4.5))));
+ List<ItemStack> aBoards = new ArrayList<ItemStack>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(amountOfBoards));
+ GT_Values.RA.addPCBFactoryRecipe(
+ new ItemStack[] {
+ GT_Utility.getNaniteAsCatalyst(Materials.Silver),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier).getPlates(1),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.EnrichedHolmium, (long) (16 * (Math.sqrt(tier - 4)))),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.NiobiumTitanium, (long) (16 * (Math.sqrt(tier - 4)))),
+ GT_Utility.getIntegratedCircuit(2)
+ },
+ new FluidStack[] {
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 4)))),
+ Materials.IronIIIChloride.getFluid((long) (5000 * (Math.sqrt(tier - 4)))),
+ Materials.GrowthMediumSterilized.getFluid((long) (2000 * (Math.sqrt(tier - 4))))
+ },
+ aBoards.toArray(new ItemStack[0]),
+ (int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 5.5))),
+ (int) GT_Values.VP[tier + 1] * 3 / 4,
+ mTier2BitMap | mTier3BitMap | mBioUpgradeBitMap);
+ }
+ for (int tier = 5; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 4))));
+ List<ItemStack> aBoards = new ArrayList<ItemStack>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(amountOfBoards));
+ GT_Values.RA.addPCBFactoryRecipe(
+ new ItemStack[] {
+ GT_Utility.getNaniteAsCatalyst(Materials.Gold),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier).getPlates(1),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.EnrichedHolmium, (long) (16 * (Math.sqrt(tier - 4)))),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.NiobiumTitanium, (long) (16 * (Math.sqrt(tier - 4)))),
+ GT_Utility.getIntegratedCircuit(3)
+ },
+ new FluidStack[] {
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 4)))),
+ Materials.IronIIIChloride.getFluid((long) (5000 * (Math.sqrt(tier - 4)))),
+ Materials.GrowthMediumSterilized.getFluid((long) (2000 * (Math.sqrt(tier - 4))))
+ },
+ aBoards.toArray(new ItemStack[0]),
+ (int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 5.5))),
+ (int) GT_Values.VP[tier + 1] * 3 / 4,
+ mTier3BitMap | mBioUpgradeBitMap);
+ }
+
+ // Bioware Circuit Board
+ for (int tier = 6; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 6))));
+ List<ItemStack> aBoards = new ArrayList<ItemStack>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(amountOfBoards));
+ GT_Values.RA.addPCBFactoryRecipe(
+ new ItemStack[] {
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier).getPlates(1),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Longasssuperconductornameforuvwire, (long)
+ (16 * (Math.sqrt(tier - 5)))),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.Neutronium, (long) (16 * (Math.sqrt(tier - 5)))),
+ GT_Utility.getIntegratedCircuit(1)
+ },
+ new FluidStack[] {
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 5)))),
+ Materials.IronIIIChloride.getFluid((long) (7500 * (Math.sqrt(tier - 5)))),
+ Materials.BioMediumSterilized.getFluid((long) (4000 * (Math.sqrt(tier - 5))))
+ },
+ aBoards.toArray(new ItemStack[0]),
+ (int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 5.5))),
+ (int) GT_Values.VP[tier] * 3 / 4,
+ mTier1BitMap | mTier2BitMap | mTier3BitMap | mBioUpgradeBitMap);
+ }
+ for (int tier = 6; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 5.5))));
+ List<ItemStack> aBoards = new ArrayList<ItemStack>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(amountOfBoards));
+ GT_Values.RA.addPCBFactoryRecipe(
+ new ItemStack[] {
+ GT_Utility.getNaniteAsCatalyst(Materials.Silver),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier).getPlates(1),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Longasssuperconductornameforuvwire, (long)
+ (16 * (Math.sqrt(tier - 5)))),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.Neutronium, (long) (16 * (Math.sqrt(tier - 5)))),
+ GT_Utility.getIntegratedCircuit(2)
+ },
+ new FluidStack[] {
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 5)))),
+ Materials.IronIIIChloride.getFluid((long) (7500 * (Math.sqrt(tier - 5)))),
+ Materials.BioMediumSterilized.getFluid((long) (4000 * (Math.sqrt(tier - 5))))
+ },
+ aBoards.toArray(new ItemStack[0]),
+ (int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 6.5))),
+ (int) GT_Values.VP[tier + 1] * 3 / 4,
+ mTier2BitMap | mTier3BitMap | mBioUpgradeBitMap);
+ }
+ for (int tier = 6; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 5))));
+ List<ItemStack> aBoards = new ArrayList<ItemStack>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(amountOfBoards));
+ GT_Values.RA.addPCBFactoryRecipe(
+ new ItemStack[] {
+ GT_Utility.getNaniteAsCatalyst(Materials.Gold),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier).getPlates(1),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Longasssuperconductornameforuvwire, (long)
+ (16 * (Math.sqrt(tier - 5)))),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil, Materials.Neutronium, (long) (16 * (Math.sqrt(tier - 5)))),
+ GT_Utility.getIntegratedCircuit(3),
+ },
+ new FluidStack[] {
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 5)))),
+ Materials.IronIIIChloride.getFluid((long) (7500 * (Math.sqrt(tier - 5)))),
+ Materials.BioMediumSterilized.getFluid((long) (4000 * (Math.sqrt(tier - 5))))
+ },
+ aBoards.toArray(new ItemStack[0]),
+ (int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 6.5))),
+ (int) GT_Values.VP[tier + 1] * 3 / 4,
+ mTier3BitMap | mBioUpgradeBitMap);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/preload/GT_Loader_Item_Block_And_Fluid.java b/src/main/java/gregtech/loaders/preload/GT_Loader_Item_Block_And_Fluid.java
index 1c210e10e7..2c4cb8eb8f 100644
--- a/src/main/java/gregtech/loaders/preload/GT_Loader_Item_Block_And_Fluid.java
+++ b/src/main/java/gregtech/loaders/preload/GT_Loader_Item_Block_And_Fluid.java
@@ -719,7 +719,11 @@ public class GT_Loader_Item_Block_And_Fluid implements Runnable {
GregTech_API.sBlockMetal9 = new GT_Block_Metal(
"gt.blockmetal9",
new Materials[] {
- Materials.Cryolite, Materials.SiliconSG, MaterialsKevlar.NickelAluminide, Materials.SpaceTime
+ Materials.Cryolite,
+ Materials.SiliconSG,
+ MaterialsKevlar.NickelAluminide,
+ Materials.SpaceTime,
+ Materials.TranscendentMetal
},
OrePrefixes.block,
gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS12);
diff --git a/src/main/java/gregtech/loaders/preload/GT_Loader_MetaTileEntities.java b/src/main/java/gregtech/loaders/preload/GT_Loader_MetaTileEntities.java
index 56271f54a2..71112cf1ad 100644
--- a/src/main/java/gregtech/loaders/preload/GT_Loader_MetaTileEntities.java
+++ b/src/main/java/gregtech/loaders/preload/GT_Loader_MetaTileEntities.java
@@ -19,6 +19,7 @@ import gregtech.common.tileentities.machines.long_distance.GT_MetaTileEntity_Lon
import gregtech.common.tileentities.machines.multi.*;
import gregtech.common.tileentities.machines.steam.*;
import gregtech.common.tileentities.storage.*;
+import gregtech.loaders.postload.GT_PCBFactoryMaterialLoader;
import gregtech.loaders.postload.GT_ProcessingArrayRecipeLoader;
import ic2.core.Ic2Items;
import net.minecraft.init.Blocks;
@@ -27,8 +28,6 @@ import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
// Free IDs left for machines in GT as of 29th of July 2022 - Colen. Please try use them up in order.
-// 356
-// 357
// 358
// 359
// 366
@@ -11657,7 +11656,6 @@ public class GT_Loader_MetaTileEntities implements Runnable { // TODO CHECK CIRC
});
GT_ProcessingArrayRecipeLoader.registerDefaultGregtechMaps();
-
ItemList.Distillation_Tower.set(
new GT_MetaTileEntity_DistillationTower(1126, "multimachine.distillationtower", "Distillation Tower")
.getStackForm(1L));
@@ -12732,6 +12730,12 @@ public class GT_Loader_MetaTileEntities implements Runnable { // TODO CHECK CIRC
'B',
ItemList.Hull_HV
});
+
+ ItemList.PCBFactory.set(
+ new GT_MetaTileEntity_PCBFactory(356, "multimachine.pcbfactory", "PCB Factory").getStackForm(1));
+ GT_PCBFactoryMaterialLoader.load();
+ ItemList.NanoForge.set(
+ new GT_MetaTileEntity_NanoForge(357, "multimachine.nanoforge", "Nano Forge").getStackForm(1));
}
private static void run4() {
diff --git a/src/main/java/gregtech/loaders/preload/GT_PreLoad.java b/src/main/java/gregtech/loaders/preload/GT_PreLoad.java
index e651b8122d..0056a5b866 100644
--- a/src/main/java/gregtech/loaders/preload/GT_PreLoad.java
+++ b/src/main/java/gregtech/loaders/preload/GT_PreLoad.java
@@ -310,7 +310,12 @@ public class GT_PreLoad {
};
if (mIt == 3)
tags = new String[] {
- "crateGtDust", "crateGtIngot", "crateGtGem", "crateGtPlate", "itemCasing"
+ "crateGtDust",
+ "crateGtIngot",
+ "crateGtGem",
+ "crateGtPlate",
+ "itemCasing",
+ "nanite"
};
if (tags.length > prefix) tag = tags[prefix];
if (GregTech_API.sGeneratedMaterials[material] != null) {
@@ -392,6 +397,7 @@ public class GT_PreLoad {
"crateGtIngot",
"crateGtGem",
"crateGtPlate",
+ "nanite",
"cellMolten"
};
diff --git a/src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java b/src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java
index 2ff5142ace..4d1bff3704 100644
--- a/src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java
+++ b/src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java
@@ -493,6 +493,18 @@ public class GT_NEI_DefaultHandler extends RecipeMapHandler {
+ formatSpecialValueFusion(recipe.mSpecialValue, recipe.mEUt))) {
lineCounter++;
}
+ } else if (this.mRecipeMap.mNEIName.equals("gt.recipe.pcbfactory")) {
+ int bitmap = recipe.mSpecialValue;
+ if ((bitmap & 0b1) > 0) {
+ drawLine(lineCounter++, GT_Utility.trans("336", "PCB Factory Tier: ") + 1);
+ } else if ((bitmap & 0b10) > 0) {
+ drawLine(lineCounter++, GT_Utility.trans("336", "PCB Factory Tier: ") + 2);
+ } else if ((bitmap & 0b100) > 0) {
+ drawLine(lineCounter++, GT_Utility.trans("336", "PCB Factory Tier: ") + 3);
+ }
+ if ((bitmap & 0b1000) > 0) {
+ drawLine(lineCounter++, GT_Utility.trans("337", "Upgrade Required: ") + GT_Utility.trans("338", "Bio"));
+ }
} else if (GT_Utility.isStringValid(this.mRecipeMap.mNEISpecialValuePre)
&& this.mRecipeMap.mNEISpecialValuePre.toLowerCase().contains("heat capacity")) {
drawLine(lineCounter, getSpecialInfo(recipe.mSpecialValue));
diff --git a/src/main/java/gregtech/nei/IMCForNEI.java b/src/main/java/gregtech/nei/IMCForNEI.java
index ca0b0daf34..a168867fab 100644
--- a/src/main/java/gregtech/nei/IMCForNEI.java
+++ b/src/main/java/gregtech/nei/IMCForNEI.java
@@ -22,6 +22,10 @@ public class IMCForNEI {
// overwrite yShift to 6
sendHandler("gt.recipe.fakeAssemblylineProcess", "gregtech:gt.blockmachines:1170");
+ sendHandler("gt.recipe.nanoforge", "gregtech:gt.blockmachines:357");
+ sendCatalyst("gt.recipe.nanoforge", "gregtech:gt.blockmachines:357");
+ sendHandler("gt.recipe.pcbfactory", "gregtech:gt.blockmachines:356");
+ sendCatalyst("gt.recipe.pcbfactory", "gregtech:gt.blockmachines:356");
}
private static void sendHandler(String aName, String aBlock, int aMaxRecipesPerPage) {
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TRANSCENDENTMETAL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TRANSCENDENTMETAL.png
new file mode 100644
index 0000000000..01a215fa5e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TRANSCENDENTMETAL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/INFINITY_COOLED_CASING.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/INFINITY_COOLED_CASING.png
new file mode 100644
index 0000000000..8e2f08840a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/INFINITY_COOLED_CASING.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_1.png
new file mode 100644
index 0000000000..4dc9132502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_2.png
new file mode 100644
index 0000000000..2149ae4e8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_3.png
new file mode 100644
index 0000000000..008d725104
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_RADIANT_NAQUADAH_ALLOY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_RADIANT_NAQUADAH_ALLOY.png
new file mode 100644
index 0000000000..c5e311efa0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_RADIANT_NAQUADAH_ALLOY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nanites.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nanites.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nanites.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nanites_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nanites_OVERLAY.png
new file mode 100644
index 0000000000..b0ef0371e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nanites_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites.png
new file mode 100644
index 0000000000..4fc4960ad4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites_OVERLAY.png
new file mode 100644
index 0000000000..b0ef0371e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites_OVERLAY.png
Binary files differ