diff --git a/src/main/java/com/newmaa/othtech/common/OTHItemList.java b/src/main/java/com/newmaa/othtech/common/OTHItemList.java index a078abb3..8878d141 100644 --- a/src/main/java/com/newmaa/othtech/common/OTHItemList.java +++ b/src/main/java/com/newmaa/othtech/common/OTHItemList.java @@ -136,7 +136,8 @@ public enum OTHItemList { OTEBBPlasmaForge, OTEComputer, OTEHatchRack, - LargeSteamHatch; + LargeSteamHatch, + MegaThermalCentrifuge; // 乌拉尔山脉热分离厂 - 巨热力离心 private boolean mHasNotBeenSet; private boolean mDeprecated; diff --git a/src/main/java/com/newmaa/othtech/machine/MachineLoader.java b/src/main/java/com/newmaa/othtech/machine/MachineLoader.java index 392ee1d9..5eb1141d 100644 --- a/src/main/java/com/newmaa/othtech/machine/MachineLoader.java +++ b/src/main/java/com/newmaa/othtech/machine/MachineLoader.java @@ -186,7 +186,6 @@ public static void loadMachines() { OTHItemList.OTEComputer.set(new OTEComputer(IDs + 60, "OTEComputer", translateToLocal("ote.computer.name"))); OTHItemList.OTEHatchRack .set(new OTEHatchRack(IDs + 61, "OTEHatchRack", translateToLocal("ote.calc.rank"), 11).getStackForm(1L)); - // 模型错位,已无言 // OTHItemList.OTEHatchRack.set( // new OTEHatchRack(IDs + 114514, "OTESuperHatchRack", translateToLocal("ote.super.calc.rank"), 1, true) // .getStackForm(1L)); @@ -194,7 +193,10 @@ public static void loadMachines() { // bug的元凶:没有run() OTEHatchRack.run(); OTHItemList.NASA - .set(new OTEFireRocketAssembler(IDs + 62, "FireRocketAssembler", translateToLocal("ote.tn.nasa"))); + .set(new OTEFireRocketAssembler(IDs + 62, "FireRocketAssembler", translateToLocal("ote.tn.nasa"))); // 模型错位,已无言 + OTHItemList.MegaThermalCentrifuge + .set(new OTEMegaThermalCentrifuge(IDs + 64, "MegaThermalCentrifuge", translateToLocal("ote.tn.mtc"))); + } public static void loadMachinePostInit() { diff --git a/src/main/java/com/newmaa/othtech/machine/OTEMegaThermalCentrifuge.java b/src/main/java/com/newmaa/othtech/machine/OTEMegaThermalCentrifuge.java new file mode 100644 index 00000000..9fb5e684 --- /dev/null +++ b/src/main/java/com/newmaa/othtech/machine/OTEMegaThermalCentrifuge.java @@ -0,0 +1,302 @@ +package com.newmaa.othtech.machine; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; +import static gregtech.api.enums.HatchElement.*; +import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import static net.minecraft.util.StatCollector.translateToLocal; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; + +import org.jetbrains.annotations.NotNull; + +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; +import com.newmaa.othtech.machine.machineclass.OTHMultiMachineBase; +import com.newmaa.othtech.machine.machineclass.OTHProcessingLogic; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.SoundResource; +import gregtech.api.enums.TAE; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.logic.ProcessingLogic; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.MultiblockTooltipBuilder; +import gtPlusPlus.core.block.ModBlocks; +import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock; + +public class OTEMegaThermalCentrifuge extends OTHMultiMachineBase { + + // ===================== Tuning Constants ===================== + + private static final int MAX_PARALLEL = 1024; + + private static final float SPEED_BONUS = 1F / 2F; + + private static final float EU_MODIFIER = 1F; + + private static final boolean PERFECT_OVERCLOCK = true; + + private static final int POLLUTION_PER_SECOND = 500 * 256; + + // ===================== Constructors ===================== + + public OTEMegaThermalCentrifuge(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public OTEMegaThermalCentrifuge(String aName) { + super(aName); + } + + // ===================== NBT ===================== + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + } + + @Override + public void loadNBTData(final NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + } + + // ===================== Machine Parameters ===================== + + @Override + protected boolean isEnablePerfectOverclock() { + return PERFECT_OVERCLOCK; + } + + public int getMaxParallelRecipes() { + return MAX_PARALLEL; + } + + protected float getSpeedBonus() { + return SPEED_BONUS; + } + + protected float getEuModifier() { + return EU_MODIFIER; + } + + @Override + public RecipeMap getRecipeMap() { + return RecipeMaps.thermalCentrifugeRecipes; + } + + @Override + public int getPollutionPerSecond(final ItemStack aStack) { + return POLLUTION_PER_SECOND; + } + + // ===================== Processing Logic ===================== + + @Override + protected ProcessingLogic createProcessingLogic() { + return new OTHProcessingLogic() { + + @NotNull + @Override + public CheckRecipeResult process() { + setSpeedBonus(getSpeedBonus()); + setOverclock(isEnablePerfectOverclock() ? 4 : 2, 4); + setEuModifier(getEuModifier()); + return super.process(); + } + + }.setMaxParallelSupplier(this::getMaxParallelRecipes); + } + + // ===================== Structure ===================== + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + repairMachine(); + return checkPiece(STRUCTURE_PIECE_MAIN, horizontalOffSet, verticalOffSet, depthOffSet); + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + this.buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, horizontalOffSet, verticalOffSet, depthOffSet); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (this.mMachine) return -1; + int realBudget = elementBudget >= 200 ? elementBudget : Math.min(200, elementBudget * 5); + + return this.survivalBuildPiece( + STRUCTURE_PIECE_MAIN, + stackSize, + horizontalOffSet, + verticalOffSet, + depthOffSet, + realBudget, + env, + false, + true); + } + + private static final String STRUCTURE_PIECE_MAIN = "main"; + + private final int horizontalOffSet = 7; + private final int verticalOffSet = 7; + private final int depthOffSet = 0; + + private static IStructureDefinition STRUCTURE_DEFINITION = null; + private static final String[] description = new String[] { + EnumChatFormatting.AQUA + translateToLocal("otht.con") + ":", + translateToLocal("1 - 消声仓, 能源仓, 输入输出总线, 输入输出仓 : 替换热力加工机械方块, 支持TecTech能源仓") }; + + @Override + public String[] getStructureDescription(ItemStack stackSize) { + return description; + } + + @Override + public IStructureDefinition getStructureDefinition() { + if (STRUCTURE_DEFINITION == null) { + STRUCTURE_DEFINITION = StructureDefinition.builder() + .addShape(STRUCTURE_PIECE_MAIN, transpose(shapeMain)) + .addElement( + 'A', + buildHatchAdder(OTEMegaThermalCentrifuge.class) + .atLeast(Energy.or(ExoticEnergy), InputBus, OutputBus, InputHatch, OutputHatch, Muffler) + .adder(OTEMegaThermalCentrifuge::addToMachineList) + .dot(1) + .casingIndex(TAE.GTPP_INDEX(16)) + .buildAndChain(ofBlock(ModBlocks.blockCasings2Misc, 0))) + + .build(); + } + return STRUCTURE_DEFINITION; + } + + @Override + public boolean addToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + return super.addToMachineList(aTileEntity, aBaseCasingIndex) + || addExoticEnergyInputToMachineList(aTileEntity, aBaseCasingIndex); + } + + // Structure: 15x15x15 hollow cube of Thermal Processing Casings + // Same layout as OTEMegaFreezerGTpp — controller at front center, layer 7 (0-indexed) + private final String[][] shapeMain = new String[][] { + { "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", + "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", + "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAA~AAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", + "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", + "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA" } }; + + // ===================== Tooltip ===================== + + @Override + protected MultiblockTooltipBuilder createTooltip() { + final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); + tt.addMachineType(translateToLocal("ote.tm.mtc.0")) + .addInfo(translateToLocal("ote.tm.mtc.1")) + .addInfo(translateToLocal("ote.tm.mtc.2")) + .addInfo(translateToLocal("ote.tm.mtc.3")) + .addInfo(translateToLocal("ote.tm.mtc.4")) + .addInfo(translateToLocal("ote.tm.mtc.5")) + .addInfo(translateToLocal("oth.tm.pollution")) + .addTecTechHatchInfo() + .addPollutionAmount(POLLUTION_PER_SECOND) + .addSeparator() + .addController(translateToLocal("ote.tn.mtc")) + .beginStructureBlock(15, 15, 15, false) + .addInputBus("AnyInputBus", 1) + .addOutputBus("AnyOutputBus", 1) + .addInputHatch("AnyInputHatch", 1) + .addOutputHatch("AnyOutputHatch", 1) + .addEnergyHatch("AnyEnergyHatch", 1) + .addMufflerHatch("AnyMufflerHatch", 1) + .toolTipFinisher("§a123Technology - §4MegaThermalCentrifuge"); + return tt; + } + + // ===================== Standard Overrides ===================== + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new OTEMegaThermalCentrifuge(this.mName); + } + + // ===================== Textures ===================== + + @Override + public ITexture[] getTexture(final IGregTechTileEntity baseMetaTileEntity, final ForgeDirection sideDirection, + final ForgeDirection facing, final int aColorIndex, final boolean active, final boolean aRedstone) { + + if (sideDirection == facing) { + if (active) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(16)), + TextureFactory.builder() + .addIcon(TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active) + .extFacing() + .build() }; + return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(16)), + TextureFactory.builder() + .addIcon(TexturesGtBlock.Overlay_Machine_Controller_Advanced) + .extFacing() + .glow() + .build() }; + } + return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(16)) }; + } + + @SideOnly(Side.CLIENT) + @Override + protected SoundResource getActivitySoundLoop() { + return SoundResource.GT_MACHINES_THERMAL_CENTRIFUGE_LOOP; + } +} diff --git a/src/main/java/com/newmaa/othtech/recipe/RecipesMain.java b/src/main/java/com/newmaa/othtech/recipe/RecipesMain.java index 2e316e61..232c5e33 100644 --- a/src/main/java/com/newmaa/othtech/recipe/RecipesMain.java +++ b/src/main/java/com/newmaa/othtech/recipe/RecipesMain.java @@ -423,6 +423,20 @@ public void loadRecipes() { new ItemStack(Items.redstone, 1), 'C', GTOreDictUnificator.get(OrePrefixes.dust, Materials.NetherQuartz, 1), 'D', GTModHandler.getModItem("Railcraft", "firestone.raw", 1) }); + // 乌拉尔山脉热分离厂 - 巨型热力离心机 + GTValues.RA.stdBuilder() + .itemOutputs(getGM(IDs + 64, 1)) + .itemInputs( + getGM(849, 64), // GT++ Industrial Thermal Centrifuge × 64 x 3 + getGM(849, 64), + getGM(849, 64), + ItemList.Electric_Piston_LuV.get(16), + GTOreDictUnificator.get(OrePrefixes.circuit, Materials.Superconductor, 64), + GTUtility.getIntegratedCircuit(17)) + .fluidInputs(new FluidStack(FluidRegistry.getFluidID("molten.indalloy140"), 123 * 144)) + .duration(123 * 20) + .eut(32000) + .addTo(Assem); // HV Hatches TTRecipeAdder.addResearchableAssemblylineRecipe( getGM(43, 1), diff --git a/src/main/resources/assets/123technology/lang/en_US.lang b/src/main/resources/assets/123technology/lang/en_US.lang index 429f163b..0042d1f1 100644 --- a/src/main/resources/assets/123technology/lang/en_US.lang +++ b/src/main/resources/assets/123technology/lang/en_US.lang @@ -661,6 +661,16 @@ ote.tm.bee.1=An HV Large Apiary. #Really only for bees! ote.tm.bee.2=Seriously, why not use Industrial Apiaries :) ote.cm.bee.0=1 - Energy Hatch, Dynamo Hatch or Laser Hatch, Input/Output Bus/Hatch: Replace Plastic Concrete Block. + +#MegaThermalCentrifuge +ote.tn.mtc=Ural Mountains Thermal Separation Plant +ote.tm.mtc.0=§lThe Ultimate Soviet Creation - Mega Thermal Centrifuge +ote.tm.mtc.1=§b EU Cost: 100% +ote.tm.mtc.2=§b Speed + 100% +ote.tm.mtc.3=§b Parallel: 1024 +ote.tm.mtc.4=§6 Uses GT++ Thermal Processing Casings for structure +ote.tm.mtc.5=§l "The steel torrent of the Urals never ceases — ores are forged into the Motherland's lifeblood in the centrifugal inferno" + #WTFHatch ote.tm.wtf.0=Stores energy in a global network. ote.tm.wtf.1=Does not connect to wires. This block can draw EU from the network. diff --git a/src/main/resources/assets/123technology/lang/zh_CN.lang b/src/main/resources/assets/123technology/lang/zh_CN.lang index 9d71512e..bace978d 100644 --- a/src/main/resources/assets/123technology/lang/zh_CN.lang +++ b/src/main/resources/assets/123technology/lang/zh_CN.lang @@ -662,6 +662,15 @@ ote.tm.bee.1=一个HV的大型蜂箱. #真的只能养蜂! ote.tm.bee.2=说真的, 为什么不用工业蜂箱呢:) ote.cm.bee.0=1 - 能源仓, 动力仓或者激光仓, 输入输出总线/仓: 替换塑料混凝土方块 +#MegaThermalCentrifuge +ote.tn.mtc=乌拉尔山脉热分离厂 +ote.tm.mtc.0=§l苏维埃的终极造物 - 巨型热力离心机 +ote.tm.mtc.1=§b EU消耗: 100% +ote.tm.mtc.2=§b 速度 + 100% +ote.tm.mtc.3=§b 并行: 1024 +ote.tm.mtc.4=§6 使用GT++热处理机械方块搭建结构 +ote.tm.mtc.5=§l 「乌拉尔山脉的钢铁洪流不会停歇,矿石在离心烈焰中化为祖国的养料」 + #WTFHatch ote.tm.wtf.0=将能量存储于全局网络中, 上限为2^(2^31)EU. ote.tm.wtf.1=不连接导线. 此方块可以从网络中抽取EU.