Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Industrial alchemy tower #720

Merged
merged 12 commits into from
Jan 15, 2025
2 changes: 2 additions & 0 deletions src/main/java/com/Nxer/TwistSpaceTechnology/ClientProxy.java
Original file line number Diff line number Diff line change
@@ -4,6 +4,7 @@

import com.Nxer.TwistSpaceTechnology.client.Sound.SoundLoader;
import com.Nxer.TwistSpaceTechnology.client.render.ArtificialStarRender;
import com.Nxer.TwistSpaceTechnology.client.render.TileArcaneHoleRender;
import com.Nxer.TwistSpaceTechnology.common.machine.TST_BigBroArray;
import com.Nxer.TwistSpaceTechnology.loader.RendereLoader;
import com.Nxer.TwistSpaceTechnology.system.ItemCooldown.CooldownEventHandler;
@@ -19,6 +20,7 @@ public class ClientProxy extends CommonProxy {
public void init(FMLInitializationEvent event) {
super.init(event);
new ArtificialStarRender();
new TileArcaneHoleRender();
MinecraftForge.EVENT_BUS.register(new CooldownEventHandler());// load cooldown HUD
TST_BigBroArray.initializeDefaultTextures();
}

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -67,7 +67,7 @@ public final class ModBlocksHandler {
// region Chisel
public static Pair<Block, Integer> BlockArcane_1;
public static Pair<Block, Integer> BlockArcane_4;
public static Pair<Block, Integer> BlockArcane_6;
// public static Pair<Block, Integer> BlockArcane_6;

// endregion

@@ -76,6 +76,11 @@ public final class ModBlocksHandler {

// endregion

// region Ender IO
public static Pair<Block, Integer> BlockTravelAnchor;

// endregion

public void initStatics() {
if (Mods.ThaumicBases.isModLoaded()) {
Block crystalBlock = Block.getBlockFromName(Mods.ThaumicBases.ID + ":crystalBlock");
@@ -159,18 +164,24 @@ public void initStatics() {
if (Mods.Chisel.isModLoaded()) {
BlockArcane_1 = Pair.of(Block.getBlockFromName(Mods.Chisel.ID + ":arcane"), 1);
BlockArcane_4 = Pair.of(Block.getBlockFromName(Mods.Chisel.ID + ":arcane"), 4);
BlockArcane_6 = Pair.of(Block.getBlockFromName(Mods.Chisel.ID + ":arcane"), 6);
// BlockArcane_6 = Pair.of(Block.getBlockFromName(Mods.Chisel.ID + ":arcane"), 6);
} else {
BlockArcane_1 = Pair.of(Blocks.quartz_block, 0);
BlockArcane_4 = Pair.of(Blocks.quartz_block, 1);
BlockArcane_6 = Pair.of(Blocks.quartz_block, 2);
// BlockArcane_6 = Pair.of(Blocks.quartz_block, 2);
}

if (Mods.ExtraUtilities.isModLoaded()) {
CarvedEminenceStone = Pair.of(Block.getBlockFromName(Mods.ExtraUtilities + ":decorativeBlock1"), 14);
} else {
CarvedEminenceStone = Pair.of(Blocks.soul_sand, 0);
}

if (Mods.EnderIO.isModLoaded()) {
BlockTravelAnchor = Pair.of(Block.getBlockFromName(Mods.EnderIO + ":blockTravelAnchor"), 0);
} else {
BlockTravelAnchor = Pair.of(Blocks.stone, 0);
}
}

}
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@

import net.minecraft.block.Block;

import com.Nxer.TwistSpaceTechnology.common.block.blockClass.BlockArcaneHole;
import com.Nxer.TwistSpaceTechnology.common.block.blockClass.BlockBase01;
import com.Nxer.TwistSpaceTechnology.common.block.blockClass.BlockPowerChair;
import com.Nxer.TwistSpaceTechnology.common.block.blockClass.BlockTimeBendingSpeedRune;
@@ -36,6 +37,7 @@ public class BasicBlocks {
public static Block NuclearReactorBlock = new BlockNuclearReactor("nuclear", "Mega Nuclear Reactor");

public static Block BlockPowerChair = new BlockPowerChair();
public static Block BlockArcaneHole = new BlockArcaneHole();

public static BlockTimeBendingSpeedRune timeBendingSpeedRune = new BlockTimeBendingSpeedRune();
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.Nxer.TwistSpaceTechnology.common.block;

import static com.Nxer.TwistSpaceTechnology.common.block.BasicBlocks.BlockArcaneHole;
import static com.Nxer.TwistSpaceTechnology.common.block.BasicBlocks.BlockStar;
import static com.Nxer.TwistSpaceTechnology.common.block.BasicBlocks.MetaBlock01;
import static com.Nxer.TwistSpaceTechnology.common.block.BasicBlocks.NuclearReactorBlock;
@@ -20,6 +21,7 @@
import com.Nxer.TwistSpaceTechnology.common.block.blockClass.ItemBlockBase01;
import com.Nxer.TwistSpaceTechnology.common.block.blockClass.ItemBlockPowerChair;
import com.Nxer.TwistSpaceTechnology.common.block.blockClass.MetaBlockBase;
import com.Nxer.TwistSpaceTechnology.common.tile.TileArcaneHole;
import com.Nxer.TwistSpaceTechnology.common.tile.TilePowerChair;
import com.Nxer.TwistSpaceTechnology.common.tile.TileStar;
import com.Nxer.TwistSpaceTechnology.config.Config;
@@ -73,11 +75,13 @@ public static void registryBlocks() {
NuclearReactorBlock,
BlockNuclearReactor.innerItemBlock.class,
NuclearReactorBlock.getUnlocalizedName());
GameRegistry.registerBlock(BlockArcaneHole, "BlockArcaneHole");

GameRegistry.registerBlock(BasicBlocks.BlockPowerChair, ItemBlockPowerChair.class, "BlockPowerChair");
BlockStar = new BlockStar();
GameRegistry.registerTileEntity(TileStar.class, "StarRender");
GameRegistry.registerTileEntity(TilePowerChair.class, "TilePowerChair");
GameRegistry.registerTileEntity(TileArcaneHole.class, "TileArcaneHole");

GameRegistry.registerBlock(BasicBlocks.timeBendingSpeedRune, "TimeBendingSpeedRune");
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
package com.Nxer.TwistSpaceTechnology.common.block.blockClass;

import java.util.List;
import java.util.Random;

import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.Entity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.IIcon;
import net.minecraft.world.Explosion;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;

import com.Nxer.TwistSpaceTechnology.common.block.BasicBlocks;
import com.Nxer.TwistSpaceTechnology.common.tile.TileArcaneHole;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

public class BlockArcaneHole extends BlockContainer {

private IIcon placedIcon;

// #tr tile.ArcaneHole.name
// # {\BOLD}{\LIGHT_PURPLE}Arcane Empty Space
// #zh_CN {\BOLD}{\LIGHT_PURPLE}奥术裂隙
public BlockArcaneHole() {
super(Material.rock);
this.setBlockName("ArcaneHole");
this.setLightLevel(0.8F);
this.setHardness(30.0F);
this.setResistance(6000000.0F);
this.setStepSound(Block.soundTypeGlass);
this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
}

@Override
public boolean isOpaqueCube() {
return false;
}

@Override
public boolean renderAsNormalBlock() {
return false;
}

@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister register) {
this.blockIcon = register.registerIcon("thaumcraft:empty"); // ? thaumcraft:empty
this.placedIcon = register.registerIcon("thaumcraft:blank"); // ? thaumcraft:blank
}

@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(int side, int meta) {
return meta == 1 ? this.placedIcon : this.blockIcon;
}

@Override
public int onBlockPlaced(World worldIn, int x, int y, int z, int side, float subX, float subY, float subZ,
int meta) {
return 1;
}

@Override
public Item getItemDropped(int meta, Random random, int fortune) {
return Item.getItemFromBlock(BasicBlocks.BlockArcaneHole);
}

@Override
protected ItemStack createStackedBlock(int meta) {
return new ItemStack(Item.getItemFromBlock(BasicBlocks.BlockArcaneHole), 1, 0);
}

@Override
public boolean isBlockSolid(IBlockAccess worldIn, int x, int y, int z, int side) {
return false;
}

@Override
public void setBlockBoundsBasedOnState(IBlockAccess worldIn, int x, int y, int z) {
this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
}

@Override
@SideOnly(Side.CLIENT)
public AxisAlignedBB getSelectedBoundingBoxFromPool(World w, int i, int j, int k) {
return AxisAlignedBB.getBoundingBox(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D);
}

@Override
@SuppressWarnings("rawtypes")
public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlignedBB mask, List list,
Entity collider) {}

@Override
public TileEntity createNewTileEntity(World worldIn, int meta) {
return new TileArcaneHole();
}

@Override
public boolean canDropFromExplosion(Explosion explosionIn) {
return false;
}

@Override
public int damageDropped(int meta) {
return super.damageDropped(meta);
}

}

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,235 @@
/*
* Copyright (c) 2017 Azanor
* MIT License
*/

package com.Nxer.TwistSpaceTechnology.common.tile;

import static com.Nxer.TwistSpaceTechnology.common.block.BasicBlocks.BlockArcaneHole;

import net.minecraft.tileentity.TileEntity;

import thaumcraft.common.Thaumcraft;

@SuppressWarnings("unused")
public class TileArcaneHole extends TileEntity {

@Override
public void updateEntity() {
if (this.worldObj.isRemote) this.surroundWithSparkles();
}

private void surroundWithSparkles() {
boolean yp = this.worldObj.getBlock(this.xCoord, this.yCoord + 1, this.zCoord)
.isOpaqueCube();
boolean xp = this.worldObj.getBlock(this.xCoord + 1, this.yCoord, this.zCoord)
.isOpaqueCube();
boolean zp = this.worldObj.getBlock(this.xCoord, this.yCoord, this.zCoord + 1)
.isOpaqueCube();
boolean yn = this.worldObj.getBlock(this.xCoord, this.yCoord - 1, this.zCoord)
.isOpaqueCube();
boolean xn = this.worldObj.getBlock(this.xCoord - 1, this.yCoord, this.zCoord)
.isOpaqueCube();
boolean zn = this.worldObj.getBlock(this.xCoord, this.yCoord, this.zCoord - 1)
.isOpaqueCube();
boolean b1 = this.worldObj.getBlock(this.xCoord, this.yCoord + 1, this.zCoord) != BlockArcaneHole;
boolean b2 = this.worldObj.getBlock(this.xCoord, this.yCoord - 1, this.zCoord) != BlockArcaneHole;
boolean b3 = this.worldObj.getBlock(this.xCoord, this.yCoord, this.zCoord - 1) != BlockArcaneHole;
boolean b4 = this.worldObj.getBlock(this.xCoord, this.yCoord, this.zCoord + 1) != BlockArcaneHole;
boolean b5 = this.worldObj.getBlock(this.xCoord - 1, this.yCoord, this.zCoord) != BlockArcaneHole;
boolean b6 = this.worldObj.getBlock(this.xCoord + 1, this.yCoord, this.zCoord) != BlockArcaneHole;
if (!xp && yp && b6) {
Thaumcraft.proxy.sparkle(
(float) (this.xCoord + 1),
(float) (this.yCoord + 1),
(float) this.zCoord + this.worldObj.rand.nextFloat(),
2);
}

if (!xn && yp && b5) {
Thaumcraft.proxy.sparkle(
(float) this.xCoord,
(float) (this.yCoord + 1),
(float) this.zCoord + this.worldObj.rand.nextFloat(),
2);
}

if (!zp && yp && b4) {
Thaumcraft.proxy.sparkle(
(float) this.xCoord + this.worldObj.rand.nextFloat(),
(float) (this.yCoord + 1),
(float) (this.zCoord + 1),
2);
}

if (!zn && yp && b3) {
Thaumcraft.proxy.sparkle(
(float) this.xCoord + this.worldObj.rand.nextFloat(),
(float) (this.yCoord + 1),
(float) this.zCoord,
2);
}

if (!xp && yn && b6) {
Thaumcraft.proxy.sparkle(
(float) (this.xCoord + 1),
(float) this.yCoord,
(float) this.zCoord + this.worldObj.rand.nextFloat(),
2);
}

if (!xn && yn && b5) {
Thaumcraft.proxy.sparkle(
(float) this.xCoord,
(float) this.yCoord,
(float) this.zCoord + this.worldObj.rand.nextFloat(),
2);
}

if (!zp && yn && b4) {
Thaumcraft.proxy.sparkle(
(float) this.xCoord + this.worldObj.rand.nextFloat(),
(float) this.yCoord,
(float) (this.zCoord + 1),
2);
}

if (!zn && yn && b3) {
Thaumcraft.proxy.sparkle(
(float) this.xCoord + this.worldObj.rand.nextFloat(),
(float) this.yCoord,
(float) this.zCoord,
2);
}

if (!yp && xp && b1) {
Thaumcraft.proxy.sparkle(
(float) (this.xCoord + 1),
(float) (this.yCoord + 1),
(float) this.zCoord + this.worldObj.rand.nextFloat(),
2);
}

if (!yn && xp && b2) {
Thaumcraft.proxy.sparkle(
(float) (this.xCoord + 1),
(float) this.yCoord,
(float) this.zCoord + this.worldObj.rand.nextFloat(),
2);
}

if (!zp && xp && b4) {
Thaumcraft.proxy.sparkle(
(float) (this.xCoord + 1),
(float) this.yCoord + this.worldObj.rand.nextFloat(),
(float) (this.zCoord + 1),
2);
}

if (!zn && xp && b3) {
Thaumcraft.proxy.sparkle(
(float) (this.xCoord + 1),
(float) this.yCoord + this.worldObj.rand.nextFloat(),
(float) this.zCoord,
2);
}

if (!yp && xn && b1) {
Thaumcraft.proxy.sparkle(
(float) this.xCoord,
(float) (this.yCoord + 1),
(float) this.zCoord + this.worldObj.rand.nextFloat(),
2);
}

if (!yn && xn && b2) {
Thaumcraft.proxy.sparkle(
(float) this.xCoord,
(float) this.yCoord,
(float) this.zCoord + this.worldObj.rand.nextFloat(),
2);
}

if (!zp && xn && b4) {
Thaumcraft.proxy.sparkle(
(float) this.xCoord,
(float) this.yCoord + this.worldObj.rand.nextFloat(),
(float) (this.zCoord + 1),
2);
}

if (!zn && xn && b3) {
Thaumcraft.proxy.sparkle(
(float) this.xCoord,
(float) this.yCoord + this.worldObj.rand.nextFloat(),
(float) this.zCoord,
2);
}

if (!xp && zp && b6) {
Thaumcraft.proxy.sparkle(
(float) (this.xCoord + 1),
(float) this.yCoord + this.worldObj.rand.nextFloat(),
(float) (this.zCoord + 1),
2);
}

if (!xn && zp && b5) {
Thaumcraft.proxy.sparkle(
(float) this.xCoord,
(float) this.yCoord + this.worldObj.rand.nextFloat(),
(float) (this.zCoord + 1),
2);
}

if (!yp && zp && b1) {
Thaumcraft.proxy.sparkle(
(float) this.xCoord + this.worldObj.rand.nextFloat(),
(float) (this.yCoord + 1),
(float) (this.zCoord + 1),
2);
}

if (!yn && zp && b2) {
Thaumcraft.proxy.sparkle(
(float) this.xCoord + this.worldObj.rand.nextFloat(),
(float) this.yCoord,
(float) (this.zCoord + 1),
2);
}

if (!xp && zn && b6) {
Thaumcraft.proxy.sparkle(
(float) (this.xCoord + 1),
(float) this.yCoord + this.worldObj.rand.nextFloat(),
(float) this.zCoord,
2);
}

if (!xn && zn && b5) {
Thaumcraft.proxy.sparkle(
(float) this.xCoord,
(float) this.yCoord + this.worldObj.rand.nextFloat(),
(float) this.zCoord,
2);
}

if (!yp && zn && b1) {
Thaumcraft.proxy.sparkle(
(float) this.xCoord + this.worldObj.rand.nextFloat(),
(float) (this.yCoord + 1),
(float) this.zCoord,
2);
}

if (!yn && zn && b2) {
Thaumcraft.proxy.sparkle(
(float) this.xCoord + this.worldObj.rand.nextFloat(),
(float) this.yCoord,
(float) this.zCoord,
2);
}

}

}
Original file line number Diff line number Diff line change
@@ -17,6 +17,7 @@
import com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment;
import com.gtnewhorizon.structurelib.structure.IStructureElement;
import com.gtnewhorizon.structurelib.structure.StructureDefinition;
import com.gtnewhorizon.structurelib.structure.adders.IBlockAdder;
import com.gtnewhorizon.structurelib.structure.adders.ITileAdder;

@SuppressWarnings("unused")
@@ -57,7 +58,9 @@ public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigge

@Override
public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) {
return world.setBlock(x, y, z, block, meta, 2);
world.setBlock(x, y, z, block, meta, 2);
if (check(t, world, x, y, z)) return true;
else return world.setBlockToAir(x, y, z);
}

@Override
@@ -98,7 +101,15 @@ public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigge

@Override
public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) {
return world.setBlock(x, y, z, block, meta, 2);
world.setBlock(x, y, z, block, meta, 2);
if (check(t, world, x, y, z)) return true;
else return world.setBlockToAir(x, y, z);
}

@Override
public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger,
AutoPlaceEnvironment env) {
return BlocksToPlace.create(block, meta);
}

@Override
@@ -112,8 +123,8 @@ public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, Ite
var chatter = env.getChatter();

if (!StructureLibAPI.isBlockTriviallyReplaceable(world, x, y, z, actor)) return PlaceResult.REJECT;
if (!source.takeOne(specialItemStack, true) && chatter != null) {
chatter.accept(
if (!source.takeOne(specialItemStack, true)) {
if (chatter != null) chatter.accept(
new ChatComponentTranslation(
"structurelib.autoplace.error.no_item_stack",
specialItemStack.func_151000_E()));
@@ -134,15 +145,43 @@ public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, Ite
}
};
}
// endregion

// region TileAdder
@NotNull
public static <T> IStructureElement<T> ofAccurateTileAdder(ITileAdder<T> iTileAdder, Block tileBlock,
int tileBlockMeta) {
return ofAccurateTileAdder(iTileAdder, tileBlock, tileBlockMeta, tileBlock, tileBlockMeta);
public static <T> IStructureElement<T> ofAccurateBlockAdder(IBlockAdder<T> iBlockAdder, Block block, int meta) {
if (iBlockAdder == null || block == null) {
throw new IllegalArgumentException();
}
return new IStructureElement<>() {

@Override
public boolean check(T t, World world, int x, int y, int z) {
// Gets the meta value of a block in the real world
return iBlockAdder.apply(t, world.getBlock(x, y, z), world.getBlockMetadata(x, y, z));
}

@Override
public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) {
StructureLibAPI.hintParticle(world, x, y, z, block, meta);
return true;
}

@Override
public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) {
world.setBlock(x, y, z, block, meta, 2);
if (check(t, world, x, y, z)) return true;
else return world.setBlockToAir(x, y, z);
}

@Override
public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger,
AutoPlaceEnvironment env) {
return BlocksToPlace.create(block, meta);
}
};
}
// endregion

// region TileAdder
@NotNull
public static <T, E> IStructureElement<T> ofAccurateTile(Class<E> tileClass, Block tileBlock, int tileBlockMeta) {
return ofAccurateTile(tileClass, tileBlock, tileBlockMeta, tileBlock, tileBlockMeta);
@@ -155,6 +194,12 @@ public static <T, E> IStructureElement<T> ofAccurateTile(Class<E> tileClass, Blo
return ofAccurateTileAdder((a, b) -> tileClass.isInstance(b), tileBlock, tileBlockMeta, hintBlock, hintMeta);
}

@NotNull
public static <T> IStructureElement<T> ofAccurateTileAdder(ITileAdder<T> iTileAdder, Block tileBlock,
int tileBlockMeta) {
return ofAccurateTileAdder(iTileAdder, tileBlock, tileBlockMeta, tileBlock, tileBlockMeta);
}

@NotNull
public static <T> IStructureElement<T> ofAccurateTileAdder(ITileAdder<T> iTileAdder, Block tileBlock,
int tileBlockMeta, Block hintBlock, int hintMeta) {
@@ -255,8 +300,8 @@ public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, Ite
var chatter = env.getChatter();

if (!StructureLibAPI.isBlockTriviallyReplaceable(world, x, y, z, actor)) return PlaceResult.REJECT;
if (!source.takeOne(specialItemStack, true) && chatter != null) {
chatter.accept(
if (!source.takeOne(specialItemStack, true)) {
if (chatter != null) chatter.accept(
new ChatComponentTranslation(
"structurelib.autoplace.error.no_item_stack",
specialItemStack.func_151000_E()));
5 changes: 3 additions & 2 deletions src/main/resources/assets/gtnhcommunitymod/lang/en_US.lang
Original file line number Diff line number Diff line change
@@ -1561,6 +1561,7 @@ Tooltip_SpaceScaler_09=T2 block unlock HIP Unit limitation, T3 block unlock Stab
GT5U.gui.text.SimpleShutDownReasons.NoEnoughCriticalPhotonInput=No Enough Critical Photon Input
Tooltip_EcoSphereSimulator.0.13=Secondary recipes incomplete
NameIndustrialAlchemyTower=Industrial Alchemy Tower
tst.recipe.IndustrialAlchemyTowerRecipe=Industrial Alchemy Tower Recipe
tst.recipe.IndustrialAlchemyTowerRecipe=Industrial Alchemy Tower
IndustrialAlchemyTowerRecipeInputAspects=Recipe required Essentia
Tooltip_IndustrialAlchemyTower_MachineType=Controller block for the Industrial Alchemy Tower
Tooltip_IndustrialAlchemyTower_MachineType=Alchemy Tower
tile.ArcaneHole.name=§l§dArcane Empty Space
5 changes: 3 additions & 2 deletions src/main/resources/assets/gtnhcommunitymod/lang/zh_CN.lang
Original file line number Diff line number Diff line change
@@ -1561,6 +1561,7 @@ Tooltip_SpaceScaler_09=2级方块解锁HIP单元限制, 3级解锁稳定黑洞
GT5U.gui.text.SimpleShutDownReasons.NoEnoughCriticalPhotonInput=没有足够临界光子输入
Tooltip_EcoSphereSimulator.0.13=二级配方尚未完成
NameIndustrialAlchemyTower=工业炼金塔
tst.recipe.IndustrialAlchemyTowerRecipe=工业炼金塔配方
tst.recipe.IndustrialAlchemyTowerRecipe=工业炼金塔
IndustrialAlchemyTowerRecipeInputAspects=配方所需要素
Tooltip_IndustrialAlchemyTower_MachineType=工业炼金塔的控制器方块
Tooltip_IndustrialAlchemyTower_MachineType=工业炼金塔
tile.ArcaneHole.name=§l§d奥术裂隙