Merge branch 'master' into drilldo

This commit is contained in:
George Paton 2025-09-15 11:00:14 +10:00
commit dbd63e706f
97 changed files with 10634 additions and 179 deletions

View File

@ -10,9 +10,9 @@
**This is for 1.7.10!** For 1.12, check out these projects: **This is for 1.7.10!** For 1.12, check out these projects:
* NTM Reloaded: https://github.com/TheOriginalGolem/Hbm-s-Nuclear-Tech-GIT/releases
* NTM Extended Edition (Alcater): https://github.com/Alcatergit/Hbm-s-Nuclear-Tech-GIT/releases
* NTM Community Edition (WarFactory): https://github.com/MisterNorwood/Hbm-s-Nuclear-Tech-CE * NTM Community Edition (WarFactory): https://github.com/MisterNorwood/Hbm-s-Nuclear-Tech-CE
* NTM Extended Edition (Alcater): https://github.com/Alcatergit/Hbm-s-Nuclear-Tech-GIT/releases
* NTM Reloaded: https://github.com/TheOriginalGolem/Hbm-s-Nuclear-Tech-GIT/releases
For 1.18, try Martin's remake: https://codeberg.org/MartinTheDragon/Nuclear-Tech-Mod-Remake/releases For 1.18, try Martin's remake: https://codeberg.org/MartinTheDragon/Nuclear-Tech-Mod-Remake/releases

View File

@ -1,15 +1,27 @@
## Added
* New assembly factory
* Once again four recipe units at double the base speed
* Upgrades and stats are identical to the chemical factory
* Comes with an improved version of the old assemfac animations
## Changed ## Changed
* The amount of filled rebar that can be rendered at once is now capped (can be changed with the client config `RENDER_REBAR_LIMIT`) * Updated chinese localization
* This causes holes and looks a bit buggy, but for now it's better than lagging the game out * Added more QMAW manual pages
* The amount of light beams per solar boiler is now limited (can be changed with the client config `RENDER_HELIOSTAT_BEAM_LIMIT`) * WIAJ presentations now use the same configurable keybind as QMAW
* Changed the way mirror linking works for the solar boiler * Shift has to be held for the presentations, while F1 will open the standard QMAW page
* The max range is now 100m (instead of 25m) * Double UZIs no longer render weirdly when dropped
* There is now an angle requirement, mirrors cannot be rotated more than 45° * Added keyboard controls to the recipe selector's scroll function
* This means that the solar boiler can use more mirrors, the higher up it is * Up and down keys scroll by one line
* Existing setups will continue to function, as these rules only apply during the linking process * PgUp and PgDown scroll by 5 lines (full page)
* The PWR and watz now have NEI handlers, showing the fuel to depleted fuel process * Pos1 and End keys scroll to the top and bottom of the list respectively
* C4, like semtex, is now edible
* Assembly machines can now be made with the assembly machine
* The recipe is similar to the anvil recipe, but it uses only half as much steel, and one analog circuit instead of four vacuum tubes
## Fixed ## Fixed
* Fixed broken localization in the recipe selector GUI * Fixed fusion reactor item IO being broken
* Fixed the server crashing instantly * Fixed issue with the chemical factory where the declogging feature would be triggered by a recipe processor that doesn't even own the reported slot
* I lost track of how many times this has been an issue * Fixed the new PA not triggering the omega-12 achievement
* In addition to granting the achievement to nearby players on recipe completion, it is also granted when taking it out of the output slot
* Fixed the PUREX recipe for processing ZIRNOX MEU fuel not yielding technetium as it should
* Fixed turbofans pulling in players even when disabled via redstone

View File

@ -1,6 +1,6 @@
mod_version=1.0.27 mod_version=1.0.27
# Empty build number makes a release type # Empty build number makes a release type
mod_build_number=5441 mod_build_number=5453
credits=HbMinecraft,\ credits=HbMinecraft,\
\ rodolphito (explosion algorithms),\ \ rodolphito (explosion algorithms),\

View File

@ -1007,6 +1007,7 @@ public class ModBlocks {
@Deprecated public static Block machine_assembler; @Deprecated public static Block machine_assembler;
public static Block machine_assembly_machine; public static Block machine_assembly_machine;
@Deprecated public static Block machine_assemfac; @Deprecated public static Block machine_assemfac;
public static Block machine_assembly_factory;
public static Block machine_arc_welder; public static Block machine_arc_welder;
public static Block machine_soldering_station; public static Block machine_soldering_station;
public static Block machine_arc_furnace; public static Block machine_arc_furnace;
@ -2240,6 +2241,7 @@ public class ModBlocks {
machine_assembler = new MachineAssembler(Material.iron).setBlockName("machine_assembler").setHardness(5.0F).setResistance(30.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":machine_assembler"); machine_assembler = new MachineAssembler(Material.iron).setBlockName("machine_assembler").setHardness(5.0F).setResistance(30.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":machine_assembler");
machine_assembly_machine = new MachineAssemblyMachine(Material.iron).setBlockName("machine_assembly_machine").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_assembly_machine = new MachineAssemblyMachine(Material.iron).setBlockName("machine_assembly_machine").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel");
machine_assemfac = new MachineAssemfac(Material.iron).setBlockName("machine_assemfac").setHardness(5.0F).setResistance(30.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_assemfac = new MachineAssemfac(Material.iron).setBlockName("machine_assemfac").setHardness(5.0F).setResistance(30.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel");
machine_assembly_factory = new MachineAssemblyFactory(Material.iron).setBlockName("machine_assembly_factory").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel");
machine_arc_welder = new MachineArcWelder(Material.iron).setBlockName("machine_arc_welder").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_arc_welder = new MachineArcWelder(Material.iron).setBlockName("machine_arc_welder").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel");
machine_soldering_station = new MachineSolderingStation(Material.iron).setBlockName("machine_soldering_station").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_soldering_station = new MachineSolderingStation(Material.iron).setBlockName("machine_soldering_station").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel");
machine_chemplant = new MachineChemplant(Material.iron).setBlockName("machine_chemplant").setHardness(5.0F).setResistance(30.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_chemplant = new MachineChemplant(Material.iron).setBlockName("machine_chemplant").setHardness(5.0F).setResistance(30.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel");
@ -3298,6 +3300,7 @@ public class ModBlocks {
GameRegistry.registerBlock(machine_assembler, machine_assembler.getUnlocalizedName()); GameRegistry.registerBlock(machine_assembler, machine_assembler.getUnlocalizedName());
register(machine_assembly_machine); register(machine_assembly_machine);
GameRegistry.registerBlock(machine_assemfac, machine_assemfac.getUnlocalizedName()); GameRegistry.registerBlock(machine_assemfac, machine_assemfac.getUnlocalizedName());
register(machine_assembly_factory);
GameRegistry.registerBlock(machine_chemplant, machine_chemplant.getUnlocalizedName()); GameRegistry.registerBlock(machine_chemplant, machine_chemplant.getUnlocalizedName());
register(machine_chemical_plant); register(machine_chemical_plant);
register(machine_chemfac); register(machine_chemfac);

View File

@ -0,0 +1,88 @@
package com.hbm.blocks.machine;
import java.util.ArrayList;
import java.util.List;
import com.hbm.blocks.BlockDummyable;
import com.hbm.blocks.ILookOverlay;
import com.hbm.blocks.ITooltipProvider;
import com.hbm.tileentity.TileEntityProxyDyn;
import com.hbm.tileentity.machine.TileEntityMachineAssemblyFactory;
import com.hbm.util.fauxpointtwelve.DirPos;
import com.hbm.util.i18n.I18nUtil;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.World;
import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre;
import net.minecraftforge.common.util.ForgeDirection;
public class MachineAssemblyFactory extends BlockDummyable implements ITooltipProvider, ILookOverlay {
public MachineAssemblyFactory(Material mat) {
super(mat);
}
@Override
public TileEntity createNewTileEntity(World world, int meta) {
if(meta >= 12) return new TileEntityMachineAssemblyFactory();
if(meta >= 6) return new TileEntityProxyDyn().inventory().power().fluid();
return null;
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
return this.standardOpenBehavior(world, x, y, z, player, 0);
}
@Override public int[] getDimensions() { return new int[] {2, 0, 2, 2, 2, 2}; }
@Override public int getOffset() { return 2; }
@Override
public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) {
super.fillSpace(world, x, y, z, dir, o);
x -= dir.offsetX * 2;
z -= dir.offsetZ * 2;
for(int i = -2; i <= 2; i++) for(int j = -2; j <= 2; j++) {
if(Math.abs(i) == 2 || Math.abs(j) == 2) this.makeExtra(world, x + i, y, z + j);
}
ForgeDirection rot = dir.getRotation(ForgeDirection.UP);
for(int i = -2; i <= 2; i++) {
this.makeExtra(world, x + dir.offsetX * i + rot.offsetX * 2, y + 2, z + dir.offsetZ * i + rot.offsetZ * 2);
this.makeExtra(world, x + dir.offsetX * i - rot.offsetX * 2, y + 2, z + dir.offsetZ * i - rot.offsetZ * 2);
}
}
@Override
public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) {
this.addStandardInfo(stack, player, list, ext);
}
@Override
public void printHook(Pre event, World world, int x, int y, int z) {
int[] pos = this.findCore(world, x, y, z);
if(pos == null) return;
TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]);
if(!(te instanceof TileEntityMachineAssemblyFactory)) return;
TileEntityMachineAssemblyFactory assemfac = (TileEntityMachineAssemblyFactory) te;
DirPos[] cool = assemfac.getCoolPos();
for(DirPos dirPos : cool) if(dirPos.compare(x + dirPos.getDir().offsetX, y, z + dirPos.getDir().offsetZ)) {
List<String> text = new ArrayList();
text.add(EnumChatFormatting.GREEN + "-> " + EnumChatFormatting.RESET + assemfac.water.getTankType().getLocalizedName());
text.add(EnumChatFormatting.RED + "<- " + EnumChatFormatting.RESET + assemfac.lps.getTankType().getLocalizedName());
ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text);
break;
}
}
}

View File

@ -207,7 +207,7 @@ public class FalloutConfigJSON {
public FalloutEntry fo(double falloffStart) { this.falloffStart = falloffStart; return this; } public FalloutEntry fo(double falloffStart) { this.falloffStart = falloffStart; return this; }
public FalloutEntry sol(boolean solid) { this.isSolid = solid; return this; } public FalloutEntry sol(boolean solid) { this.isSolid = solid; return this; }
public boolean eval(World world, int x, int y, int z, Block b, int meta, double dist, Block originalBlock, int originalMeta) { public boolean eval(World world, int x, int y, int z, Block b, int meta, double dist) {
if(dist > maxDist || dist < minDist) return false; if(dist > maxDist || dist < minDist) return false;
if(matchesBlock != null && b != matchesBlock) return false; if(matchesBlock != null && b != matchesBlock) return false;
@ -219,9 +219,9 @@ public class FalloutConfigJSON {
MetaBlock conversion = chooseRandomOutcome((primaryChance == 1D || rand.nextDouble() < primaryChance) ? primaryBlocks : secondaryBlocks); MetaBlock conversion = chooseRandomOutcome((primaryChance == 1D || rand.nextDouble() < primaryChance) ? primaryBlocks : secondaryBlocks);
if(conversion != null) { if(conversion != null) {
if(conversion.block == ModBlocks.sellafield_slaked && originalBlock == ModBlocks.sellafield_slaked && conversion.meta <= originalMeta) return false; if(conversion.block == ModBlocks.sellafield_slaked && b == ModBlocks.sellafield_slaked && conversion.meta <= meta) return false;
if(conversion.block == ModBlocks.sellafield_bedrock && originalBlock == ModBlocks.sellafield_bedrock && conversion.meta <= originalMeta) return false; if(conversion.block == ModBlocks.sellafield_bedrock && b == ModBlocks.sellafield_bedrock && conversion.meta <= meta) return false;
if(originalBlock == ModBlocks.sellafield_bedrock && conversion.block != ModBlocks.sellafield_bedrock) return false; if(b == ModBlocks.sellafield_bedrock && conversion.block != ModBlocks.sellafield_bedrock) return false;
if(y == 0 && conversion.block != ModBlocks.sellafield_bedrock) return false; if(y == 0 && conversion.block != ModBlocks.sellafield_bedrock) return false;
world.setBlock(x, y, z, conversion.block, conversion.meta, 3); world.setBlock(x, y, z, conversion.block, conversion.meta, 3);

View File

@ -187,7 +187,7 @@ public class EntityFalloutRain extends EntityExplosionChunkloading {
for(FalloutEntry entry : FalloutConfigJSON.entries) { for(FalloutEntry entry : FalloutConfigJSON.entries) {
if(entry.eval(worldObj, x, y, z, b, meta, dist, b, meta)) { if(entry.eval(worldObj, x, y, z, b, meta, dist)) {
if(entry.isSolid()) { if(entry.isSolid()) {
depth++; depth++;
} }

View File

@ -658,11 +658,11 @@ public class OreDictManager {
for(NTMMaterial mat : Mats.orderedList) { for(NTMMaterial mat : Mats.orderedList) {
if(mat.autogen.contains(MaterialShapes.FRAGMENT)) { if(mat.autogen.contains(MaterialShapes.FRAGMENT)) {
String name = mat.names[0]; String name = mat.names[0];
if(!OreDictionary.getOres(MaterialShapes.DUST.name() + name).isEmpty()) MineralRecipes.add9To1(mat.make(ModItems.bedrock_ore_fragment), OreDictionary.getOres(MaterialShapes.DUST.name() + name).get(0)); if(!OreDictionary.getOres(MaterialShapes.DUST.name() + name).isEmpty()) MineralRecipes.add9To1(mat.make(ModItems.bedrock_ore_fragment), OreDictionary.getOres(MaterialShapes.DUST.name() + name).get(0).copy());
else if(!OreDictionary.getOres(MaterialShapes.GEM.name() + name).isEmpty()) MineralRecipes.add9To1(mat.make(ModItems.bedrock_ore_fragment), OreDictionary.getOres(MaterialShapes.GEM.name() + name).get(0)); else if(!OreDictionary.getOres(MaterialShapes.GEM.name() + name).isEmpty()) MineralRecipes.add9To1(mat.make(ModItems.bedrock_ore_fragment), OreDictionary.getOres(MaterialShapes.GEM.name() + name).get(0).copy());
else if(!OreDictionary.getOres(MaterialShapes.CRYSTAL.name() + name).isEmpty()) MineralRecipes.add9To1(mat.make(ModItems.bedrock_ore_fragment), OreDictionary.getOres(MaterialShapes.CRYSTAL.name() + name).get(0)); else if(!OreDictionary.getOres(MaterialShapes.CRYSTAL.name() + name).isEmpty()) MineralRecipes.add9To1(mat.make(ModItems.bedrock_ore_fragment), OreDictionary.getOres(MaterialShapes.CRYSTAL.name() + name).get(0).copy());
else if(!OreDictionary.getOres(MaterialShapes.INGOT.name() + name).isEmpty()) MineralRecipes.add9To1(mat.make(ModItems.bedrock_ore_fragment), OreDictionary.getOres(MaterialShapes.INGOT.name() + name).get(0)); else if(!OreDictionary.getOres(MaterialShapes.INGOT.name() + name).isEmpty()) MineralRecipes.add9To1(mat.make(ModItems.bedrock_ore_fragment), OreDictionary.getOres(MaterialShapes.INGOT.name() + name).get(0).copy());
else if(!OreDictionary.getOres(MaterialShapes.BILLET.name() + name).isEmpty()) MineralRecipes.addBilletFragment(OreDictionary.getOres(MaterialShapes.BILLET.name() + name).get(0), mat.make(ModItems.bedrock_ore_fragment)); else if(!OreDictionary.getOres(MaterialShapes.BILLET.name() + name).isEmpty()) MineralRecipes.addBilletFragment(OreDictionary.getOres(MaterialShapes.BILLET.name() + name).get(0).copy(), mat.make(ModItems.bedrock_ore_fragment));
else MineralRecipes.add9To1(mat.make(ModItems.bedrock_ore_fragment), new ItemStack(ModItems.nothing)); else MineralRecipes.add9To1(mat.make(ModItems.bedrock_ore_fragment), new ItemStack(ModItems.nothing));
} }
} }

View File

@ -0,0 +1,86 @@
package com.hbm.inventory.container;
import com.hbm.inventory.SlotCraftingOutput;
import com.hbm.inventory.SlotNonRetarded;
import com.hbm.items.ModItems;
import com.hbm.items.machine.ItemBlueprints;
import com.hbm.items.machine.ItemMachineUpgrade;
import com.hbm.util.InventoryUtil;
import api.hbm.energymk2.IBatteryItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
public class ContainerMachineAssemblyFactory extends ContainerBase {
public ContainerMachineAssemblyFactory(InventoryPlayer invPlayer, IInventory assemFac) {
super(invPlayer, assemFac);
// Battery
this.addSlotToContainer(new SlotNonRetarded(assemFac, 0, 234, 112));
// Upgrades
this.addSlots(assemFac, 1, 214, 149, 3, 1);
for(int i = 0; i < 4; i++) {
// Template
this.addSlots(assemFac, 4 + i * 14, 25 + (i % 2) * 109, 54 + (i / 2) * 56, 1, 1);
// Solid Input
this.addSlots(assemFac, 5 + i * 14, 7 + (i % 2) * 109, 20 + (i / 2) * 56, 2, 6, 16);
// Solid Output
this.addOutputSlots(invPlayer.player, assemFac, 17 + i * 14, 87 + (i % 2) * 109, 54 + (i / 2) * 56, 1, 1);
}
this.playerInv(invPlayer, 33, 158);
}
@Override
public ItemStack transferStackInSlot(EntityPlayer player, int index) {
ItemStack slotOriginal = null;
Slot slot = (Slot) this.inventorySlots.get(index);
if(slot != null && slot.getHasStack()) {
ItemStack slotStack = slot.getStack();
slotOriginal = slotStack.copy();
if(index <= tile.getSizeInventory() - 1) {
SlotCraftingOutput.checkAchievements(player, slotStack);
if(!this.mergeItemStack(slotStack, tile.getSizeInventory(), this.inventorySlots.size(), true)) {
return null;
}
} else {
if(slotOriginal.getItem() instanceof IBatteryItem || slotOriginal.getItem() == ModItems.battery_creative) {
if(!this.mergeItemStack(slotStack, 0, 1, false)) return null;
} else if(slotOriginal.getItem() instanceof ItemBlueprints) {
if(!this.mergeItemStack(slotStack, 4, 5, false)) return null;
} else if(slotOriginal.getItem() instanceof ItemBlueprints) {
if(!this.mergeItemStack(slotStack, 18, 19, false)) return null;
} else if(slotOriginal.getItem() instanceof ItemBlueprints) {
if(!this.mergeItemStack(slotStack, 32, 33, false)) return null;
} else if(slotOriginal.getItem() instanceof ItemBlueprints) {
if(!this.mergeItemStack(slotStack, 44, 45, false)) return null;
} else if(slotOriginal.getItem() instanceof ItemMachineUpgrade) {
if(!this.mergeItemStack(slotStack, 1, 4, false)) return null;
} else {
if(!InventoryUtil.mergeItemStack(this.inventorySlots, slotStack, 5, 17, false) &&
!InventoryUtil.mergeItemStack(this.inventorySlots, slotStack, 19, 31, false) &&
!InventoryUtil.mergeItemStack(this.inventorySlots, slotStack, 33, 46, false) &&
!InventoryUtil.mergeItemStack(this.inventorySlots, slotStack, 47, 59, false)) return null;
}
}
if(slotStack.stackSize == 0) {
slot.putStack(null);
} else {
slot.onSlotChanged();
}
slot.onPickupFromSlot(player, slotStack);
}
return slotOriginal;
}
}

View File

@ -1,6 +1,6 @@
package com.hbm.inventory.container; package com.hbm.inventory.container;
import com.hbm.inventory.SlotTakeOnly; import com.hbm.inventory.SlotCraftingOutput;
import com.hbm.items.ModItems; import com.hbm.items.ModItems;
import com.hbm.tileentity.machine.albion.TileEntityPADetector; import com.hbm.tileentity.machine.albion.TileEntityPADetector;
@ -24,8 +24,8 @@ public class ContainerPADetector extends Container {
this.addSlotToContainer(new Slot(tile, 1, 62, 18)); this.addSlotToContainer(new Slot(tile, 1, 62, 18));
this.addSlotToContainer(new Slot(tile, 2, 80, 18)); this.addSlotToContainer(new Slot(tile, 2, 80, 18));
//Outputs //Outputs
this.addSlotToContainer(new SlotTakeOnly(tile, 3, 62, 45)); this.addSlotToContainer(new SlotCraftingOutput(playerInv.player, tile, 3, 62, 45));
this.addSlotToContainer(new SlotTakeOnly(tile, 4, 80, 45)); this.addSlotToContainer(new SlotCraftingOutput(playerInv.player, tile, 4, 80, 45));
for(int i = 0; i < 3; i++) { for(int i = 0; i < 3; i++) {
for(int j = 0; j < 9; j++) { for(int j = 0; j < 9; j++) {

View File

@ -0,0 +1,140 @@
package com.hbm.inventory.gui;
import org.lwjgl.opengl.GL11;
import com.hbm.inventory.container.ContainerMachineAssemblyFactory;
import com.hbm.inventory.recipes.AssemblyMachineRecipes;
import com.hbm.inventory.recipes.loader.GenericRecipe;
import com.hbm.items.machine.ItemBlueprints;
import com.hbm.lib.RefStrings;
import com.hbm.tileentity.machine.TileEntityMachineAssemblyFactory;
import com.hbm.util.i18n.I18nUtil;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Slot;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.ResourceLocation;
public class GUIMachineAssemblyFactory extends GuiInfoContainer {
private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_assembly_factory.png");
private TileEntityMachineAssemblyFactory assembler;
public GUIMachineAssemblyFactory(InventoryPlayer invPlayer, TileEntityMachineAssemblyFactory tedf) {
super(new ContainerMachineAssemblyFactory(invPlayer, tedf));
assembler = tedf;
this.xSize = 256;
this.ySize = 240;
}
@Override
public void drawScreen(int mouseX, int mouseY, float f) {
super.drawScreen(mouseX, mouseY, f);
for(int j = 0; j < 4; j++) {
assembler.inputTanks[j].renderTankInfo(this, mouseX, mouseY, guiLeft + 105 + (j % 2) * 109, guiTop + 20 + (j / 2) * 56, 5, 32);
assembler.outputTanks[j].renderTankInfo(this, mouseX, mouseY, guiLeft + 105 + (j % 2) * 109, guiTop + 54 + (j / 2) * 56, 5, 16);
}
assembler.water.renderTankInfo(this, mouseX, mouseY, guiLeft + 232, guiTop + 149, 7, 52);
assembler.lps.renderTankInfo(this, mouseX, mouseY, guiLeft + 241, guiTop + 149, 7, 52);
this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 234, guiTop + 18, 16, 92, assembler.power, assembler.maxPower);
for(int i = 0; i < 4; i++) if(guiLeft + 6 + (i % 2) * 109 <= mouseX && guiLeft + 6 + (i % 2) * 109 + 18 > mouseX && guiTop + 53 + (i / 2) * 56 < mouseY && guiTop + 53 + (i / 2) * 56 + 18 >= mouseY) {
if(this.assembler.assemblerModule[i].recipe != null && AssemblyMachineRecipes.INSTANCE.recipeNameMap.containsKey(this.assembler.assemblerModule[i].recipe)) {
GenericRecipe recipe = (GenericRecipe) AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(this.assembler.assemblerModule[i].recipe);
this.func_146283_a(recipe.print(), mouseX, mouseY);
} else {
this.drawCreativeTabHoveringText(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("gui.recipe.setRecipe"), mouseX, mouseY);
}
}
}
@Override
protected void mouseClicked(int x, int y, int button) {
super.mouseClicked(x, y, button);
for(int i = 0; i < 4; i++) if(this.checkClick(x, y, 6 + (i % 2) * 109, 53 + (i / 2) * 56, 18, 18)) GUIScreenRecipeSelector.openSelector(AssemblyMachineRecipes.INSTANCE, assembler, assembler.assemblerModule[i].recipe, i, ItemBlueprints.grabPool(assembler.slots[4 + i * 14]), this);
}
@Override
protected void drawGuiContainerForegroundLayer(int i, int j) {
String name = this.assembler.hasCustomInventoryName() ? this.assembler.getInventoryName() : I18n.format(this.assembler.getInventoryName());
this.fontRendererObj.drawString(name, 113 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752);
this.fontRendererObj.drawString(I18n.format("container.inventory"), 33, this.ySize - 96 + 2, 4210752);
}
@Override
protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) {
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
Minecraft.getMinecraft().getTextureManager().bindTexture(texture);
drawTexturedModalRect(guiLeft, guiTop, 0, 0, 256, 140);
drawTexturedModalRect(guiLeft + 25, guiTop + 140, 25, 140, 231, 100);
int p = (int) (assembler.power * 92 / assembler.maxPower);
drawTexturedModalRect(guiLeft + 234, guiTop + 110 - p, 0, 232 - p, 16, p);
for(int i = 0; i < 4; i++) if(assembler.assemblerModule[i].progress > 0) {
int j = (int) Math.ceil(37 * assembler.assemblerModule[i].progress);
drawTexturedModalRect(guiLeft + 45 + (i % 2) * 109, guiTop + 63 + (i / 2) * 56, 0, 240, j, 6);
}
for(int g = 0; g < 4; g++) {
GenericRecipe recipe = AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(assembler.assemblerModule[g].recipe);
/// LEFT LED
if(assembler.didProcess[g]) {
drawTexturedModalRect(guiLeft + 45 + (g % 2) * 109, guiTop + 55 + (g / 2) * 56, 4, 236, 4, 4);
} else if(recipe != null) {
drawTexturedModalRect(guiLeft + 45 + (g % 2) * 109, guiTop + 55 + (g / 2) * 56, 0, 236, 4, 4);
}
/// RIGHT LED
if(assembler.didProcess[g]) {
drawTexturedModalRect(guiLeft + 53 + (g % 2) * 109, guiTop + 55 + (g / 2) * 56, 4, 236, 4, 4);
} else if(recipe != null && assembler.power >= recipe.power && assembler.canCool()) {
drawTexturedModalRect(guiLeft + 53 + (g % 2) * 109, guiTop + 55 + (g / 2) * 56, 0, 236, 4, 4);
}
}
for(int g = 0; g < 4; g++) {
GenericRecipe recipe = AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(assembler.assemblerModule[g].recipe);
this.renderItem(recipe != null ? recipe.getIcon() : TEMPLATE_FOLDER, 7 + (g % 2) * 109, 54 + (g / 2) * 56);
if(recipe != null && recipe.inputItem != null) {
for(int i = 0; i < recipe.inputItem.length; i++) {
Slot slot = (Slot) this.inventorySlots.inventorySlots.get(assembler.assemblerModule[g].inputSlots[i]);
if(!slot.getHasStack()) this.renderItem(recipe.inputItem[i].extractForCyclingDisplay(20), slot.xDisplayPosition, slot.yDisplayPosition, 10F);
}
Minecraft.getMinecraft().getTextureManager().bindTexture(texture);
OpenGlHelper.glBlendFunc(770, 771, 1, 0);
GL11.glColor4f(1F, 1F, 1F, 0.5F);
GL11.glEnable(GL11.GL_BLEND);
this.zLevel = 300F;
for(int i = 0; i < recipe.inputItem.length; i++) {
Slot slot = (Slot) this.inventorySlots.inventorySlots.get(assembler.assemblerModule[g].inputSlots[i]);
if(!slot.getHasStack()) drawTexturedModalRect(guiLeft + slot.xDisplayPosition, guiTop + slot.yDisplayPosition, slot.xDisplayPosition, slot.yDisplayPosition, 16, 16);
}
this.zLevel = 0F;
GL11.glColor4f(1F, 1F, 1F, 1F);
GL11.glDisable(GL11.GL_BLEND);
}
}
for(int j = 0; j < 4; j++) {
assembler.inputTanks[j].renderTank(guiLeft + 105 + (j % 2) * 109, guiTop + 52 + (j / 2) * 56, this.zLevel, 5, 32);
assembler.outputTanks[j].renderTank(guiLeft + 105 + (j % 2) * 109, guiTop + 70 + (j / 2) * 56, this.zLevel, 5, 16);
}
assembler.water.renderTank(guiLeft + 232, guiTop + 201, this.zLevel, 7, 52);
assembler.lps.renderTank(guiLeft + 241, guiTop + 201, this.zLevel, 7, 52);
}
}

View File

@ -8,6 +8,7 @@ import com.hbm.inventory.recipes.loader.GenericRecipe;
import com.hbm.items.machine.ItemBlueprints; import com.hbm.items.machine.ItemBlueprints;
import com.hbm.lib.RefStrings; import com.hbm.lib.RefStrings;
import com.hbm.tileentity.machine.TileEntityMachineChemicalFactory; import com.hbm.tileentity.machine.TileEntityMachineChemicalFactory;
import com.hbm.util.i18n.I18nUtil;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.OpenGlHelper;
@ -49,7 +50,7 @@ public class GUIMachineChemicalFactory extends GuiInfoContainer {
GenericRecipe recipe = (GenericRecipe) ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(this.chemplant.chemplantModule[i].recipe); GenericRecipe recipe = (GenericRecipe) ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(this.chemplant.chemplantModule[i].recipe);
this.func_146283_a(recipe.print(), mouseX, mouseY); this.func_146283_a(recipe.print(), mouseX, mouseY);
} else { } else {
this.drawCreativeTabHoveringText(EnumChatFormatting.YELLOW + "Click to set recipe", mouseX, mouseY); this.drawCreativeTabHoveringText(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("gui.recipe.setRecipe"), mouseX, mouseY);
} }
} }
} }

View File

@ -27,6 +27,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.MathHelper;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
public class GUIScreenRecipeSelector extends GuiScreen { public class GUIScreenRecipeSelector extends GuiScreen {
@ -326,6 +327,15 @@ public class GUIScreenRecipeSelector extends GuiScreen {
return; return;
} }
if(keyCode == Keyboard.KEY_UP) pageIndex--;
if(keyCode == Keyboard.KEY_DOWN) pageIndex++;
if(keyCode == Keyboard.KEY_PRIOR) pageIndex -= 5;
if(keyCode == Keyboard.KEY_NEXT) pageIndex += 5;
if(keyCode == Keyboard.KEY_HOME) pageIndex = 0;
if(keyCode == Keyboard.KEY_END) pageIndex = size;
pageIndex = MathHelper.clamp_int(pageIndex, 0, size);
if(keyCode == 1 || keyCode == this.mc.gameSettings.keyBindInventory.getKeyCode()) { if(keyCode == 1 || keyCode == this.mc.gameSettings.keyBindInventory.getKeyCode()) {
FMLCommonHandler.instance().showGuiScreen(previousScreen); FMLCommonHandler.instance().showGuiScreen(previousScreen);
} }

View File

@ -793,29 +793,6 @@ import net.minecraft.item.ItemStack;
new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR_BOARD) new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR_BOARD)
}, 100); }, 100);
makeRecipe(new ComparableStack(ModBlocks.machine_assemfac, 1), new AStack[] {
!exp ? new OreDictStack(STEEL.ingot(), 48) : new OreDictStack(STEEL.heavyComp(), 2),
new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8),
new OreDictStack(B.ingot(), 4),
new OreDictStack(RUBBER.ingot(), 16),
new OreDictStack(KEY_ANYPANE, 64),
new ComparableStack(ModItems.motor, 18),
new OreDictStack(W.bolt(), 16),
new OreDictStack(STEEL.pipe(), 8),
new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC)
}, 400);
makeRecipe(new ComparableStack(ModBlocks.machine_chemical_factory, 1), new AStack[] {
new OreDictStack(DURA.ingot(), 16),
new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8),
new OreDictStack(RUBBER.ingot(), 16),
new OreDictStack(STEEL.shell(), 12),
new OreDictStack(CU.pipe(), 8),
new ComparableStack(ModItems.motor_desh, 4),
new ComparableStack(ModItems.coil_tungsten, 16),
new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC)
}, 400);
makeRecipe(new ComparableStack(ModItems.missile_shuttle, 1), new AStack[] { makeRecipe(new ComparableStack(ModItems.missile_shuttle, 1), new AStack[] {
new ComparableStack(ModItems.missile_generic, 2), new ComparableStack(ModItems.missile_generic, 2),
new ComparableStack(ModItems.missile_strong, 1), new ComparableStack(ModItems.missile_strong, 1),

View File

@ -216,6 +216,8 @@ public class AssemblyMachineRecipes extends GenericRecipes<GenericRecipe> {
this.register(new GenericRecipe("ass.shredder").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_shredder, 1)) this.register(new GenericRecipe("ass.shredder").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_shredder, 1))
.inputItems(new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.motor, 2)) .inputItems(new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.motor, 2))
.inputItemsEx(new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.motor, 2))); .inputItemsEx(new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.motor, 2)));
this.register(new GenericRecipe("ass.assembler").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_assembly_machine, 1))
.inputItems(new OreDictStack(STEEL.ingot(), 4), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG)));
this.register(new GenericRecipe("ass.chemplant").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_chemical_plant, 1)) this.register(new GenericRecipe("ass.chemplant").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_chemical_plant, 1))
.inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(CU.pipe(), 2), new ComparableStack(ModItems.plate_polymer, 16), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.coil_tungsten, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG)) .inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(CU.pipe(), 2), new ComparableStack(ModItems.plate_polymer, 16), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.coil_tungsten, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))
.inputItemsEx(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.pipe(), 2), new ComparableStack(ModItems.plate_polymer, 16), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.coil_tungsten, 2), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ANALOG))); .inputItemsEx(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.pipe(), 2), new ComparableStack(ModItems.plate_polymer, 16), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.coil_tungsten, 2), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ANALOG)));
@ -338,6 +340,9 @@ public class AssemblyMachineRecipes extends GenericRecipes<GenericRecipe> {
this.register(new GenericRecipe("ass.strandcaster").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_strand_caster, 1)) this.register(new GenericRecipe("ass.strandcaster").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_strand_caster, 1))
.inputItems(new ComparableStack(ModItems.ingot_firebrick, 16), new OreDictStack(STEEL.plateCast(), 6), new OreDictStack(CU.plateWelded(), 2), new OreDictStack(STEEL.shell(), 2), new OreDictStack(ANY_CONCRETE.any(), 8)) .inputItems(new ComparableStack(ModItems.ingot_firebrick, 16), new OreDictStack(STEEL.plateCast(), 6), new OreDictStack(CU.plateWelded(), 2), new OreDictStack(STEEL.shell(), 2), new OreDictStack(ANY_CONCRETE.any(), 8))
.inputItemsEx(new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.ingot_firebrick, 16), new OreDictStack(STEEL.shell(), 4), new OreDictStack(ANY_CONCRETE.any(), 8))); .inputItemsEx(new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.ingot_firebrick, 16), new OreDictStack(STEEL.shell(), 4), new OreDictStack(ANY_CONCRETE.any(), 8)));
this.register(new GenericRecipe("ass.assemfac").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_assembly_factory, 1))
.inputItems(new OreDictStack(DURA.ingot(), 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(B.ingot(), 8), new OreDictStack(STEEL.shell(), 4), new ComparableStack(ModItems.motor, 12), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC))
.inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 16), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(B.ingot(), 8), new OreDictStack(STEEL.shell(), 4), new ComparableStack(ModItems.motor, 24), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.CIRCUIT)));
this.register(new GenericRecipe("ass.chemfac").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_chemical_factory, 1)) this.register(new GenericRecipe("ass.chemfac").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_chemical_factory, 1))
.inputItems(new OreDictStack(DURA.ingot(), 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(STEEL.shell(), 12), new OreDictStack(CU.pipe(), 8), new ComparableStack(ModItems.motor_desh, 4), new ComparableStack(ModItems.coil_tungsten, 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC)) .inputItems(new OreDictStack(DURA.ingot(), 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(STEEL.shell(), 12), new OreDictStack(CU.pipe(), 8), new ComparableStack(ModItems.motor_desh, 4), new ComparableStack(ModItems.coil_tungsten, 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC))
.inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 16), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(STEEL.shell(), 12), new OreDictStack(CU.pipe(), 16), new ComparableStack(ModItems.motor_desh, 16), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.CIRCUIT))); .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 16), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(STEEL.shell(), 12), new OreDictStack(CU.pipe(), 16), new ComparableStack(ModItems.motor_desh, 16), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.CIRCUIT)));

View File

@ -53,9 +53,9 @@ public class PUREXRecipes extends GenericRecipes<GenericRecipe> {
this.register(new GenericRecipe("purex.zirnoxmeu").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this) this.register(new GenericRecipe("purex.zirnoxmeu").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this)
.inputItems(new ComparableStack(ModItems.waste_uranium)) .inputItems(new ComparableStack(ModItems.waste_uranium))
.inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250))
.outputItems(new ItemStack(ModItems.nugget_u238, 1), .outputItems(new ItemStack(ModItems.nugget_pu_mix, 1),
new ItemStack(ModItems.nugget_pu_mix, 2), new ItemStack(ModItems.nugget_plutonium, 2),
new ItemStack(ModItems.nugget_pu239, 1), new ItemStack(ModItems.nugget_technetium, 1),
new ItemStack(ModItems.nuclear_waste_tiny, 2)) new ItemStack(ModItems.nuclear_waste_tiny, 2))
.setIconToFirstIngredient()); .setIconToFirstIngredient());
@ -80,8 +80,7 @@ public class PUREXRecipes extends GenericRecipes<GenericRecipe> {
this.register(new GenericRecipe("purex.zirnoxmep").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this) this.register(new GenericRecipe("purex.zirnoxmep").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this)
.inputItems(new ComparableStack(ModItems.waste_plutonium)) .inputItems(new ComparableStack(ModItems.waste_plutonium))
.inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250))
.outputItems(new ItemStack(ModItems.nugget_pu_mix, 1), .outputItems(new ItemStack(ModItems.nugget_pu_mix, 2),
new ItemStack(ModItems.nugget_pu_mix, 1),
new ItemStack(ModItems.nugget_technetium, 1), new ItemStack(ModItems.nugget_technetium, 1),
new ItemStack(ModItems.nuclear_waste_tiny, 3)) new ItemStack(ModItems.nuclear_waste_tiny, 3))
.setIconToFirstIngredient()); .setIconToFirstIngredient());

View File

@ -2316,7 +2316,7 @@ public class ModItems {
lithium = new Item().setUnlocalizedName("lithium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":lithium"); lithium = new Item().setUnlocalizedName("lithium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":lithium");
ingot_zirconium = new Item().setUnlocalizedName("ingot_zirconium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_zirconium"); ingot_zirconium = new Item().setUnlocalizedName("ingot_zirconium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_zirconium");
ingot_semtex = new ItemLemon(4, 5, true).setUnlocalizedName("ingot_semtex").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_semtex"); ingot_semtex = new ItemLemon(4, 5, true).setUnlocalizedName("ingot_semtex").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_semtex");
ingot_c4 = new Item().setUnlocalizedName("ingot_c4").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_c4"); ingot_c4 = new ItemLemon(4, 5, true).setUnlocalizedName("ingot_c4").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_c4");
ingot_phosphorus = new Item().setUnlocalizedName("ingot_phosphorus").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_phosphorus"); ingot_phosphorus = new Item().setUnlocalizedName("ingot_phosphorus").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_phosphorus");
coil_advanced_alloy = new Item().setUnlocalizedName("coil_advanced_alloy").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":coil_advanced_alloy"); coil_advanced_alloy = new Item().setUnlocalizedName("coil_advanced_alloy").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":coil_advanced_alloy");
coil_advanced_torus = new Item().setUnlocalizedName("coil_advanced_torus").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":coil_advanced_torus"); coil_advanced_torus = new Item().setUnlocalizedName("coil_advanced_torus").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":coil_advanced_torus");

View File

@ -229,7 +229,7 @@ public abstract class MagazineSingleTypeBase implements IMagazine<BulletConfig>
@Override public int getCapacity(ItemStack stack) { return capacity; } @Override public int getCapacity(ItemStack stack) { return capacity; }
@Override public int getAmount(ItemStack stack, IInventory inventory) { return getMagCount(stack, index); } @Override public int getAmount(ItemStack stack, IInventory inventory) { return getMagCount(stack, index); }
@Override public void setAmount(ItemStack stack, int amount) { setMagCount(stack, index, amount); } @Override public void setAmount(ItemStack stack, int amount) { setMagCount(stack, index, Math.max(amount, 0)); }
@Override public void setAmountBeforeReload(ItemStack stack, int amount) { ItemGunBaseNT.setValueInt(stack, KEY_MAG_PREV + index, amount); } @Override public void setAmountBeforeReload(ItemStack stack, int amount) { ItemGunBaseNT.setValueInt(stack, KEY_MAG_PREV + index, amount); }
@Override public int getAmountBeforeReload(ItemStack stack) { return ItemGunBaseNT.getValueInt(stack, KEY_MAG_PREV + index); } @Override public int getAmountBeforeReload(ItemStack stack) { return ItemGunBaseNT.getValueInt(stack, KEY_MAG_PREV + index); }

View File

@ -3,7 +3,7 @@ package com.hbm.lib;
public class RefStrings { public class RefStrings {
public static final String MODID = "hbm"; public static final String MODID = "hbm";
public static final String NAME = "Hbm's Nuclear Tech Mod"; public static final String NAME = "Hbm's Nuclear Tech Mod";
public static final String VERSION = "1.0.27 BETA (5441)"; public static final String VERSION = "1.0.27 BETA (5453)";
//HBM's Beta Naming Convention: //HBM's Beta Naming Convention:
//V T (X) //V T (X)
//V -> next release version //V -> next release version

View File

@ -271,6 +271,7 @@ public class ClientProxy extends ServerProxy {
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineAssembler.class, new RenderAssembler()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineAssembler.class, new RenderAssembler());
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineAssemblyMachine.class, new RenderAssemblyMachine()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineAssemblyMachine.class, new RenderAssemblyMachine());
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineAssemfac.class, new RenderAssemfac()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineAssemfac.class, new RenderAssemfac());
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineAssemblyFactory.class, new RenderAssemblyFactory());
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineChemplant.class, new RenderChemplant()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineChemplant.class, new RenderChemplant());
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineChemicalPlant.class, new RenderChemicalPlant()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineChemicalPlant.class, new RenderChemicalPlant());
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineChemfac.class, new RenderChemfac()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineChemfac.class, new RenderChemfac());
@ -772,7 +773,7 @@ public class ClientProxy extends ServerProxy {
RenderingRegistry.registerEntityRenderingHandler(EntityPigeon.class, new RenderPigeon(new ModelPigeon(), 0.3F)); RenderingRegistry.registerEntityRenderingHandler(EntityPigeon.class, new RenderPigeon(new ModelPigeon(), 0.3F));
RenderingRegistry.registerEntityRenderingHandler(EntityDummy.class, new RenderDummy()); RenderingRegistry.registerEntityRenderingHandler(EntityDummy.class, new RenderDummy());
RenderingRegistry.registerEntityRenderingHandler(EntityUndeadSoldier.class, new RenderUndeadSoldier()); RenderingRegistry.registerEntityRenderingHandler(EntityUndeadSoldier.class, new RenderUndeadSoldier());
//"particles" //"particles" (abysmal dogshit)
RenderingRegistry.registerEntityRenderingHandler(EntityChlorineFX.class, new MultiCloudRenderer(new Item[] { ModItems.chlorine1, ModItems.chlorine2, ModItems.chlorine3, ModItems.chlorine4, ModItems.chlorine5, ModItems.chlorine6, ModItems.chlorine7, ModItems.chlorine8 })); RenderingRegistry.registerEntityRenderingHandler(EntityChlorineFX.class, new MultiCloudRenderer(new Item[] { ModItems.chlorine1, ModItems.chlorine2, ModItems.chlorine3, ModItems.chlorine4, ModItems.chlorine5, ModItems.chlorine6, ModItems.chlorine7, ModItems.chlorine8 }));
RenderingRegistry.registerEntityRenderingHandler(EntityPinkCloudFX.class, new MultiCloudRenderer(new Item[] { ModItems.pc1, ModItems.pc2, ModItems.pc3, ModItems.pc4, ModItems.pc5, ModItems.pc6, ModItems.pc7, ModItems.pc8 })); RenderingRegistry.registerEntityRenderingHandler(EntityPinkCloudFX.class, new MultiCloudRenderer(new Item[] { ModItems.pc1, ModItems.pc2, ModItems.pc3, ModItems.pc4, ModItems.pc5, ModItems.pc6, ModItems.pc7, ModItems.pc8 }));
RenderingRegistry.registerEntityRenderingHandler(com.hbm.entity.particle.EntityCloudFX.class, new MultiCloudRenderer(new Item[] { ModItems.cloud1, ModItems.cloud2, ModItems.cloud3, ModItems.cloud4, ModItems.cloud5, ModItems.cloud6, ModItems.cloud7, ModItems.cloud8 })); RenderingRegistry.registerEntityRenderingHandler(com.hbm.entity.particle.EntityCloudFX.class, new MultiCloudRenderer(new Item[] { ModItems.cloud1, ModItems.cloud2, ModItems.cloud3, ModItems.cloud4, ModItems.cloud5, ModItems.cloud6, ModItems.cloud7, ModItems.cloud8 }));

View File

@ -742,17 +742,6 @@ public class ModEventHandlerClient {
} }
} }
try {
CanneryBase cannery = Jars.canneries.get(comp);
if(cannery != null) {
list.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey("cannery.f1"));
lastCannery = comp;
canneryTimestamp = Clock.get_ms();
}
} catch(Exception ex) {
list.add(EnumChatFormatting.RED + "Error loading cannery: " + ex.getLocalizedMessage());
}
try { try {
QuickManualAndWiki qmaw = QMAWLoader.triggers.get(comp); QuickManualAndWiki qmaw = QMAWLoader.triggers.get(comp);
if(qmaw == null) { if(qmaw == null) {
@ -767,6 +756,17 @@ public class ModEventHandlerClient {
list.add(EnumChatFormatting.RED + "Error loading cannery: " + ex.getLocalizedMessage()); list.add(EnumChatFormatting.RED + "Error loading cannery: " + ex.getLocalizedMessage());
} }
try {
CanneryBase cannery = Jars.canneries.get(comp);
if(cannery != null) {
list.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey("cannery.f1", Keyboard.getKeyName(Keyboard.KEY_LSHIFT) + " + " + Keyboard.getKeyName(HbmKeybinds.qmaw.getKeyCode())));
lastCannery = comp;
canneryTimestamp = Clock.get_ms();
}
} catch(Exception ex) {
list.add(EnumChatFormatting.RED + "Error loading cannery: " + ex.getLocalizedMessage());
}
/*ItemStack copy = stack.copy(); /*ItemStack copy = stack.copy();
List<MaterialStack> materials = Mats.getMaterialsFromItem(copy); List<MaterialStack> materials = Mats.getMaterialsFromItem(copy);
@ -895,7 +895,7 @@ public class ModEventHandlerClient {
} }
} }
if(Keyboard.isKeyDown(Keyboard.KEY_F1) && Minecraft.getMinecraft().currentScreen != null) { if(Keyboard.isKeyDown(HbmKeybinds.qmaw.getKeyCode()) && Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) && Minecraft.getMinecraft().currentScreen != null) {
ComparableStack comp = canneryTimestamp > Clock.get_ms() - 100 ? lastCannery : null; ComparableStack comp = canneryTimestamp > Clock.get_ms() - 100 ? lastCannery : null;
@ -913,7 +913,7 @@ public class ModEventHandlerClient {
} }
} }
if(Keyboard.isKeyDown(HbmKeybinds.qmaw.getKeyCode()) && Minecraft.getMinecraft().currentScreen != null) { if(Keyboard.isKeyDown(HbmKeybinds.qmaw.getKeyCode()) && !Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) && Minecraft.getMinecraft().currentScreen != null) {
QuickManualAndWiki qmaw = qmawTimestamp > Clock.get_ms() - 100 ? lastQMAW : null; QuickManualAndWiki qmaw = qmawTimestamp > Clock.get_ms() - 100 ? lastQMAW : null;

View File

@ -142,6 +142,7 @@ public class ResourceManager {
public static final IModelCustom assembler_arm = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/assembler_new_arm.obj")); public static final IModelCustom assembler_arm = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/assembler_new_arm.obj"));
public static final IModelCustom assembly_machine = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/assembly_machine.obj")).asVBO(); public static final IModelCustom assembly_machine = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/assembly_machine.obj")).asVBO();
public static final IModelCustom assemfac = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/assemfac.obj")).asVBO(); public static final IModelCustom assemfac = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/assemfac.obj")).asVBO();
public static final IModelCustom assembly_factory = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/assembly_factory.obj")).asVBO();
//Chemplant //Chemplant
public static final IModelCustom chemplant_body = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/chemplant_new_body.obj")).asVBO(); public static final IModelCustom chemplant_body = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/chemplant_new_body.obj")).asVBO();
@ -578,6 +579,8 @@ public class ResourceManager {
public static final ResourceLocation assembler_arm_tex = new ResourceLocation(RefStrings.MODID, "textures/models/assembler_arm_new.png"); public static final ResourceLocation assembler_arm_tex = new ResourceLocation(RefStrings.MODID, "textures/models/assembler_arm_new.png");
public static final ResourceLocation assembly_machine_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/assembly_machine.png"); public static final ResourceLocation assembly_machine_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/assembly_machine.png");
public static final ResourceLocation assemfac_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/assemfac.png"); public static final ResourceLocation assemfac_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/assemfac.png");
public static final ResourceLocation assembly_factory_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/assembly_factory.png");
public static final ResourceLocation assembly_factory_sparks_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/assembly_factory_sparks.png");
//Chemplant //Chemplant
public static final ResourceLocation chemplant_body_tex = new ResourceLocation(RefStrings.MODID, "textures/models/chemplant_base_new.png"); public static final ResourceLocation chemplant_body_tex = new ResourceLocation(RefStrings.MODID, "textures/models/chemplant_base_new.png");

View File

@ -201,6 +201,9 @@ public abstract class ModuleMachineBase {
/** Returns true if the supplied slot is occupied with an item that does not match the recipe */ /** Returns true if the supplied slot is occupied with an item that does not match the recipe */
public boolean isSlotClogged(int slot) { public boolean isSlotClogged(int slot) {
boolean isSlotValid = false;
for(int i : inputSlots) if(i == slot) isSlotValid = true;
if(!isSlotValid) return false;
ItemStack stack = slots[slot]; ItemStack stack = slots[slot];
if(stack == null) return false; if(stack == null) return false;
return !isItemValid(slot, stack); // we need to use this because it also handles autoswitch correctly, otherwise autoswitch items may be ejected instantly return !isItemValid(slot, stack); // we need to use this because it also handles autoswitch correctly, otherwise autoswitch items may be ejected instantly

View File

@ -195,6 +195,43 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase {
GL11.glShadeModel(GL11.GL_FLAT); GL11.glShadeModel(GL11.GL_FLAT);
} }
public void renderEntity(ItemStack stack) {
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glShadeModel(GL11.GL_SMOOTH);
boolean silencer0 = hasSilencer(stack, 1);
boolean silencer1 = hasSilencer(stack, 0);
boolean anySilenced = silencer0 || silencer1;
if(anySilenced) {
GL11.glScaled(0.75, 0.75, 0.75);
}
GL11.glPushMatrix();
GL11.glTranslated(-1, 1, 0);
Minecraft.getMinecraft().renderEngine.bindTexture(isSaturnite(stack, 1) ? ResourceManager.uzi_saturnite_tex : ResourceManager.uzi_tex);
ResourceManager.uzi.renderPart("Gun");
ResourceManager.uzi.renderPart("StockBack");
ResourceManager.uzi.renderPart("StockFront");
ResourceManager.uzi.renderPart("Slide");
ResourceManager.uzi.renderPart("Magazine");
if(silencer0) ResourceManager.uzi.renderPart("Silencer");
GL11.glPopMatrix();
GL11.glPushMatrix();
GL11.glTranslated(1, 1, 0);
Minecraft.getMinecraft().renderEngine.bindTexture(isSaturnite(stack, 0) ? ResourceManager.uzi_saturnite_tex : ResourceManager.uzi_tex);
ResourceManager.uzi.renderPart("GunMirror");
ResourceManager.uzi.renderPart("StockBack");
ResourceManager.uzi.renderPart("StockFront");
ResourceManager.uzi.renderPart("Slide");
ResourceManager.uzi.renderPart("Magazine");
if(silencer1) ResourceManager.uzi.renderPart("Silencer");
GL11.glPopMatrix();
GL11.glShadeModel(GL11.GL_FLAT);
}
@Override @Override
public void renderOther(ItemStack stack, ItemRenderType type) { public void renderOther(ItemStack stack, ItemRenderType type) {
GL11.glEnable(GL11.GL_LIGHTING); GL11.glEnable(GL11.GL_LIGHTING);

View File

@ -0,0 +1,283 @@
package com.hbm.render.tileentity;
import org.lwjgl.opengl.GL11;
import com.hbm.blocks.BlockDummyable;
import com.hbm.blocks.ModBlocks;
import com.hbm.inventory.recipes.AssemblyMachineRecipes;
import com.hbm.inventory.recipes.loader.GenericRecipe;
import com.hbm.main.MainRegistry;
import com.hbm.main.ResourceManager;
import com.hbm.render.item.ItemRenderBase;
import com.hbm.tileentity.machine.TileEntityMachineAssemblyFactory;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.client.IItemRenderer;
public class RenderAssemblyFactory extends TileEntitySpecialRenderer implements IItemRendererProvider {
public static EntityItem dummy;
@Override
public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float interp) {
GL11.glPushMatrix();
GL11.glTranslated(x + 0.5, y, z + 0.5);
GL11.glRotated(90, 0, 1, 0);
GL11.glShadeModel(GL11.GL_SMOOTH);
switch(tileEntity.getBlockMetadata() - BlockDummyable.offset) {
case 2: GL11.glRotatef(0, 0F, 1F, 0F); break;
case 4: GL11.glRotatef(90, 0F, 1F, 0F); break;
case 3: GL11.glRotatef(180, 0F, 1F, 0F); break;
case 5: GL11.glRotatef(270, 0F, 1F, 0F); break;
}
TileEntityMachineAssemblyFactory assemfac = (TileEntityMachineAssemblyFactory) tileEntity;
bindTexture(ResourceManager.assembly_factory_tex);
ResourceManager.assembly_factory.renderPart("Base");
if(assemfac.frame) ResourceManager.assembly_factory.renderPart("Frame");
double slide1 = assemfac.animations[0].getSlider(interp);
double slide2 = assemfac.animations[1].getSlider(interp);
double[] arm1 = assemfac.animations[0].striker.getPositions(interp);
double[] arm2 = assemfac.animations[0].saw.getPositions(interp);
double[] arm3 = assemfac.animations[1].striker.getPositions(interp);
double[] arm4 = assemfac.animations[1].saw.getPositions(interp);
GL11.glPushMatrix(); {
GL11.glTranslated(0.5 - slide1, 0, 0);
ResourceManager.assembly_factory.renderPart("Slider1");
GL11.glTranslated(0, 1.625, -0.9375);
GL11.glRotated(-arm1[0], 1, 0, 0);
GL11.glTranslated(0, -1.625, 0.9375);
ResourceManager.assembly_factory.renderPart("ArmLower1");
GL11.glTranslated(0, 2.375, -0.9375);
GL11.glRotated(-arm1[1], 1, 0, 0);
GL11.glTranslated(0, -2.375, 0.9375);
ResourceManager.assembly_factory.renderPart("ArmUpper1");
GL11.glTranslated(0, 2.375, -0.4375);
GL11.glRotated(-arm1[2], 1, 0, 0);
GL11.glTranslated(0, -2.375, 0.4375);
ResourceManager.assembly_factory.renderPart("Head1");
GL11.glTranslated(0, arm1[3], 0);
ResourceManager.assembly_factory.renderPart("Striker1");
} GL11.glPopMatrix();
GL11.glPushMatrix(); {
GL11.glTranslated(-0.5 + slide1, 0, 0);
ResourceManager.assembly_factory.renderPart("Slider2");
GL11.glTranslated(0, 1.625, 0.9375);
GL11.glRotated(arm2[0], 1, 0, 0);
GL11.glTranslated(0, -1.625, -0.9375);
ResourceManager.assembly_factory.renderPart("ArmLower2");
GL11.glTranslated(0, 2.375, 0.9375);
GL11.glRotated(arm2[1], 1, 0, 0);
GL11.glTranslated(0, -2.375, -0.9375);
ResourceManager.assembly_factory.renderPart("ArmUpper2");
GL11.glTranslated(0, 2.375, 0.4375);
GL11.glRotated(arm2[2], 1, 0, 0);
GL11.glTranslated(0, -2.375, -0.4375);
ResourceManager.assembly_factory.renderPart("Head2");
GL11.glTranslated(0, arm2[3], 0);
ResourceManager.assembly_factory.renderPart("Striker2");
GL11.glTranslated(0, 1.625, 0.3125);
GL11.glRotated(-arm2[4], 1, 0, 0);
GL11.glTranslated(0, -1.625, -0.3125);
ResourceManager.assembly_factory.renderPart("Blade2");
} GL11.glPopMatrix();
GL11.glPushMatrix(); {
GL11.glTranslated(-0.5 + slide2, 0, 0);
ResourceManager.assembly_factory.renderPart("Slider3");
GL11.glTranslated(0, 1.625, 0.9375);
GL11.glRotated(arm3[0], 1, 0, 0);
GL11.glTranslated(0, -1.625, -0.9375);
ResourceManager.assembly_factory.renderPart("ArmLower3");
GL11.glTranslated(0, 2.375, 0.9375);
GL11.glRotated(arm3[1], 1, 0, 0);
GL11.glTranslated(0, -2.375, -0.9375);
ResourceManager.assembly_factory.renderPart("ArmUpper3");
GL11.glTranslated(0, 2.375, 0.4375);
GL11.glRotated(arm3[2], 1, 0, 0);
GL11.glTranslated(0, -2.375, -0.4375);
ResourceManager.assembly_factory.renderPart("Head3");
GL11.glTranslated(0, arm3[3], 0);
ResourceManager.assembly_factory.renderPart("Striker3");
} GL11.glPopMatrix();
GL11.glPushMatrix(); {
GL11.glTranslated(0.5 - slide2, 0, 0);
ResourceManager.assembly_factory.renderPart("Slider4");
GL11.glTranslated(0, 1.625, -0.9375);
GL11.glRotated(-arm4[0], 1, 0, 0);
GL11.glTranslated(0, -1.625, 0.9375);
ResourceManager.assembly_factory.renderPart("ArmLower4");
GL11.glTranslated(0, 2.375, -0.9375);
GL11.glRotated(-arm4[1], 1, 0, 0);
GL11.glTranslated(0, -2.375, 0.9375);
ResourceManager.assembly_factory.renderPart("ArmUpper4");
GL11.glTranslated(0, 2.375, -0.4375);
GL11.glRotated(-arm4[2], 1, 0, 0);
GL11.glTranslated(0, -2.375, 0.4375);
ResourceManager.assembly_factory.renderPart("Head4");
GL11.glTranslated(0, arm4[3], 0);
ResourceManager.assembly_factory.renderPart("Striker4");
GL11.glTranslated(0, 1.625, -0.3125);
GL11.glRotated(arm4[4], 1, 0, 0);
GL11.glTranslated(0, -1.625, 0.3125);
ResourceManager.assembly_factory.renderPart("Blade4");
} GL11.glPopMatrix();
if(MainRegistry.proxy.me().getDistanceSq(tileEntity.xCoord + 0.5, tileEntity.yCoord + 1, tileEntity.zCoord + 0.5) < 35 * 35) {
for(int i = 0; i < 4; i++) {
GL11.glPushMatrix();
GL11.glTranslated(1.5 - i, 0, 0);
GL11.glRotated(90, 0, 1, 0);
GL11.glTranslated(0, 1.0625, 0);
GenericRecipe recipe = AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(assemfac.assemblerModule[i].recipe);
if(recipe != null) {
ItemStack stack = recipe.getIcon();
stack.stackSize = 1;
if(stack.getItemSpriteNumber() == 0 && stack.getItem() instanceof ItemBlock) {
if(RenderBlocks.renderItemIn3d(Block.getBlockFromItem(stack.getItem()).getRenderType())) {
GL11.glTranslated(0, -0.0625, 0);
} else {
GL11.glTranslated(0, -0.125, 0);
GL11.glScaled(0.5, 0.5, 0.5);
}
} else {
GL11.glRotated(-90, 1, 0, 0);
GL11.glTranslated(0, -0.25, 0);
}
GL11.glScaled(1.25, 1.25, 1.25);
if(dummy == null || dummy.worldObj != tileEntity.getWorldObj()) dummy = new EntityItem(tileEntity.getWorldObj(), 0, 0, 0, stack);
dummy.setEntityItemStack(stack);
dummy.hoverStart = 0.0F;
RenderItem.renderInFrame = true;
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F);
RenderItem.renderInFrame = false;
}
GL11.glPopMatrix();
}
RenderArcFurnace.fullbright(true);
GL11.glDisable(GL11.GL_CULL_FACE);
GL11.glEnable(GL11.GL_BLEND);
GL11.glAlphaFunc(GL11.GL_GREATER, 0);
OpenGlHelper.glBlendFunc(770, 771, 1, 0);
bindTexture(ResourceManager.assembly_factory_sparks_tex);
Tessellator tess = Tessellator.instance;
double wide = 0.1875D;
double narrow = 0.00D;
double length = 1.25D;
double uMin = ((tileEntity.getWorldObj().getTotalWorldTime() / 10D + interp)) % 10;
double uMax = uMin + 1;
double epsilon = 0.01D;
// renders two layers of sparks, one with regular UV and one with mirrored +0.5 offset
// render left and right of the blade with small offset to eliminate z-fighting
GL11.glPushMatrix(); if(arm2[3] <= -0.375D) {
GL11.glTranslated(0.5 + slide1, 1.0625D, -arm2[2] / 45D); // arm angle/45 is a seemingly good enough approximation
tess.startDrawingQuads();
tess.setColorRGBA_F(1F, 1F, 1F, 0F);
tess.addVertexWithUV(-epsilon, -wide, length, uMin + 0.5, 0);
tess.addVertexWithUV(-epsilon, wide, length, uMin + 0.5, 1);
tess.setColorRGBA_F(1F, 1F, 1F, 1F);
tess.addVertexWithUV(-epsilon, narrow, 0, uMax + 0.5, 1);
tess.addVertexWithUV(-epsilon, -narrow, 0, uMax + 0.5, 0);
tess.setColorRGBA_F(1F, 1F, 1F, 0F);
tess.addVertexWithUV(epsilon, -wide, length, uMin, 1);
tess.addVertexWithUV(epsilon, wide, length, uMin, 0);
tess.setColorRGBA_F(1F, 1F, 1F, 1F);
tess.addVertexWithUV(epsilon, narrow, 0, uMax, 0);
tess.addVertexWithUV(epsilon, -narrow, 0, uMax, 1);
tess.draw();
} GL11.glPopMatrix();
GL11.glPushMatrix(); if(arm4[3] <= -0.375D) {
GL11.glTranslated(-0.5 - slide2, 1.0625D, arm4[2] / 45D);
tess.startDrawingQuads();
tess.setColorRGBA_F(1F, 1F, 1F, 0F);
tess.addVertexWithUV(-epsilon, -wide, -length, uMin + 0.5, 0);
tess.addVertexWithUV(-epsilon, wide, -length, uMin + 0.5, 1);
tess.setColorRGBA_F(1F, 1F, 1F, 1F);
tess.addVertexWithUV(-epsilon, narrow, 0, uMax + 0.5, 1);
tess.addVertexWithUV(-epsilon, -narrow, 0, uMax + 0.5, 0);
tess.setNormal(-1, 0, 0);
tess.setColorRGBA_F(1F, 1F, 1F, 0F);
tess.addVertexWithUV(epsilon, -wide, -length, uMin, 1);
tess.addVertexWithUV(epsilon, wide, -length, uMin, 0);
tess.setColorRGBA_F(1F, 1F, 1F, 1F);
tess.addVertexWithUV(epsilon, narrow, 0, uMax, 0);
tess.addVertexWithUV(epsilon, -narrow, 0, uMax, 1);
tess.draw();
} GL11.glPopMatrix();
GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F);
GL11.glDisable(GL11.GL_BLEND);
GL11.glEnable(GL11.GL_CULL_FACE);
RenderArcFurnace.fullbright(false);
}
GL11.glShadeModel(GL11.GL_FLAT);
GL11.glPopMatrix();
}
@Override
public Item getItemForRenderer() {
return Item.getItemFromBlock(ModBlocks.machine_assembly_factory);
}
@Override
public IItemRenderer getRenderer() {
return new ItemRenderBase() {
public void renderInventory() {
GL11.glTranslated(0, -1.5, 0);
GL11.glScaled(3, 3, 3);
}
public void renderCommonWithStack(ItemStack item) {
GL11.glScaled(0.75, 0.75, 0.75);
GL11.glShadeModel(GL11.GL_SMOOTH);
bindTexture(ResourceManager.assembly_factory_tex);
ResourceManager.assembly_factory.renderAll();
GL11.glShadeModel(GL11.GL_FLAT);
}};
}
}

View File

@ -352,6 +352,7 @@ public class TileMappings {
put(TileEntityMachineAssembler.class, "tileentity_assembly_machine"); put(TileEntityMachineAssembler.class, "tileentity_assembly_machine");
put(TileEntityMachineAssemblyMachine.class, "tileentity_assemblymachine"); put(TileEntityMachineAssemblyMachine.class, "tileentity_assemblymachine");
put(TileEntityMachineAssemfac.class, "tileentity_assemfac"); put(TileEntityMachineAssemfac.class, "tileentity_assemfac");
put(TileEntityMachineAssemblyFactory.class, "tileentity_assemblyfactory");
put(TileEntityMachineChemplant.class, "tileentity_chemical_plant"); put(TileEntityMachineChemplant.class, "tileentity_chemical_plant");
put(TileEntityMachineChemicalPlant.class, "tileentity_chemicalplant"); put(TileEntityMachineChemicalPlant.class, "tileentity_chemicalplant");
put(TileEntityMachineChemfac.class, "tileentity_chemfac"); put(TileEntityMachineChemfac.class, "tileentity_chemfac");

View File

@ -318,7 +318,7 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyRece
@Override @Override
public boolean canExtractItem(int slot, ItemStack stack, int side) { public boolean canExtractItem(int slot, ItemStack stack, int side) {
return slot == 2; // only allow removing breeder outputs return slot == 2 || slot == 4; // only allow removing breeder outputs <- ?????
} }
@Override @Override

View File

@ -0,0 +1,692 @@
package com.hbm.tileentity.machine;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
import com.hbm.blocks.ModBlocks;
import com.hbm.interfaces.IControlReceiver;
import com.hbm.interfaces.NotableComments;
import com.hbm.inventory.UpgradeManagerNT;
import com.hbm.inventory.container.ContainerMachineAssemblyFactory;
import com.hbm.inventory.fluid.Fluids;
import com.hbm.inventory.fluid.tank.FluidTank;
import com.hbm.inventory.gui.GUIMachineAssemblyFactory;
import com.hbm.inventory.recipes.AssemblyMachineRecipes;
import com.hbm.inventory.recipes.loader.GenericRecipe;
import com.hbm.items.ModItems;
import com.hbm.items.machine.ItemMachineUpgrade;
import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType;
import com.hbm.lib.Library;
import com.hbm.main.MainRegistry;
import com.hbm.module.machine.ModuleMachineAssembler;
import com.hbm.sound.AudioWrapper;
import com.hbm.tileentity.IGUIProvider;
import com.hbm.tileentity.IUpgradeInfoProvider;
import com.hbm.tileentity.TileEntityMachineBase;
import com.hbm.tileentity.TileEntityProxyDyn.IProxyDelegateProvider;
import com.hbm.util.BobMathUtil;
import com.hbm.util.fauxpointtwelve.DirPos;
import com.hbm.util.i18n.I18nUtil;
import api.hbm.energymk2.IEnergyReceiverMK2;
import api.hbm.fluidmk2.IFluidStandardTransceiverMK2;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
// TODO: make a base class because 90% of this is just copy pasted from the chemfac
@NotableComments
public class TileEntityMachineAssemblyFactory extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiverMK2, IUpgradeInfoProvider, IControlReceiver, IGUIProvider, IProxyDelegateProvider {
public FluidTank[] allTanks;
public FluidTank[] inputTanks;
public FluidTank[] outputTanks;
public FluidTank water;
public FluidTank lps;
public long power;
public long maxPower = 1_000_000;
public boolean[] didProcess = new boolean[4];
public boolean frame = false;
private AudioWrapper audio;
public TragicYuri[] animations;
public ModuleMachineAssembler[] assemblerModule;
public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(this);
protected DelegateAssemblyFactoy delegate = new DelegateAssemblyFactoy();
public TileEntityMachineAssemblyFactory() {
super(60);
animations = new TragicYuri[2];
for(int i = 0; i < animations.length; i++) animations[i] = new TragicYuri(i);
this.inputTanks = new FluidTank[4];
this.outputTanks = new FluidTank[4];
for(int i = 0; i < 4; i++) {
this.inputTanks[i] = new FluidTank(Fluids.NONE, 4_000);
this.outputTanks[i] = new FluidTank(Fluids.NONE, 4_000);
}
this.water = new FluidTank(Fluids.WATER, 4_000);
this.lps = new FluidTank(Fluids.SPENTSTEAM, 4_000);
this.allTanks = new FluidTank[this.inputTanks.length + this.outputTanks.length + 2];
for(int i = 0; i < inputTanks.length; i++) this.allTanks[i] = this.inputTanks[i];
for(int i = 0; i < outputTanks.length; i++) this.allTanks[i + this.inputTanks.length] = this.outputTanks[i];
this.allTanks[this.allTanks.length - 2] = this.water;
this.allTanks[this.allTanks.length - 1] = this.lps;
this.assemblerModule = new ModuleMachineAssembler[4];
for(int i = 0; i < 4; i++) this.assemblerModule[i] = new ModuleMachineAssembler(i, this, slots)
.itemInput(5 + i * 14).itemOutput(17 + i * 14)
.fluidInput(inputTanks[i]).fluidOutput(outputTanks[i]);
}
@Override
public boolean canExtractItem(int i, ItemStack itemStack, int j) {
for(int k = 0; k < 4; k++) if(i == 17 + k * 14) return true;
for(int k = 0; k < 4; k++) if(this.assemblerModule[k].isSlotClogged(i)) return true;
return false;
}
@Override
public boolean isItemValidForSlot(int slot, ItemStack stack) {
if(slot == 0) return true; // battery
for(int i = 0; i < 4; i++) if(slot == 4 + i * 14 && stack.getItem() == ModItems.blueprints) return true;
if(slot >= 1 && slot <= 3 && stack.getItem() instanceof ItemMachineUpgrade) return true; // upgrades
for(int i = 0; i < 4; i++) if(this.assemblerModule[i].isItemValid(slot, stack)) return true; // recipe input crap
return false;
}
@Override
public int[] getAccessibleSlotsFromSide(int side) {
return new int[] {
5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59
}; // ho boy, a big fucking array of hand-written values, surely this isn't gonna bite me in the ass some day
}
@Override
public String getName() {
return "container.machineAssemblyFactory";
}
@Override
public void updateEntity() {
if(maxPower <= 0) this.maxPower = 10_000_000;
if(!worldObj.isRemote) {
long nextMaxPower = 0;
for(int i = 0; i < 4; i++) {
GenericRecipe recipe = AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(assemblerModule[i].recipe);
if(recipe != null) {
nextMaxPower += recipe.power * 100;
}
}
this.maxPower = nextMaxPower;
this.maxPower = BobMathUtil.max(this.power, this.maxPower, 1_000_000);
this.power = Library.chargeTEFromItems(slots, 0, power, maxPower);
upgradeManager.checkSlots(slots, 1, 3);
for(DirPos pos : getConPos()) {
this.trySubscribe(worldObj, pos);
for(FluidTank tank : inputTanks) if(tank.getTankType() != Fluids.NONE) this.trySubscribe(tank.getTankType(), worldObj, pos);
for(FluidTank tank : outputTanks) if(tank.getFill() > 0) this.tryProvide(tank, worldObj, pos);
}
for(DirPos pos : getCoolPos()) {
delegate.trySubscribe(worldObj, pos);
delegate.trySubscribe(water.getTankType(), worldObj, pos);
delegate.tryProvide(lps, worldObj, pos);
}
double speed = 1D;
double pow = 1D;
speed += Math.min(upgradeManager.getLevel(UpgradeType.SPEED), 3) / 3D;
speed += Math.min(upgradeManager.getLevel(UpgradeType.OVERDRIVE), 3);
pow -= Math.min(upgradeManager.getLevel(UpgradeType.POWER), 3) * 0.25D;
pow += Math.min(upgradeManager.getLevel(UpgradeType.SPEED), 3) * 1D;
pow += Math.min(upgradeManager.getLevel(UpgradeType.OVERDRIVE), 3) * 10D / 3D;
boolean markDirty = false;
for(int i = 0; i < 4; i++) {
this.assemblerModule[i].update(speed * 2D, pow * 2D, canCool(), slots[4 + i * 14]);
this.didProcess[i] = this.assemblerModule[i].didProcess;
markDirty |= this.assemblerModule[i].markDirty;
if(this.assemblerModule[i].didProcess) {
this.water.setFill(this.water.getFill() - 100);
this.lps.setFill(this.lps.getFill() + 100);
}
}
if(markDirty) this.markDirty();
this.networkPackNT(100);
} else {
if((didProcess[0] ||didProcess[1] ||didProcess[2] ||didProcess[3]) && MainRegistry.proxy.me().getDistance(xCoord , yCoord, zCoord) < 50) {
if(audio == null) {
audio = createAudioLoop();
audio.startSound();
} else if(!audio.isPlaying()) {
audio = rebootAudio(audio);
}
audio.keepAlive();
audio.updatePitch(0.75F);
audio.updateVolume(this.getVolume(0.5F));
} else {
if(audio != null) {
audio.stopSound();
audio = null;
}
}
for(TragicYuri animation : animations) animation.update(didProcess[0] ||didProcess[1] ||didProcess[2] ||didProcess[3]);
if(worldObj.getTotalWorldTime() % 20 == 0) {
frame = !worldObj.getBlock(xCoord, yCoord + 3, zCoord).isAir(worldObj, xCoord, yCoord + 3, zCoord);
}
}
}
@Override public AudioWrapper createAudioLoop() {
return MainRegistry.proxy.getLoopedSound("hbm:block.motor", xCoord, yCoord, zCoord, 0.5F, 15F, 0.75F, 20);
}
@Override public void onChunkUnload() {
if(audio != null) { audio.stopSound(); audio = null; }
}
@Override public void invalidate() {
super.invalidate();
if(audio != null) { audio.stopSound(); audio = null; }
}
public boolean canCool() {
return water.getFill() >= 100 && lps.getFill() <= lps.getMaxFill() - 100;
}
public DirPos[] getConPos() {
ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10);
ForgeDirection rot = dir.getRotation(ForgeDirection.UP);
return new DirPos[] {
new DirPos(xCoord + 3, yCoord, zCoord - 2, Library.POS_X),
new DirPos(xCoord + 3, yCoord, zCoord + 0, Library.POS_X),
new DirPos(xCoord + 3, yCoord, zCoord + 2, Library.POS_X),
new DirPos(xCoord - 3, yCoord, zCoord - 2, Library.NEG_X),
new DirPos(xCoord - 3, yCoord, zCoord + 0, Library.NEG_X),
new DirPos(xCoord - 3, yCoord, zCoord + 2, Library.NEG_X),
new DirPos(xCoord - 2, yCoord, zCoord + 3, Library.POS_Z),
new DirPos(xCoord + 0, yCoord, zCoord + 3, Library.POS_Z),
new DirPos(xCoord + 2, yCoord, zCoord + 3, Library.POS_Z),
new DirPos(xCoord - 2, yCoord, zCoord - 3, Library.NEG_Z),
new DirPos(xCoord + 0, yCoord, zCoord - 3, Library.NEG_Z),
new DirPos(xCoord + 2, yCoord, zCoord - 3, Library.NEG_Z),
new DirPos(xCoord + dir.offsetX + rot.offsetX * 3, yCoord, zCoord + dir.offsetZ + rot.offsetZ * 3, rot),
new DirPos(xCoord - dir.offsetX + rot.offsetX * 3, yCoord, zCoord - dir.offsetZ + rot.offsetZ * 3, rot),
new DirPos(xCoord + dir.offsetX - rot.offsetX * 3, yCoord, zCoord + dir.offsetZ - rot.offsetZ * 3, rot.getOpposite()),
new DirPos(xCoord - dir.offsetX - rot.offsetX * 3, yCoord, zCoord - dir.offsetZ - rot.offsetZ * 3, rot.getOpposite()),
};
}
public DirPos[] getCoolPos() {
ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10);
ForgeDirection rot = dir.getRotation(ForgeDirection.UP);
return new DirPos[] {
new DirPos(xCoord + rot.offsetX + dir.offsetX * 3, yCoord, zCoord + rot.offsetZ + dir.offsetZ * 3, dir),
new DirPos(xCoord - rot.offsetX + dir.offsetX * 3, yCoord, zCoord - rot.offsetZ + dir.offsetZ * 3, dir),
new DirPos(xCoord + rot.offsetX - dir.offsetX * 3, yCoord, zCoord + rot.offsetZ - dir.offsetZ * 3, dir.getOpposite()),
new DirPos(xCoord - rot.offsetX - dir.offsetX * 3, yCoord, zCoord - rot.offsetZ - dir.offsetZ * 3, dir.getOpposite()),
};
}
@Override
public void serialize(ByteBuf buf) {
super.serialize(buf);
for(FluidTank tank : inputTanks) tank.serialize(buf);
for(FluidTank tank : outputTanks) tank.serialize(buf);
water.serialize(buf);
lps.serialize(buf);
buf.writeLong(power);
buf.writeLong(maxPower);
for(boolean b : didProcess) buf.writeBoolean(b);
for(int i = 0; i < 4; i++) this.assemblerModule[i].serialize(buf);
}
@Override
public void deserialize(ByteBuf buf) {
super.deserialize(buf);
for(FluidTank tank : inputTanks) tank.deserialize(buf);
for(FluidTank tank : outputTanks) tank.deserialize(buf);
water.deserialize(buf);
lps.deserialize(buf);
this.power = buf.readLong();
this.maxPower = buf.readLong();
for(int i = 0; i < 4; i++) this.didProcess[i] = buf.readBoolean();
for(int i = 0; i < 4; i++) this.assemblerModule[i].deserialize(buf);
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
for(int i = 0; i < inputTanks.length; i++) this.inputTanks[i].readFromNBT(nbt, "i" + i);
for(int i = 0; i < outputTanks.length; i++) this.outputTanks[i].readFromNBT(nbt, "i" + i);
this.water.readFromNBT(nbt, "w");
this.lps.readFromNBT(nbt, "s");
this.power = nbt.getLong("power");
this.maxPower = nbt.getLong("maxPower");
for(int i = 0; i < 4; i++) this.assemblerModule[i].readFromNBT(nbt);
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
for(int i = 0; i < inputTanks.length; i++) this.inputTanks[i].writeToNBT(nbt, "i" + i);
for(int i = 0; i < outputTanks.length; i++) this.outputTanks[i].writeToNBT(nbt, "i" + i);
this.water.writeToNBT(nbt, "w");
this.lps.writeToNBT(nbt, "s");
nbt.setLong("power", power);
nbt.setLong("maxPower", maxPower);
for(int i = 0; i < 4; i++) this.assemblerModule[i].writeToNBT(nbt);
}
@Override public long getPower() { return power; }
@Override public void setPower(long power) { this.power = power; }
@Override public long getMaxPower() { return maxPower; }
@Override public FluidTank[] getReceivingTanks() { return inputTanks; }
@Override public FluidTank[] getSendingTanks() { return outputTanks; }
@Override public FluidTank[] getAllTanks() { return allTanks; }
@Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerMachineAssemblyFactory(player.inventory, this); }
@Override @SideOnly(Side.CLIENT) public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIMachineAssemblyFactory(player.inventory, this); }
@Override public boolean hasPermission(EntityPlayer player) { return this.isUseableByPlayer(player); }
@Override
public void receiveControl(NBTTagCompound data) {
if(data.hasKey("index") && data.hasKey("selection")) {
int index = data.getInteger("index");
String selection = data.getString("selection");
if(index >= 0 && index < 4) {
this.assemblerModule[index].recipe = selection;
this.markChanged();
}
}
}
AxisAlignedBB bb = null;
@Override
public AxisAlignedBB getRenderBoundingBox() {
if(bb == null) bb = AxisAlignedBB.getBoundingBox(xCoord - 2, yCoord, zCoord - 2, xCoord + 3, yCoord + 3, zCoord + 3);
return bb;
}
@Override
@SideOnly(Side.CLIENT)
public double getMaxRenderDistanceSquared() {
return 65536.0D;
}
@Override
public boolean canProvideInfo(UpgradeType type, int level, boolean extendedInfo) {
return type == UpgradeType.SPEED || type == UpgradeType.POWER || type == UpgradeType.OVERDRIVE;
}
@Override
public void provideInfo(UpgradeType type, int level, List<String> info, boolean extendedInfo) {
info.add(IUpgradeInfoProvider.getStandardLabel(ModBlocks.machine_chemical_factory));
if(type == UpgradeType.SPEED) {
info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(KEY_SPEED, "+" + (level * 100 / 3) + "%"));
info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(KEY_CONSUMPTION, "+" + (level * 50) + "%"));
}
if(type == UpgradeType.POWER) {
info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(KEY_CONSUMPTION, "-" + (level * 25) + "%"));
}
if(type == UpgradeType.OVERDRIVE) {
info.add((BobMathUtil.getBlink() ? EnumChatFormatting.RED : EnumChatFormatting.DARK_GRAY) + "YES");
}
}
@Override
public HashMap<UpgradeType, Integer> getValidUpgrades() {
HashMap<UpgradeType, Integer> upgrades = new HashMap<>();
upgrades.put(UpgradeType.SPEED, 3);
upgrades.put(UpgradeType.POWER, 3);
upgrades.put(UpgradeType.OVERDRIVE, 3);
return upgrades;
}
public DirPos[] coolantLine;
@Override // carelessly copy pasted from TileEntityMachineChemicalFactory
public Object getDelegateForPosition(int x, int y, int z) {
ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10);
ForgeDirection rot = dir.getRotation(ForgeDirection.UP);
if(coolantLine == null) coolantLine = new DirPos[] {
new DirPos(xCoord + rot.offsetX + dir.offsetX * 2, yCoord, zCoord + rot.offsetZ + dir.offsetZ * 2, dir),
new DirPos(xCoord - rot.offsetX + dir.offsetX * 2, yCoord, zCoord - rot.offsetZ + dir.offsetZ * 2, dir),
new DirPos(xCoord + rot.offsetX - dir.offsetX * 2, yCoord, zCoord + rot.offsetZ - dir.offsetZ * 2, dir.getOpposite()),
new DirPos(xCoord - rot.offsetX - dir.offsetX * 2, yCoord, zCoord - rot.offsetZ - dir.offsetZ * 2, dir.getOpposite()),
};
for(DirPos pos : coolantLine) if(pos.compare(x, y, z)) return this.delegate; // this actually fucking works
return null;
}
public class DelegateAssemblyFactoy implements IEnergyReceiverMK2, IFluidStandardTransceiverMK2 { // scumware
@Override public long getPower() { return TileEntityMachineAssemblyFactory.this.getPower(); }
@Override public void setPower(long power) { TileEntityMachineAssemblyFactory.this.setPower(power); }
@Override public long getMaxPower() { return TileEntityMachineAssemblyFactory.this.getMaxPower(); }
@Override public boolean isLoaded() { return TileEntityMachineAssemblyFactory.this.isLoaded(); }
@Override public FluidTank[] getReceivingTanks() { return new FluidTank[] {TileEntityMachineAssemblyFactory.this.water}; }
@Override public FluidTank[] getSendingTanks() { return new FluidTank[] {TileEntityMachineAssemblyFactory.this.lps}; }
@Override public FluidTank[] getAllTanks() { return TileEntityMachineAssemblyFactory.this.getAllTanks(); }
}
/**
* Carriage consisting of two arms - a striker and a saw
* Movement of both arms is inverted, one pedestal can only be serviced by one arm at a time
*
* @author hbm
*/
public class TragicYuri {
public AssemblerArm striker;
public AssemblerArm saw;
Random rand = new Random();
YuriState state = YuriState.WORKING;
double slider = 0;
double prevSlider = 0;
boolean direction = false;
int timeUntilReposition;
public TragicYuri(int group) {
striker = new AssemblerArm( group == 0 ? 0 : 3);
saw = new AssemblerArm( group == 0 ? 1 : 2).yepThatsASaw();
timeUntilReposition = 140 + rand.nextInt(161);
}
public void update(boolean working) {
this.prevSlider = this.slider;
// one of the arms must do something. doesn't matter which or what position the carriage is in
if(didProcess[striker.recipeIndex] || didProcess[saw.recipeIndex]) switch(state) {
case WORKING: {
timeUntilReposition--;
if(timeUntilReposition <= 0) {
state = YuriState.RETIRING;
}
} break;
case RETIRING: {
if(striker.state == ArmState.WAIT && saw.state == ArmState.WAIT) { // only progress as soon as both arms are done moving
state = YuriState.SLIDING;
direction = !direction;
if(!muffled) MainRegistry.proxy.playSoundClient(xCoord, yCoord, zCoord, "hbm:block.assemblerStart", getVolume(0.25F), 1.25F + worldObj.rand.nextFloat() * 0.25F);
}
} break;
case SLIDING: {
double sliderSpeed = 1D / 10D; // 10 ticks for transit
if(direction) {
slider += sliderSpeed;
if(slider >= 1) {
slider = 1;
state = YuriState.WORKING;
}
} else {
slider -= sliderSpeed;
if(slider <= 0) {
slider = 0;
state = YuriState.WORKING;
}
}
if(state == YuriState.WORKING) timeUntilReposition = 140 + rand.nextInt(161); // 7 to 15 seconds
} break;
}
striker.updateArm();
saw.updateArm();
}
public double getSlider(float interp) {
return this.prevSlider + (this.slider - this.prevSlider) * interp;
}
// there's a ton of way to make this more optimized/readable/professional/scrungular but i don't care i am happy this crap works at all
public class AssemblerArm { // more fucking nesting!!!11
public double[] angles = new double[4];
public double[] prevAngles = new double[4];
public double[] targetAngles = new double[4];
public double[] speed = new double[4];
public double sawAngle;
public double prevSawAngle;
public int recipeIndex; // the index of which pedestal is serviced, assuming the carriage is at default position
ArmState state = ArmState.REPOSITION;
int actionDelay = 0;
boolean saw = false;
public AssemblerArm(int index) {
this.recipeIndex = index;
this.resetSpeed();
this.chooseNewArmPoistion();
}
public AssemblerArm yepThatsASaw() { this.saw = true; this.chooseNewArmPoistion(); return this; }
private void resetSpeed() {
speed[0] = 15; //Pivot
speed[1] = 15; //Arm
speed[2] = 15; //Piston
speed[3] = saw ? 0.125 : 0.5; //Striker
}
public void updateArm() {
resetSpeed();
for(int i = 0; i < angles.length; i++) {
prevAngles[i] = angles[i];
}
prevSawAngle = sawAngle;
int serviceIndex = recipeIndex;
if(slider > 0.5) serviceIndex += (serviceIndex % 2 == 0 ? 1 : -1); // if the carriage has moved, swap the indices so they match up with the serviced pedestal
if(!didProcess[serviceIndex]) state = ArmState.RETIRE;
if(state == ArmState.CUT || state == ArmState.EXTEND) {
this.sawAngle += 45D;
}
if(actionDelay > 0) {
actionDelay--;
return;
}
switch(state) {
// Move. If done moving, set a delay and progress to EXTEND
case REPOSITION: {
if(move()) {
actionDelay = 2;
state = ArmState.EXTEND;
targetAngles[3] = saw ? -0.375D : -0.75D;
}
} break;
case EXTEND:
if(move()) {
if(saw) {
state = ArmState.CUT;
targetAngles[2] = -targetAngles[2];
if(!muffled) MainRegistry.proxy.playSoundClient(xCoord, yCoord, zCoord, "hbm:block.assemblerCut", getVolume(0.5F), 1F + rand.nextFloat() * 0.25F);
} else {
state = ArmState.RETRACT;
targetAngles[3] = 0D;
if(!muffled) MainRegistry.proxy.playSoundClient(xCoord, yCoord, zCoord, "hbm:block.assemblerStrike", getVolume(0.5F), 1F);
}
}
break;
case CUT: {
speed[2] = Math.abs(targetAngles[2] / 20D);
if(move()) {
state = ArmState.RETRACT;
targetAngles[3] = 0D;
}
} break;
case RETRACT:
if(move()) {
actionDelay = 2 + rand.nextInt(5);
chooseNewArmPoistion();
state = TragicYuri.this.state == YuriState.RETIRING ? ArmState.RETIRE : ArmState.REPOSITION;
}
break;
case RETIRE: {
this.targetAngles[0] = 0;
this.targetAngles[1] = 0;
this.targetAngles[2] = 0;
this.targetAngles[3] = 0;
if(move()) {
actionDelay = 2 + rand.nextInt(5);
chooseNewArmPoistion();
state = ArmState.WAIT;
}
} break;
case WAIT: {
if(TragicYuri.this.state == YuriState.WORKING) this.state = ArmState.REPOSITION;
} break;
}
}
public void chooseNewArmPoistion() {
double[][] pos = !saw ? new double[][] {
// striker
{10, 10, -10},
{15, 15, -15},
{25, 10, -15},
{30, 0, -10},
{-10, 10, 0},
{-20, 30, -15}
} : new double[][] {
// saw
{-15, 15, -10},
{-15, 15, -15},
{-15, 15, 10},
{-15, 15, 15},
{-15, 15, 2},
{-15, 15, -2}
};
int chosen = rand.nextInt(pos.length);
this.targetAngles[0] = pos[chosen][0];
this.targetAngles[1] = pos[chosen][1];
this.targetAngles[2] = pos[chosen][2];
}
private boolean move() {
boolean didMove = false;
for(int i = 0; i < angles.length; i++) {
if(angles[i] == targetAngles[i])
continue;
didMove = true;
double angle = angles[i];
double target = targetAngles[i];
double turn = speed[i];
double delta = Math.abs(angle - target);
if(delta <= turn) {
angles[i] = targetAngles[i];
continue;
}
if(angle < target) {
angles[i] += turn;
} else {
angles[i] -= turn;
}
}
return !didMove;
}
public double[] getPositions(float interp) {
return new double[] {
BobMathUtil.interp(this.prevAngles[0], this.angles[0], interp),
BobMathUtil.interp(this.prevAngles[1], this.angles[1], interp),
BobMathUtil.interp(this.prevAngles[2], this.angles[2], interp),
BobMathUtil.interp(this.prevAngles[3], this.angles[3], interp),
BobMathUtil.interp(this.prevSawAngle, this.sawAngle, interp)
};
}
}
}
/*
* Arms cycle through REPOSITION -> EXTEND -> CUT (if saw) -> RETRACT
* If transit is planned, the carriage's state will change to RETIRING
* If the carriage is RETIRING, each arm will enter RETIRE state after RETRACT
* Once the arm has returned to null position, it changes to WAIT
* If both arms WAIT, the carriage switches to SLIDING
* Once transit is done, carriage returns to WORKING
* If the carriage is WORKING, any arm that is in the WAIT state will return to REPOSITION
*/
public static enum YuriState {
WORKING,
RETIRING, // waiting for arms to enter WAITING state
SLIDING // transit to next position
}
public static enum ArmState {
REPOSITION,
EXTEND,
CUT,
RETRACT,
RETIRE, // return to null position for carriage transit
WAIT // either waiting for or in the middle of carriage transit
}
}

View File

@ -31,6 +31,7 @@ import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
@Deprecated
public class TileEntityMachineAssemfac extends TileEntityMachineAssemblerBase implements IFluidStandardTransceiver, IUpgradeInfoProvider, IFluidCopiable { public class TileEntityMachineAssemfac extends TileEntityMachineAssemblerBase implements IFluidStandardTransceiver, IUpgradeInfoProvider, IFluidCopiable {
public AssemblerArm[] arms; public AssemblerArm[] arms;

View File

@ -146,14 +146,6 @@ public class TileEntityMachineChemicalFactory extends TileEntityMachineBase impl
this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); this.power = Library.chargeTEFromItems(slots, 0, power, maxPower);
upgradeManager.checkSlots(slots, 1, 3); upgradeManager.checkSlots(slots, 1, 3);
inputTanks[0].loadTank(10, 13, slots);
inputTanks[1].loadTank(11, 14, slots);
inputTanks[2].loadTank(12, 15, slots);
outputTanks[0].unloadTank(16, 19, slots);
outputTanks[1].unloadTank(17, 20, slots);
outputTanks[2].unloadTank(18, 21, slots);
for(DirPos pos : getConPos()) { for(DirPos pos : getConPos()) {
this.trySubscribe(worldObj, pos); this.trySubscribe(worldObj, pos);
for(FluidTank tank : inputTanks) if(tank.getTankType() != Fluids.NONE) this.trySubscribe(tank.getTankType(), worldObj, pos); for(FluidTank tank : inputTanks) if(tank.getTankType() != Fluids.NONE) this.trySubscribe(tank.getTankType(), worldObj, pos);
@ -188,6 +180,7 @@ public class TileEntityMachineChemicalFactory extends TileEntityMachineBase impl
} }
} }
// internal fluid sharing logic
for(FluidTank in : inputTanks) if(in.getTankType() != Fluids.NONE) for(FluidTank out : outputTanks) { // up to 144 iterations, but most of them are NOP anyway for(FluidTank in : inputTanks) if(in.getTankType() != Fluids.NONE) for(FluidTank out : outputTanks) { // up to 144 iterations, but most of them are NOP anyway
if(out.getTankType() == Fluids.NONE) continue; if(out.getTankType() == Fluids.NONE) continue;
if(out.getTankType() != in.getTankType()) continue; if(out.getTankType() != in.getTankType()) continue;

View File

@ -346,7 +346,7 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem
* All movement related stuff has to be repeated on the client, but only for the client's player * All movement related stuff has to be repeated on the client, but only for the client's player
* Otherwise this could lead to desync since the motion is never sent form the server * Otherwise this could lead to desync since the motion is never sent form the server
*/ */
if(tank.getFill() > 0 && !MainRegistry.proxy.me().capabilities.isCreativeMode) { if(wasOn && !MainRegistry.proxy.me().capabilities.isCreativeMode) {
ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10).getRotation(ForgeDirection.UP); ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10).getRotation(ForgeDirection.UP);
ForgeDirection rot = dir.getRotation(ForgeDirection.UP); ForgeDirection rot = dir.getRotation(ForgeDirection.UP);

View File

@ -1,10 +1,14 @@
package com.hbm.tileentity.machine.albion; package com.hbm.tileentity.machine.albion;
import java.util.List;
import com.hbm.inventory.container.ContainerPADetector; import com.hbm.inventory.container.ContainerPADetector;
import com.hbm.inventory.gui.GUIPADetector; import com.hbm.inventory.gui.GUIPADetector;
import com.hbm.inventory.recipes.ParticleAcceleratorRecipes; import com.hbm.inventory.recipes.ParticleAcceleratorRecipes;
import com.hbm.inventory.recipes.ParticleAcceleratorRecipes.ParticleAcceleratorRecipe; import com.hbm.inventory.recipes.ParticleAcceleratorRecipes.ParticleAcceleratorRecipe;
import com.hbm.items.ModItems;
import com.hbm.lib.Library; import com.hbm.lib.Library;
import com.hbm.main.MainRegistry;
import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IGUIProvider;
import com.hbm.tileentity.machine.albion.TileEntityPASource.PAState; import com.hbm.tileentity.machine.albion.TileEntityPASource.PAState;
import com.hbm.tileentity.machine.albion.TileEntityPASource.Particle; import com.hbm.tileentity.machine.albion.TileEntityPASource.Particle;
@ -142,6 +146,12 @@ public class TileEntityPADetector extends TileEntityCooledBase implements IGUIPr
} }
} }
} }
if((recipe.output1 != null && recipe.output1.getItem() == ModItems.particle_digamma) || (recipe.output2 != null && recipe.output2.getItem() == ModItems.particle_digamma)) {
List<EntityPlayer> players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5).expand(100, 50, 100));
for(EntityPlayer player : players) player.triggerAchievement(MainRegistry.achOmega12);
}
particle.crash(PAState.SUCCESS); particle.crash(PAState.SUCCESS);
return; return;
} }

View File

@ -17,6 +17,8 @@ import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet; import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import java.util.Map;
@Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")})
public class TileEntityRadioTorchBase extends TileEntityLoadedBase implements IControlReceiver, SimpleComponent, CompatHandler.OCComponent { public class TileEntityRadioTorchBase extends TileEntityLoadedBase implements IControlReceiver, SimpleComponent, CompatHandler.OCComponent {
@ -137,4 +139,18 @@ public class TileEntityRadioTorchBase extends TileEntityLoadedBase implements IC
customMap = args.checkBoolean(0); customMap = args.checkBoolean(0);
return new Object[] {}; return new Object[] {};
} }
@Callback(direct = true, limit = 4, doc = "setCustomMapValues(value: table) -- Sets the custom signal mapping values with a table with indices corresponding to the redstone value (1-16)")
@Optional.Method(modid = "OpenComputers")
public Object[] setCustomMapValues(Context context, Arguments args){
Map values = args.checkTable(0);
for (int i = 1; i <= 16; i++){
if (values.containsKey(i) && values.get(i) instanceof String){
this.mapping[i - 1] = (String) values.get(i);
}
}
return new Object[] {};
}
} }

View File

@ -49,6 +49,7 @@ public class AchievementHandler {
craftingAchievements.put(new ComparableStack(ModBlocks.machine_difurnace_off), MainRegistry.achBlastFurnace); craftingAchievements.put(new ComparableStack(ModBlocks.machine_difurnace_off), MainRegistry.achBlastFurnace);
craftingAchievements.put(new ComparableStack(ModBlocks.machine_assembly_machine), MainRegistry.achAssembly); craftingAchievements.put(new ComparableStack(ModBlocks.machine_assembly_machine), MainRegistry.achAssembly);
craftingAchievements.put(new ComparableStack(ModItems.billet_pu_mix), MainRegistry.achChicagoPile); craftingAchievements.put(new ComparableStack(ModItems.billet_pu_mix), MainRegistry.achChicagoPile);
craftingAchievements.put(new ComparableStack(ModItems.particle_digamma), MainRegistry.achOmega12);
} }
public static void fire(EntityPlayer player, ItemStack stack) { public static void fire(EntityPlayer player, ItemStack stack) {

View File

@ -6,6 +6,25 @@ local call = component.invoke
colorGradient = {0x00FF00, 0x6BEE00, 0x95DB00, 0xB0C800, 0xC5B400, 0xD79F00, 0xE68700, 0xF46900, 0xFC4700, 0xFF0000} colorGradient = {0x00FF00, 0x6BEE00, 0x95DB00, 0xB0C800, 0xC5B400, 0xD79F00, 0xE68700, 0xF46900, 0xFC4700, 0xFF0000}
coreHeatESTOP = true coreHeatESTOP = true
coolantLossESTOP = true coolantLossESTOP = true
hotCoolantESTOP = true
local const = {}
local initialized = {}
local mt = {
__newindex = function(t, k, v)
if not initialized[k] then
rawset(t, k, v)
initialized[k] = true
else
error(k .. " is a constant")
end
end
}
setmetatable(const, mt)
const.fullCoreHeatMAX = 9000000
const.coldCoolantLevelMIN = 10000
const.hotCoolantLevelMAX = 0.5
runSig = true runSig = true
@ -57,13 +76,11 @@ end
buttons = {} buttons = {}
buttons[1] = newButton(61, 6, 6, 2, 0xFFFFFF, 0xAAAAAA, function() component.proxy(pwrController).setLevel(call(pwrController, "getLevel")+1) end) local deltas = {1,5,10} -- This is very bad. Need new buttons
buttons[2] = newButton(68, 6, 6, 2, 0xFFFFFF, 0xAAAAAA, function() component.proxy(pwrController).setLevel(call(pwrController, "getLevel")+5) end) for i, d in ipairs(deltas) do
buttons[3] = newButton(75, 6, 6, 2, 0xFFFFFF, 0xAAAAAA, function() component.proxy(pwrController).setLevel(call(pwrController, "getLevel")+10) end) buttons[i] = newButton(61+(i-1)*7, 6, 6, 2, 0xFFFFFF, 0xAAAAAA, function() component.proxy(pwrController).setLevel(call(pwrController, "getLevel")+d) end)
buttons[i+3] = newButton(61+(i-1)*7, 9, 6, 2, 0xFFFFFF, 0xAAAAAA, function() component.proxy(pwrController).setLevel(call(pwrController, "getLevel")-d) end)
buttons[4] = newButton(61, 9, 6, 2, 0xFFFFFF, 0xAAAAAA, function() component.proxy(pwrController).setLevel(call(pwrController, "getLevel")-1) end) end
buttons[5] = newButton(68, 9, 6, 2, 0xFFFFFF, 0xAAAAAA, function() component.proxy(pwrController).setLevel(call(pwrController, "getLevel")-5) end)
buttons[6] = newButton(75, 9, 6, 2, 0xFFFFFF, 0xAAAAAA, function() component.proxy(pwrController).setLevel(call(pwrController, "getLevel")-10) end)
buttons[7] = newButton(82, 6, 11, 5, 0xFF0000, 0xAA0000, function() component.proxy(pwrController).setLevel(100) end) buttons[7] = newButton(82, 6, 11, 5, 0xFF0000, 0xAA0000, function() component.proxy(pwrController).setLevel(100) end)
buttons[8] = newButton(94, 6, 12, 2, 0x00FF00, 0x00AA00, function() coreHeatESTOP = not coreHeatESTOP if coreHeatESTOP == true then buttons[8].colorUp = 0x00FF00 buttons[8].colorDown = 0x00AA00 else buttons[8].colorUp = 0xFF0000 buttons[8].colorDown = 0xAA0000 end end) buttons[8] = newButton(94, 6, 12, 2, 0x00FF00, 0x00AA00, function() coreHeatESTOP = not coreHeatESTOP if coreHeatESTOP == true then buttons[8].colorUp = 0x00FF00 buttons[8].colorDown = 0x00AA00 else buttons[8].colorUp = 0xFF0000 buttons[8].colorDown = 0xAA0000 end end)
@ -165,11 +182,9 @@ gpu.fill(99,15,7,1,"█")
--HotDelta --HotDelta
gpu.set(66,19,"┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃") gpu.set(66,19,"┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃")
gpu.fill(66,22,19,1,"") for y=22,30,2 do
gpu.fill(66,24,19,1,"") gpu.fill(66,y,19,1,"")
gpu.fill(66,26,19,1,"") end
gpu.fill(66,28,19,1,"")
gpu.fill(66,30,19,1,"")
gpu.set(66,32,"┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃") gpu.set(66,32,"┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃")
gpu.setForeground(0xAAAAAA) gpu.setForeground(0xAAAAAA)
@ -213,11 +228,9 @@ while (runSig == true) do
gpu.setBackground(0xFFFFFF) gpu.setBackground(0xFFFFFF)
gpu.setForeground(0xFFFFFF) gpu.setForeground(0xFFFFFF)
gpu.fill(66,22,19,1,"") for y = 22, 30, 2 do
gpu.fill(66,24,19,1,"") gpu.fill(66,y,19,1,"")
gpu.fill(66,26,19,1,"") end
gpu.fill(66,28,19,1,"")
gpu.fill(66,30,19,1,"")
gpu.fill(92,15,6,5,"") gpu.fill(92,15,6,5,"")
gpu.fill(92,32,6,5,"") gpu.fill(92,32,6,5,"")
@ -229,7 +242,7 @@ while (runSig == true) do
prevHotCoolantFlow = hotCoolantLevel prevHotCoolantFlow = hotCoolantLevel
fullCoreHeat, fullHullHeat = call(pwrController, "getHeat") fullCoreHeat, fullHullHeat = call(pwrController, "getHeat")
coldCoolantLevel, _, hotCoolantLevel, _ = call(pwrController, "getCoolantInfo") coldCoolantLevel, _, hotCoolantLevel, maxHotCoolantLevel = call(pwrController, "getCoolantInfo")
coldCoolantOutflow = coldCoolantLevel - prevCoolantFlow coldCoolantOutflow = coldCoolantLevel - prevCoolantFlow
hotCoolantOutflow = hotCoolantLevel - prevHotCoolantFlow hotCoolantOutflow = hotCoolantLevel - prevHotCoolantFlow
@ -242,8 +255,8 @@ while (runSig == true) do
gpu.fill(92,32+(5-coldCoolantLevel//25600),6,coldCoolantLevel//25600, "") gpu.fill(92,32+(5-coldCoolantLevel//25600),6,coldCoolantLevel//25600, "")
gpu.setForeground(0x000000) gpu.setForeground(0x000000)
gpu.set(66,22,tostring(fullCoreHeat)) gpu.set(66,22,tostring(fullCoreHeat)) -- What the heck? This is too declarative!
gpu.set(66,24,tostring(fullHullHeat)) gpu.set(66,24,tostring(fullHullHeat)) -- Will fix that garbage later :P
gpu.set(66,26,tostring(call(pwrController, "getFlux"))) gpu.set(66,26,tostring(call(pwrController, "getFlux")))
gpu.set(66,28,tostring(coldCoolantLevel)) gpu.set(66,28,tostring(coldCoolantLevel))
gpu.set(66,30,tostring(hotCoolantLevel)) gpu.set(66,30,tostring(hotCoolantLevel))
@ -257,11 +270,15 @@ while (runSig == true) do
gpu.setBackground(0x000000) gpu.setBackground(0x000000)
gpu.setForeground(0xFFFFFF) gpu.setForeground(0xFFFFFF)
if (coreHeatESTOP == true) and (fullCoreHeat) > 9000000 then if (coreHeatESTOP == true) and (fullCoreHeat) > const.fullCoreHeatMAX then
component.proxy(pwrController).setLevel(100) component.proxy(pwrController).setLevel(100)
end end
if (coolantLossESTOP == true) and (coldCoolantLevel) < 10000 then if (coolantLossESTOP == true) and (coldCoolantLevel) < const.coldCoolantLevelMIN then
component.proxy(pwrController).setLevel(100)
end
if (hotCoolantESTOP == true) and (hotCoolantLevel) > const.hotCoolantLevelMAX * maxHotCoolantLevel then
component.proxy(pwrController).setLevel(100) component.proxy(pwrController).setLevel(100)
end end

View File

@ -379,6 +379,7 @@ container.leadBox=Sicherheitsbehälter
container.machineAmmoPress=Munitionspresse container.machineAmmoPress=Munitionspresse
container.machineArcWelder=Lichtbogenschweißer container.machineArcWelder=Lichtbogenschweißer
container.machineArcFurnaceLarge=Lichtbogenofen container.machineArcFurnaceLarge=Lichtbogenofen
container.machineAssemblyFactory=Montagefabrik
container.machineAssemblyMachine=Montagemaschine container.machineAssemblyMachine=Montagemaschine
container.machineBoiler=Ölwärmer container.machineBoiler=Ölwärmer
container.machineChemicalFactory=Chemiefabrik container.machineChemicalFactory=Chemiefabrik
@ -4382,7 +4383,8 @@ tile.machine_armor_table.name=Rüstungsmodifikationstisch
tile.machine_ashpit.name=Aschekasten tile.machine_ashpit.name=Aschekasten
tile.machine_ashpit.desc=Sammelt Asche von Feuerbüchsen und Heizöfen tile.machine_ashpit.desc=Sammelt Asche von Feuerbüchsen und Heizöfen
tile.machine_assembler.name=Fertigungsmaschine (Legacy) tile.machine_assembler.name=Fertigungsmaschine (Legacy)
tile.machine_assemfac.name=Fertigungsfabrik tile.machine_assemfac.name=Fertigungsfabrik (Legacy)
tile.machine_assembly_factory.name=Fertigungsfabrik
tile.machine_assembly_machine.name=Montagemaschine tile.machine_assembly_machine.name=Montagemaschine
tile.machine_autocrafter.name=Automatische Werkbank tile.machine_autocrafter.name=Automatische Werkbank
tile.machine_autosaw.name=Automatische Kreissäge tile.machine_autosaw.name=Automatische Kreissäge

View File

@ -468,7 +468,7 @@ book_lore.beacon.page.9=Once the desired peer has responded, give the "ACCEPT CO
book_lore.beacon.page.10=using the FAR-5M standard. Communication will end immediately if no standard has been negotiated, serving as a "ping". Should communication continue, the connection can be ended using another long single tone "END CONNECTION". book_lore.beacon.page.10=using the FAR-5M standard. Communication will end immediately if no standard has been negotiated, serving as a "ping". Should communication continue, the connection can be ended using another long single tone "END CONNECTION".
book_lore.beacon.page.11=Chapter 5: Warranty $ [ page intentionally left blank ] book_lore.beacon.page.11=Chapter 5: Warranty $ [ page intentionally left blank ]
cannery.f1=[ Press F1 for help ] cannery.f1=[ Press %s for a presentation ]
cannery.centrifuge=Gas Centrifuge cannery.centrifuge=Gas Centrifuge
cannery.centrifuge.0=Gas centrifuges can be supplied with fluid using regular fluid ducts. cannery.centrifuge.0=Gas centrifuges can be supplied with fluid using regular fluid ducts.
@ -785,6 +785,7 @@ container.leadBox=Containment Box
container.machineAmmoPress=Ammo Press container.machineAmmoPress=Ammo Press
container.machineArcWelder=Arc Welder container.machineArcWelder=Arc Welder
container.machineArcFurnaceLarge=Arc Furnace container.machineArcFurnaceLarge=Arc Furnace
container.machineAssemblyFactory=Assembly Factory
container.machineAssemblyMachine=Assembly Machine container.machineAssemblyMachine=Assembly Machine
container.machineBoiler=Oil Heater container.machineBoiler=Oil Heater
container.machineChemicalFactory=Chemical Factory container.machineChemicalFactory=Chemical Factory
@ -5642,7 +5643,9 @@ tile.machine_armor_table.name=Armor Modification Table
tile.machine_ashpit.name=Ashpit tile.machine_ashpit.name=Ashpit
tile.machine_ashpit.desc=Collects ashes from fireboxes and heating ovens tile.machine_ashpit.desc=Collects ashes from fireboxes and heating ovens
tile.machine_assembler.name=Assembly Machine (Legacy) tile.machine_assembler.name=Assembly Machine (Legacy)
tile.machine_assemfac.name=Assembly Factory tile.machine_assemfac.name=Assembly Factory (Legacy)
tile.machine_assembly_factory.name=Assembly Factory
tile.machine_assembly_factory.desc=Quadruple assembly machine.$Recipes process twice as fast,$but need twice as much power.$Needs to be cooled with water,$produces low-pressure steam.
tile.machine_assembly_machine.name=Assembly Machine tile.machine_assembly_machine.name=Assembly Machine
tile.machine_autocrafter.name=Automatic Crafting Table tile.machine_autocrafter.name=Automatic Crafting Table
tile.machine_autosaw.name=Automatic Buzz Saw tile.machine_autosaw.name=Automatic Buzz Saw

View File

@ -5284,7 +5284,7 @@ tile.machine_rtg_furnace_on.name=放射性同位素热力炉[RTG]
tile.machine_rtg_green.name=韦德赛富集发电机 tile.machine_rtg_green.name=韦德赛富集发电机
tile.machine_rtg_grey.name=放射性同位素发电机 tile.machine_rtg_grey.name=放射性同位素发电机
tile.machine_rtg_orange.name=强RT发电机 tile.machine_rtg_orange.name=强RT发电机
tile.machine_rtg_purple.name=反物质湮灭发发电机 tile.machine_rtg_purple.name=Antimatter Annihilation Generator
tile.machine_rtg_red.name=离子发生器 tile.machine_rtg_red.name=离子发生器
tile.machine_rtg_yellow.name=奥斯超级燃料反应堆 tile.machine_rtg_yellow.name=奥斯超级燃料反应堆
tile.machine_satlinker.name=卫星ID管理器 tile.machine_satlinker.name=卫星ID管理器
@ -5303,7 +5303,7 @@ tile.machine_solidifier.desc=配备冷却系统和其他多功能工具的通用
tile.machine_spp_bottom.name=ZPE电位发生器 [底部] tile.machine_spp_bottom.name=ZPE电位发生器 [底部]
tile.machine_spp_top.name=ZPE电位发生器 [顶部] tile.machine_spp_top.name=ZPE电位发生器 [顶部]
tile.machine_steam_engine.name=蒸汽机 tile.machine_steam_engine.name=蒸汽机
tile.machine_steam_engine.desc=效率85% tile.machine_steam_engine.desc=效率: 85%%
tile.machine_stirling.name=斯特林发电机 tile.machine_stirling.name=斯特林发电机
tile.machine_stirling.desc=它将热量转化为能量。需要外部热源$传热率T*0.1 TU/T$最大进气量300 TU/T$效率50% tile.machine_stirling.desc=它将热量转化为能量。需要外部热源$传热率T*0.1 TU/T$最大进气量300 TU/T$效率50%
tile.machine_stirling_creative.name=创造斯特林发动机 tile.machine_stirling_creative.name=创造斯特林发动机
@ -5328,7 +5328,7 @@ tile.machine_uf6_tank.name=六氟化铀储罐
tile.machine_vacuum_distill.name=真空炼油厂 tile.machine_vacuum_distill.name=真空炼油厂
tile.machine_waste_drum.name=乏燃料池 tile.machine_waste_drum.name=乏燃料池
tile.machine_wood_burner.name=火力发电机 tile.machine_wood_burner.name=火力发电机
tile.machine_wood_burner.desc=燃烧物品时100HE/t同时$收集灰烬$可以以40mb/s的速度燃烧流体效率为50%% tile.machine_wood_burner.desc=燃烧物品时100HE/t同时$收集灰烬$可以以40mB/s的速度燃烧流体效率为50%%
tile.machine_well.name=钻油塔 tile.machine_well.name=钻油塔
tile.machine_zirnox.name=锆诺克斯核反应堆 tile.machine_zirnox.name=锆诺克斯核反应堆
tile.marker_structure.name=多方块结构信标 tile.marker_structure.name=多方块结构信标
@ -5566,53 +5566,6 @@ tile.rbmk_steam_inlet.desc=当启用ReaSim锅炉时向反应堆内输入水$从
tile.rbmk_steam_outlet.name=RBMK ReaSim蒸汽出口 tile.rbmk_steam_outlet.name=RBMK ReaSim蒸汽出口
tile.rbmk_steam_outlet.desc=当启用ReaSim锅炉时从反应堆内输出超热蒸汽$从侧面连接至反应堆结构 tile.rbmk_steam_outlet.desc=当启用ReaSim锅炉时从反应堆内输出超热蒸汽$从侧面连接至反应堆结构
tile.rbmk_storage.name=RBMK燃料棒存储棒 tile.rbmk_storage.name=RBMK燃料棒存储棒
tile.rbmk.dodd.heat=温度
tile.rbmk.dodd.reasimWater=ReaSim给水量
tile.rbmk.dodd.reasimSteam=ReaSim蒸汽量
tile.rbmk.dodd.level=控制棒深度
tile.rbmk.dodd.targetLevel=目标深度
tile.rbmk.dodd.startingLevel=起始深度
tile.rbmk.dodd.mult=倍数
tile.rbmk.dodd.color=颜色
tile.rbmk.dodd.levelLower=深度下限
tile.rbmk.dodd.levelUpper=深度上限
tile.rbmk.dodd.heatLower=温度下限
tile.rbmk.dodd.heatUpper=温度上限
tile.rbmk.dodd.function=函数类型
tile.rbmk.dodd.fluxSlow=慢中子计数
tile.rbmk.dodd.fluxFast=快中子计数
tile.rbmk.dodd.hasRod=是否有燃料棒
tile.rbmk.dodd.progress=进度
tile.rbmk.dodd.cooled=冷却中
tile.rbmk.dodd.burned=燃烧中
tile.rbmk.dodd.f_heat=燃料棒温度
tile.rbmk.dodd.f_xenon=氙中毒指数
tile.rbmk.dodd.f_yield=耐久
tile.rbmk.dodd.gas=气体
tile.rbmk.dodd.feed=工质储量
tile.rbmk.dodd.steam=蒸汽储量
tile.rbmk.dodd.cryo=凝胶储量
tile.rbmk.dodd.fuel=燃料储量
tile.rbmk.dodd.feed_type=工质种类(ID)
tile.rbmk.dodd.steam_type=蒸汽种类(ID)
tile.rbmk.dodd.cryo_type=凝胶种类(ID)
tile.rbmk.dodd.gas_type=气体种类(ID)
tile.rbmk.dodd.fuel_type=燃料种类(ID)
tile.rbmk.dodd.feed_p=工质压力
tile.rbmk.dodd.steam_p=蒸汽压力
tile.rbmk.dodd.cryo_p=凝胶压力
tile.rbmk.dodd.gas_p=气体压力
tile.rbmk.dodd.fuel_p=燃料压力
tile.rbmk.dodd.feed_max=工质最大储量
tile.rbmk.dodd.steam_max=蒸汽最大储量
tile.rbmk.dodd.cryo_max=凝胶最大储量
tile.rbmk.dodd.gas_max=气体最大储量
tile.rbmk.dodd.fuel_max=燃料最大储量
tile.rbmk.dodd.feed_amt=工质储量
tile.rbmk.dodd.steam_amt=蒸汽储量
tile.rbmk.dodd.cryo_amt=凝胶储量
tile.rbmk.dodd.gas_amt=气体储量
tile.rbmk.dodd.fuel_amt=燃料储量
tile.reactor_computer.name=反应堆控制器 tile.reactor_computer.name=反应堆控制器
tile.reactor_conductor.name=反应堆锅炉 tile.reactor_conductor.name=反应堆锅炉
tile.reactor_control.name=控制棒 tile.reactor_control.name=控制棒
@ -6041,9 +5994,9 @@ item.weapon_mod_test.override_10.name=伤害覆盖10
item.weapon_mod_test.override_12_5.name=伤害覆盖12.5 item.weapon_mod_test.override_12_5.name=伤害覆盖12.5
item.weapon_mod_test.override_15.name=伤害覆盖15 item.weapon_mod_test.override_15.name=伤害覆盖15
item.weapon_mod_test.override_20.name=伤害覆盖20 item.weapon_mod_test.override_20.name=伤害覆盖20
stat.ntmBullets=Rounds Fired stat.ntmBullets=打出的弹丸数
stat.ntmLegendary=Legendary Items Created stat.ntmLegendary=制作传说物品次数
stat.ntmMines=Mines Stepped on stat.ntmMines=踩中的地雷数
tile.deco_rusty_steel.name=锈蚀的钢装饰块 tile.deco_rusty_steel.name=锈蚀的钢装饰块
tile.lightstone.unrefined.name=天然淡色石 tile.lightstone.unrefined.name=天然淡色石
tile.lightstone.tile.name=淡色石瓷砖 tile.lightstone.tile.name=淡色石瓷砖
@ -6188,3 +6141,168 @@ qmaw.tab=[按 %s 键获取帮助]
commands.locate.no_match=没有具有此名称的结构! commands.locate.no_match=没有具有此名称的结构!
commands.locate.none_found=未在附近找到结构! commands.locate.none_found=未在附近找到结构!
commands.locate.success.coordinates=在 %2$d, %3$d 处找到结构 %1$s commands.locate.success.coordinates=在 %2$d, %3$d 处找到结构 %1$s
tile.rbmk.dodd.heat=温度
tile.rbmk.dodd.reasimWater=ReaSim给水量
tile.rbmk.dodd.reasimSteam=ReaSim蒸汽量
tile.rbmk.dodd.level=控制棒深度
tile.rbmk.dodd.targetLevel=目标深度
tile.rbmk.dodd.startingLevel=起始深度
tile.rbmk.dodd.mult=倍数
tile.rbmk.dodd.color=颜色
tile.rbmk.dodd.levelLower=深度下限
tile.rbmk.dodd.levelUpper=深度上限
tile.rbmk.dodd.heatLower=温度下限
tile.rbmk.dodd.heatUpper=温度上限
tile.rbmk.dodd.function=函数类型
tile.rbmk.dodd.fluxSlow=慢中子计数
tile.rbmk.dodd.fluxFast=快中子计数
tile.rbmk.dodd.hasRod=是否有燃料棒
tile.rbmk.dodd.progress=进度
tile.rbmk.dodd.gas=气体
tile.rbmk.dodd.cooled=冷却中
tile.rbmk.dodd.burned=燃烧中
tile.rbmk.dodd.feed=工质储量
tile.rbmk.dodd.steam=蒸汽储量
tile.rbmk.dodd.cryo=凝胶储量
tile.rbmk.dodd.fuel=燃料储量
tile.rbmk.dodd.f_heat=燃料棒温度
tile.rbmk.dodd.f_xenon=氙中毒指数
tile.rbmk.dodd.f_yield=耐久
tile.rbmk.dodd.feed_type=工质种类(ID)
tile.rbmk.dodd.steam_type=蒸汽种类(ID)
tile.rbmk.dodd.cryo_type=凝胶种类(ID)
tile.rbmk.dodd.gas_type=气体种类(ID)
tile.rbmk.dodd.fuel_type=燃料种类(ID)
tile.rbmk.dodd.feed_p=工质压力
tile.rbmk.dodd.steam_p=蒸汽压力
tile.rbmk.dodd.cryo_p=凝胶压力
tile.rbmk.dodd.gas_p=气体压力
tile.rbmk.dodd.fuel_p=燃料压力
tile.rbmk.dodd.feed_max=工质最大储量
tile.rbmk.dodd.steam_max=蒸汽最大储量
tile.rbmk.dodd.cryo_max=凝胶最大储量
tile.rbmk.dodd.gas_max=气体最大储量
tile.rbmk.dodd.fuel_max=燃料最大储量
tile.rbmk.dodd.feed_amt=工质储量
tile.rbmk.dodd.steam_amt=蒸汽储量
tile.rbmk.dodd.cryo_amt=凝胶储量
tile.rbmk.dodd.gas_amt=气体储量
tile.rbmk.dodd.fuel_amt=燃料储量
error.generic=
general.na=N/A
gui.recipe.duration=耗时
gui.recipe.consumption=能量消耗
gui.recipe.input=输入
gui.recipe.output=输出
gui.recipe.atPressure=压力:
gui.recipe.setRecipe=点击选取配方
gui.weapon.ammo=弹药
gui.weapon.baseDamage=基础伤害
gui.weapon.damageWithAmmo=使用当前弹药的伤害
gui.weapon.condition=状态
gui.weapon.accepts=接受
gui.weapon.quality.aside=标准军火
gui.weapon.quality.bside=B面
gui.weapon.quality.legendary=传说武器
gui.weapon.quality.special=特殊武器
gui.weapon.quality.utility=实用工具
gui.weapon.quality.secret=秘密武器
gui.weapon.quality.debug=调试用品
item.bomb_part.used_in=用于:
item.cheese_quesadilla.desc=这就是被酵母菌感染50年的下场。
item.gun_n_i_4_n_i.name=N I 4 N I
item.hot_dusted.forged=已锻造 %s 次
item.ingot_semtex.desc=塞姆汀-H 塑胶炸药$用途多样的高性能炸药$可食用
item.lemon.desc=呃……挺好的。
item.loop_stew.desc=一顿非常、非常健康的早餐。
item.loops.desc=哥,我能吃点麦圈吗?
item.med_ipecac.desс=一种能强行让你的胃$排空所有内容物的苦味液体。
item.med_ptsd.desc=这甚至不是PTSD治疗药物$其实就是换了个罐子的吐根酊!
item.med_schizophrenia.desc=驱散所有的声音,就一小会……$……$还是别吃了。
item.meteorite_sword.desc=用陨星锻造而成$比大多数地球的造物更加锋利
item.meteorite_sword.seared.desc=剑刃经过烈火的淬炼$变得更加强大
item.meteorite_sword.reforged.desc=此剑经过重锻$以修正过往的缺陷
item.meteorite_sword.hardened.desc=极端压力加在此剑之上$以进一步硬化其刃
item.meteorite_sword.alloyed.desc=钴填充其裂缝$以强化此刃
item.meteorite_sword.machined.desc=借助先进的机械$剑刃得到进一步的强化
item.meteorite_sword.treated.desc=经过化学品的洗礼$此剑更加强大
item.meteorite_sword.etched.desc=经过酸液的清洗$此剑趋向完美
item.meteorite_sword.bred.desc=巨大的热量和辐射$将其刃压缩
item.meteorite_sword.irradiated.desc=原子的能量$赐予此剑力量
item.meteorite_sword.fused.desc=此剑已与$恒星之力相遇
item.meteorite_sword.baleful.desc=此剑已与通常材料$远无法承受的温度相会
item.missile.desc.warhead=弹头
item.missile.desc.strength=强度
item.missile.desc.fuelType=燃料种类
item.missile.desc.fuelAmount=燃料容量
item.missile.desc.chipInaccuracy=芯片误差
item.missile.desc.finInaccuracy=弹翼误差
item.missile.desc.size=尺寸
item.missile.desc.health=生命值
item.missile.desc.fuel=燃料
item.missile.desc.fuelCapacity=燃料容量
item.missile.desc.notLaunchable=不可发射!
item.missile.fuel.balefire=野火火箭燃料
item.missile.fuel.jetfuel_loxy=喷气燃料 / 液氧
item.missile.fuel.ethanol_peroxide=乙醇 / 过氧化氢
item.missile.fuel.kerosene_loxy=煤油 / 液氧
item.missile.fuel.kerosene_peroxide=煤油 / 过氧化氢
item.missile.fuel.solid=固体燃料
item.missile.fuel.solid.prefueled=固体燃料(已提前装填)
item.missile.fuel.xenon=氙气
item.missile.part.bottomSize=底端尺寸
item.missile.part.by=作者:
item.missile.part.fuelAmount=燃料容量
item.missile.part.fuelConsumption=燃料消耗
item.missile.part.fuelType=燃料种类
item.missile.part.health=生命值
item.missile.part.inaccuracy=误差
item.missile.part.maxPayload=最大载荷
item.missile.part.rarity=稀有度
item.missile.part.rarity.common=常见
item.missile.part.rarity.epic=史诗
item.missile.part.rarity.legendary=传说
item.missile.part.rarity.rare=稀有
item.missile.part.rarity.strange=奇特
item.missile.part.rarity.uncommon=少见
item.missile.part.size=尺寸
item.missile.part.size.any=任意
item.missile.part.size.none=无
item.missile.part.strength=强度
item.missile.part.topSize=顶端尺寸
item.missile.part.type=类型
item.missile.part.weight=重量
item.missile.tier.tier0=0级
item.missile.tier.tier1=1级
item.missile.tier.tier2=2级
item.missile.tier.tier3=3级
item.missile.tier.tier4=4级
item.peas.desc=他接受了你的供品。
item.pudding.desc=要是他做了呢?$要是他没做呢?$要是世界是布丁做的呢?
item.pwr_printer.name=PWR打印器
item.rag.desc=丢进水里以制作湿布。$右键单击以在上面尿尿。
item.twinkie.desc=600年前就过期了
item.warhead.desc.he=高爆弹
item.warhead.desc.incendiary=燃烧弹
item.warhead.desc.cluster=集束弹
item.warhead.desc.bunker_buster=掩体破坏弹
item.warhead.desc.nuclear=核导弹
item.warhead.desc.thermonuclear=热核导弹
item.warhead.desc.n2=N²炸弹
item.warhead.desc.balefire=野火弹
item.warhead.desc.schrabidium=Sa326弹
item.warhead.desc.taint=污染弹
item.warhead.desc.cloud=粉雾弹
item.warhead.desc.turbine=涡轮
item.weapon_mod_special.doubloons.name=两枚达布隆金币
item.weapon_mod_special.nickel.name=两枚镍币
satchip.frequency=卫星频率
satchip.foeq=给你一个成就,仅此而已。
satchip.gerald.desc=一次性使用。$需要联盟号轨道舱。$CPU毁灭者服主们的克星。
satchip.laser=允许召唤激光冷却时间15秒。
satchip.mapper=显示当前已加载的区块。
satchip.miner=将矿物粉运送至卸货平台。
satchip.lunar_miner=挖掘月壤并将其运送至卸货平台。
satchip.radar=显示标注有活动生物的地图。
satchip.resonator=允许传送,无冷却。
satchip.scanner=绘制地下矿物的俯视地图。

View File

@ -0,0 +1,13 @@
{
"name": "Oil Collection",
"icon": ["hbm:tile.ore_oil", 1, 0],
"trigger": [["hbm:tile.ore_oil"], ["hbm:item.oil_detector", 1, 0]],
"title": {
"en_US": "Oil Collection",
"zh_CN": "油藏"
},
"content": {
"en_US": "Oil can be found in two forms: Oil deposits and bedrock oil.<br><br>Oil deposits spawn like ores but shouldn't be mined, rather they require a [[derrick|Derrick]] or [[pumpjack|Pumpjack]] on the surface to dig down and extract the oil. The deposits can be found either when mining, or from the surface by using an oil deposit detector. The detector scans a small radius for oil, and also gives a notification when there's a deposit directly below. Oil deposits will last a while, but are ultimately finite.<br><br>Bedrock oil cannot be located this way, instead it is marked on the surface by patches of oily dirt or sand. Bedrock oil is infinite, however it requires a specialized [[hydraulic fracking tower|Hydraulic Fracking Tower]] to be extracted, which needs [[fracking solution|Fracking Solution]] to work.<br><br>See also:<br>[[Basic Oil Processing]]",
"zh_CN": "原油可以以两种形式被发现:油田和基岩油。<br><br>油田的生成方式类似矿物,但是不应被挖掘,而应该用[[钻油塔|Derrick]]或[[石油钻机|Pumpjack]]从地表向下钻探,并开采其中的原油。油田可通过挖矿找到,也可在地表使用石油 探测仪寻找。石油探测仪会在周围小范围内寻找原油,同时会在正下方有油田 时发送提示。油田可以持续开采一段时间,但最终还是有限的。<br><br>基岩油并不能如此定位,然而其位置会在地表以小块油泥或油砂的形式被标记 出来。基岩油的储量是无限的,但是需要特种机器[[水力压裂塔|Hydraulic Fracking Tower]]才能开采,而水力压裂塔需要[[压裂液|Fracking Solution]]才能工作。<br><br>另见:<br>[[基础炼油|Basic Oil Processing]]"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Basic Oil Processing",
"icon": ["hbm:tile.machine_refinery", 1, 0],
"trigger": [],
"title": {
"en_US": "Basic Oil Processing",
"zh_CN": "基础炼油"
},
"content": {
"en_US": "Basic oil processing (\"Oil 1\") involves separating [[crude oil|Crude Oil]] using a [[refinery|Oil Refinery]].<br><br>For this you will need:<br>[[Boiler]]<br>[[External Heat Source]]<br>[[Oil Refinery]]<br>[[Fractioning Tower]]<br><br>Connect your source of crude oil to the boiler. Set the boiler's input type to crude oil by right-clicking it with a fluid identifier. Power up the boiler using a heat source (like a [[firebox|Firebox]]) and pipe the resulting hot crude oil into the refinery.<br><br>Most resulting oils can be split once more with a fractioning tower. Once again use a fluid identifier to set the fractioning tower's input type, then connect it with the refinery.<br><br>This process will yield the following fluids:<br>[[Petroleum Gas]] (for plastics and various other uses)<br>[[Bitumen]] (for asphalt)<br>[[Heating Oil]] (mostly for burning)<br>[[Industrial Oil]] (may be processed into [[petroil|Petroil]])<br>[[Lubricant]] (for various uses)<br>[[Diesel]] (powerful early engine fuel)<br>[[Kerosene]] (powerful fuel)<br><br>These resources enable the creation of some new materials:<br>[[Polymer]] from petroleum gas<br>[[Gasoline]] out of naphtha<br>[[Desh]] using light oil<br>[[LPG]], a compressed form of petroleum gas, powerful fuel<br><br>See also:<br>[[Oil Collection]]<br>[[Advanced Oil Processing]]<br>[[Vacuum Oil Processing]]",
"zh_CN": "基础炼油(“一期石油工程”)包括使用[[炼油厂|Oil Refinery]]分离[[原油|Crude Oil]]的不同组分。<br><br>建设这个工程需要:<br>[[锅炉|Boiler]]<br>[[外部热源|External Heat Source]]<br>[[炼油厂|Oil Refinery]]<br>[[分馏塔|Fractioning Tower]]<br><br>首先将原油来源连接至锅炉,然后手持流体识别码右键点击锅炉,以将锅炉的输入 流体设定为原油;之后再使用热源(如[[燃烧室|Firebox]] 加热锅炉,并用管道将得到的热原油导至炼油厂中。<br><br>炼油厂的大多数产品可以用分馏塔再处理一次。再一次使用流体识别码标记分馏 塔的输入流体种类,接下来将其与炼油厂连接。<br><br>上述过程会产生以下流体:<br>[[石油气|Petroleum Gas]](用于制作塑料,也有一些其他用途)<br>[[沥青|Bitumen]](用于制作沥青方块)<br>[[燃油|Heating Oil]](主要用作燃料)<br>[[工业油|Industrial Oil]](可以制成[[燃料油|Petroil]]<br>[[润滑油|Lubricant]] (用途较多)<br>[[柴油|Diesel]](前期强力的内燃机燃料)<br>[[煤油|Kerosene]](高能燃料)<br><br>这些资源解锁了以下新材料的制造:<br>[[聚合物|Polymer]],使用石油气制作;<br>[[汽油|Gasoline]],使用石脑油制作;<br>[[Desh]],使用轻油制作;<br>[[液化石油气|LPG]],石油气的压缩形态,一种强力的燃料。<br><br>另见:<br>[[油藏|Oil Collection]]<br>[[高级炼油|Advanced Oil Processing]]<br>[[真空炼油|Vacuum Oil Processing]]"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Advanced Oil Processing",
"icon": ["hbm:tile.machine_catalytic_cracker", 1, 0],
"trigger": [],
"title": {
"en_US": "Advanced Oil Processing",
"zh_CN": "高级炼油"
},
"content": {
"en_US": "Advanced oil processing (\"Oil 2\") involves turning [[crude oil|Crude Oil]] into [[cracked oil|Cracked Oil]] using a [[catalytic cracking tower|Catalytic Cracking Tower]] and separating it using a [[refinery|Oil Refinery]].<br><br>For this you will need:<br>[[Boiler]]<br>[[External Heat Source]]<br>[[Condenser]]<br>[[Oil Refinery]]<br>[[Catalytic Cracking Tower]]<br>[[Fractioning Tower]]<br><br>Connect your source of crude oil to the cracking tower. Also supply the cracking tower with steam, produced by a boiler. Pipe the resulting low-pressure steam into a condenser, and loop the water back into the boiler (closed loop steam cycle). The cracking tower also creates petroleum gas, ready for use, and cracked oil. Heat the cracked oil in a boiler and pipe it into the refinery. Two of the resulting fluids can be separated further using the fractioning towers.<br><br>This process will yield the following fluids:<br>[[Heating Oil]] (for burning)<br>[[Cracked Diesel]] (a lower power form of [[diesel|Diesel]])<br>[[Kerosene]] (powerful fuel)<br>[[Petroleum Gas]] (for plastics)<br>[[Aromatic Hydrocarbons]] (for plastics and explosives)<br>[[Unsaturated Hydrocarbons]] (for plastics, burns incredibly hot)<br><br>These resources enable the creation of some new materials:<br>[[Rubber]] made from unsaturateds and [[sulfur|Sulfur]]<br>[[Bakelite]] as a cheap [[polymer|Polymer]] substitute<br>[[TNT]] from aromatics<br>[[C4]] from unsaturateds<br><br>The [[coker unit|Coker Unit]] (\"Oil 2.5\") can turn many oil products into [[petroleum coke|Coke]] with a byproduct, these byproducts can often be processed into cracked oil derivatives.<br><br>See also:<br>[[Oil Collection]]<br>[[Basic Oil Processing]]<br>[[Vacuum Oil Processing]]",
"zh_CN": "高级炼油(“二期石油工程”)包括将[[原油|Crude Oil]]在[[催化裂化塔|Catalytic Cracking Tower]]中裂化为[[裂化油|Cracked Oil]],并在[[炼油厂|Oil Refinery]]中精炼。<br><br>建设这个工程需要:<br>[[锅炉|Boiler]]<br>[[外部热源|External Heat Source]]<br>[[蒸汽冷凝器|Condenser]]<br>[[炼油厂|Oil Refinery]]<br>[[催化裂化塔|Catalytic Cracking Tower]]<br>[[分馏塔|Fractioning Tower]]<br><br>首先将原油来源连接至催化裂化塔,同时用锅炉生产蒸汽并供给至催化裂化塔; 之后将产生的低压蒸汽导至冷凝器,并将水导回锅炉(形成封闭的蒸汽循环)。 此外,催化裂化塔也会产生裂化油和可直接利用的石油气。接下来在锅炉中 加热裂化油,并将其导入炼油厂。其中两种产物可在分馏塔中进一步分离。<br><br>上述过程会产生以下流体:<br>[[燃油|Heating Oil]](用作燃料)<br>[[裂化柴油|Cracked Diesel]][[柴油|Diesel]]的低能量版本)<br>[[煤油|Kerosene]](高能燃料)<br>[[石油气|Petroleum Gas]](用于制作塑料)<br>[[芳香烃|Aromatic Hydrocarbons]](用于塑料和炸药)<br>[[不饱和烃|Unsaturated Hydrocarbons]](用于制作塑料,作燃料时热量输出非常高)<br><br>这些资源解锁了以下新材料的制造:<br>[[橡胶|Rubber]],使用不饱和烃和[[硫|Sulfur]]制作;<br>[[电木|Bakelite]],可作为[[聚合物|Polymer]] 的廉价替代品;<br>[[TNT]],使用芳香烃制作;<br>[[C-4炸药|C4]],使用不饱和烃制作。<br><br>[[焦化装置|Coker Unit]]“2.5期工程”)可以将多种石油产品转化为[[石油焦炭|Coke]]和一些副产物,这些副产物通常可处理为裂化油的产物。<br><br>另见:<br>[[油藏|Oil Collection]]<br>[[基础炼油|Basic Oil Processing]]<br>[[真空炼油|Vacuum Oil Processing]]"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Vacuum Oil Processing",
"icon": ["hbm:tile.machine_vacuum_distill", 1, 0],
"trigger": [],
"title": {
"en_US": "Vacuum Oil Processing",
"zh_CN": "真空炼油"
},
"content": {
"en_US": "Vacuum oil processing (\"Oil 3\") requires [[oil|Crude Oil]] to be [[compressed|Compressor]] and then processed in a [[vacuum refinery|Vacuum Refinery]]. Due to the refinery requiring [[bismuth|Bismuth]] to be made, vacuum refining can only be done once an [[RBMK]] has been built.<br><br>For this you will need:<br>Two [[compressors|Compressor]]<br>[[Vacuum Refinery]]<br>[[Fractioning Tower]]<br><br>Connect your source of crude oil to a compressor, then connect that compressor to a second compressor configured to \"1 PU -> 2PU\". This compressed crude oil then has to be piped into the vacuum refinery. Like before, most of the results can be fractioned again using the fractioning towers.<br><br>This process will yield the following fluids:<br>[[Heavy Heating Oil]] for burning<br>[[Reformate]] as blending stock for high-power fuels<br>[[BTX]] for making [[hard plastic|Hard Plastic]] and [[fullerite|Fullerite]]<br>[[Sour Gas]] for [[TATB]] or as a source of [[sulfur|Sulfur]]<br>[[Reformate Gas]] as a powerful fuel, for [[saturnite|Saturnite]] and late-game welding<br><br>These resources enable the creation of some new materials:<br>[[Hard Plastic]] made from BTX<br>[[TATB]] as a better form of [[TNT]] used in nuclear bombs<br>[[Saturnite]] for making weapon parts<br><br>Once [[bismuth|Bismuth]] has been obtained, different paths to making vacuum oils become available (\"Oil 3.5\"). The [[hydrotreater|Hydrotreater]] can use [[hydrogen|Hydrogen]] to turn cracked oil products into their non-cracked counterparts, or desulfurize oil which can be processed in a standard [[refinery|Oil Refinery]] to make vacuum oil products. The [[catalytic reformer|Catalytic Reformer]] can process less valuable oils into more desirable ones like reformate, reformate gas, aromatic hydrocarbons and petroleum gas.<br><br>See also:<br>[[Oil Collection]]<br>[[Basic Oil Processing]]<br>[[Advanced Oil Processing]]",
"zh_CN": "真空炼油(“三期石油工程”)需要先在[[压缩机|Compressor]]中加压[[原油|Crude Oil]],之后再在[[真空炼油厂|Vacuum Refinery]]中处理。由于真空炼油厂需要[[铋|Bismuth]]制作,真空炼油只能在建造[[RBMK]]之后进行。<br><br>建设这个工程需要:<br>两台[[压缩机|Compressor]]<br>[[真空炼油厂|Vacuum Refinery]]<br>[[分馏塔|Fractioning Tower]]<br><br>首先将原油来源连接至其中一台压缩机,之后在将这台压缩机连接至第二台 压缩机第二台压缩机需要设置为“1PU->2PU”之后需要将经过 加压的原油导入真空炼油厂。类似之前的工程,真空炼油厂的大多数产物都可 在分馏塔中再次处理。<br><br>上述过程会产生以下流体:<br>[[重质燃油|Heavy Heating Oil]],用作燃料;<br>[[重整油|Reformate]] 用作混合高能燃料需要的常备物品;<br>[[BTX]],用于制作[[硬质塑料|Hard Plastic]]和[[富勒烯|Fullerite]]<br>[[高硫天然气|Sour Gas]],用于制作[[TATB]],或作为[[硫|Sulfur]]的来源;<br>[[重整气|Reformate Gas]],用作高性能燃料,或用于制作[[土星|Saturnite]]和游戏后期的焊接工作。<br><br>这些资源解锁了以下新材料的制造:<br>[[硬质塑料|Hard Plastic]]由BTX制作<br>[[TATB]],作为[[TNT]]的上位替代,用于核弹; <br>[[土星|Saturnite]],用于制作武器部件。<br><br>一旦获得了[[铋|Bismuth]]就可以进行多种不同的真空油处理路线“3.5期工程”)。[[加氢装置|Hydrotreater]]可以用[[氢|Hydrogen]]将裂化油产品转换为其未裂化的版本,也可对原油进行脱硫,脱硫原油可以通过[[炼油厂|Oil Refinery]]精炼为真空石油的产物。[[催化转化器|Catalytic Reformer]]可以将低价值的石油产品转换为更高价值的产物,例如重整油、重整气、芳香烃 和石油气。<br><br>另见:<br>[[油藏|Oil Collection]]<br>[[基础炼油|Basic Oil Processing]]<br>[[高级炼油|Advanced Oil Processing]]"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Ore Acidizer",
"icon": ["hbm:tile.machine_crystallizer", 1, 0],
"trigger": [["hbm:tile.machine_crystallizer"]],
"title": {
"en_US": "Ore Acidizer",
"zh_CN": "矿物酸化机"
},
"content": {
"en_US": "Processing machine that can turn ores into crystals, which yield more when [[centrifuged|Centrifuge]]. Also used heavily for [[bedrock ore processing|Bedrock Ore Processing]].",
"zh_CN": "将矿物酸化为晶体的处理机器,[[离心|Centrifuge]]这些晶体可以实现矿物增产。也在[[基岩矿石处理|Bedrock Ore Processing]]中大量使用。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Anvil",
"icon": ["hbm:tile.anvil_iron", 1, 0],
"trigger": [["hbm:tile.anvil_iron"], ["hbm:tile.anvil_lead"], ["hbm:tile.anvil_steel"], ["hbm:tile.anvil_desh"], ["hbm:tile.anvil_ferrouranium"], ["hbm:tile.anvil_saturnite"], ["hbm:tile.anvil_bismuth_bronze"], ["hbm:tile.anvil_arsenic_bronze"], ["hbm:tile.anvil_schrabidate"], ["hbm:tile.anvil_dnt"], ["hbm:tile.anvil_osmiridium"], ["hbm:tile.anvil_murky"]],
"title": {
"en_US": "Anvil",
"zh_CN": "砧"
},
"content": {
"en_US": "One of the first tools used in progression. The anvil GUI has two relevant sections:<br><br>The top slots are used for smithing type recipes, like forging meteorite ingots or making [[foundry molds|Foundry Molds]].<br><br>The bottom section is for construction, once a recipe is selected, clicking the blue button will perform the recipe. The anvil will use items directly from the inventory.",
"zh_CN": "游戏流程中最早用到的工具之一。砧的GUI分为两个相关的部分<br><br>上方的槽位用于锻造类型的配方,如锻造陨石锭和制作[[铸造模具|Foundry Molds]]<br><br>下方的部分用于制造物品,如果选中了某个配方,那么点击蓝色按钮即可执行 该配方。砧会直接使用玩家物品栏中的物品。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Arc Welder",
"icon": ["hbm:tile.machine_arc_welder", 1, 0],
"trigger": [["hbm:tile.machine_arc_welder"]],
"title": {
"en_US": "Arc Welder",
"zh_CN": "电弧焊机"
},
"content": {
"en_US": "Mainly used for producing welded plates as well as assembling missiles. Power demand changes heavily based on recipe. Important for making [[dense copper or gold wires|Dense Wire]] before being able to cast them using the [[crucible|Crucible]], as one sample is required beforehand to make a foundry mold.",
"zh_CN": "主要用于制造焊接板和装配导弹,其能量需求会随配方大幅度改变。在能够通过[[坩埚|Crucible]]铸造[[致密线材|Dense Wire]]前,使用电弧焊机制造致密铜线或金线很重要,因为制造致密线材的铸造模具需要 一个致密线材作为样本。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Ashpit",
"icon": ["hbm:tile.machine_ashpit", 1, 0],
"trigger": [["hbm:tile.machine_ashpit"]],
"title": {
"en_US": "Ashpit",
"zh_CN": "储灰槽"
},
"content": {
"en_US": "An ashpit can be placed under certain machines to collect ashes. [[Fireboxes|Firebox]] and [[heating ovens|Heating Oven]] will produce types of ash depending on the fuel used. [[Smokestacks|Smokestack]] create fly ash, with industrial smokestacks in particular also producing small amounts of fine soot, the raw material used for making [[fullerite|Fullerite]].",
"zh_CN": "储灰槽可放置在特定机器下方以收集灰烬。[[燃烧室|Firebox]]和[[加热炉|Heating Oven]]会根据使用的燃料产生不同种类的灰烬;两种[[烟囱|Smokestack]]会产生飞尘;特别地,工业烟囱会同时产生少量细烟灰,而细烟灰是制作[[富勒烯|Fullerite]]的原材料。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Assembly Machine",
"icon": ["hbm:tile.machine_assembly_machine", 1, 0],
"trigger": [["hbm:tile.machine_assembly_machine"]],
"title": {
"en_US": "Assembly Machine",
"zh_CN": "装配机"
},
"content": {
"en_US": "Universal machine for building things with up to twelve item inputs. Important early on and used widely throughout progression. Built in an [[anvil|Anvil]], using plates from a [[press|Press]].",
"zh_CN": "用于装配物品的通用机器,最多能够输入十二种物品。前期的重要机器,并且在 整个游戏流程中广泛使用。在[[砧|Anvil]]中使用金属板等合成,需要的金属板可在[[锻压机|Press]]中制造。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Boiler",
"icon": ["hbm:tile.machine_boiler", 1, 0],
"trigger": [["hbm:tile.machine_boiler"], ["hbm:tile.machine_industrial_boiler"]],
"title": {
"en_US": "Boiler",
"zh_CN": "锅炉"
},
"content": {
"en_US": "Use an [[external heat source|External Heat Source]] to heat up fluids. The input type has to be set with a fluid identifier, with the output being automatically changed to the corresponding hot fluid.<br><br>Used early on for heating up water into [[steam|Steam]], to be used in a [[steam engine|Steam Engine]].<br><br>Also required for oil refining, as [[refineries|Oil Refinery]] require hot oil.<br><br>Standard copper boilers may explode when running full, while industrial boilers will simply stop. Destroyed boilers cannot be repaired.",
"zh_CN": "使用[[外部热源|External Heat Source]]来加热流体。使用时需要使用流体识别码来设定输入的流体种类,而输出流体 种类会被自动设定为相应的热流体。<br><br>前期用于将水加热为[[蒸汽|Steam]]然后用于[[蒸汽机|Steam Engine]]。<br><br>由于[[炼油厂|Oil Refinery]]需要热原油,锅炉也用于原油精炼。<br><br>输出被填满时,普通的铜锅炉会爆炸,而工业锅炉只会简单地停机。损坏的锅炉 不能被修复。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Centrifuge",
"icon": ["hbm:tile.machine_centrifuge", 1, 0],
"trigger": [["hbm:tile.machine_centrifuge"]],
"title": {
"en_US": "Centrifuge",
"zh_CN": "离心机"
},
"content": {
"en_US": "Separates items, can be used as a more efficient way of ore processing. Initially mainly used for gathering [[mercury|Mercury]] from redstone ore, required for making [[desh|Desh]].",
"zh_CN": "用于分离物品,可作为一种更高效的矿物处理手段。最初主要用于从红石矿石中 收集制作[[Desh]]需要的[[水银|Mercury]]。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Chemical Plant",
"icon": ["hbm:tile.machine_chemical_plant", 1, 0],
"trigger": [["hbm:tile.machine_chemical_plant"]],
"title": {
"en_US": "Chemical Plant",
"zh_CN": "化工厂"
},
"content": {
"en_US": "Universal chemical processor, can be made right after the [[assembly machine|Assembly Machine]]. Used in many processes, with the most important ones early on being [[desh|Desh]], [[polymer|Polymer]], [[hydrogen peroxide|Hydrogen Peroxide]] and [[sulfuric acid|Sulfuric Acid]].",
"zh_CN": "通用的化学反应器,在制作了[[装配机|Assembly Machine]]之后即可制造。用途广泛,而前期最重要的几个用途是制造[[Desh]]、[[聚合物|Polymer]]、[[过氧化氢|Hydrogen Peroxide]]以及[[硫酸|Sulfuric Acid]]。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Coker Unit",
"icon": ["hbm:tile.machine_coker", 1, 0],
"trigger": [["hbm:tile.machine_coker"]],
"title": {
"en_US": "Coker Unit",
"zh_CN": "焦化装置"
},
"content": {
"en_US": "Can turn many types of oil into [[petroleum coke|Coke]] at varying efficiencies. Usually produces an oil byproduct, which can be processed into [[cracked oil derivatives|Advanced Oil Processing]]. Requires an [[external heat source|External Heat Source]].",
"zh_CN": "可以以不同的效率将多种油转化为[[石油焦炭|Coke]]。一般会产生一种副产物油,这种油可被处理为[[裂化油产品|Advanced Oil Processing]]。需要[[外部热源|External Heat Source]]。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Combination Oven",
"icon": ["hbm:tile.furnace_combination", 1, 0],
"trigger": [["hbm:tile.furnace_combination"]],
"title": {
"en_US": "Combination Oven",
"zh_CN": "复式炼焦炉"
},
"content": {
"en_US": "A type of oven that can produce solid and liquid outputs. Requires an [[external heat source|External Heat Source]] to function.",
"zh_CN": "一种焦炉,可产出固体产物和流体产物。需要[[外部热源|External Heat Source]]才能工作。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Condenser",
"icon": ["hbm:tile.machine_condenser", 1, 0],
"trigger": [["hbm:tile.machine_condenser"], ["hbm:tile.machine_condenser_powered"], ["hbm:tile.machine_tower_small"], ["hbm:tile.machine_tower_large"]],
"title": {
"en_US": "Condenser",
"zh_CN": "蒸汽冷凝装置"
},
"content": {
"en_US": "Turns [[low-pressure steam|Low-Pressure Steam]] back into water. A small condenser can handle 100mB/t, an auxiliary cooling tower 1,000mb/t, a large cooling tower 10,000mB/t and a high-power condenser 1,000,000mB/t. The high-power condenser needs electricity to work, all other condensers work passively.<br><br>An important part of any closed steam cycle, for example for [[steam engines|Steam Engine]], [[cracking towers|Catalytic Cracking Tower]] or most nuclear reactors.",
"zh_CN": "将[[低压蒸汽|Low-Pressure Steam]]转换回水。<br>小冷凝器的冷凝速率为100mB/t辅助冷却塔的为1,000mB/t 大冷却塔的为10,000mB/t而大功率蒸汽冷凝器的为100,000mB/t。<br>大功率蒸汽冷凝器需要电力才能工作,其他冷凝器则是被动工作。<br><br>在各种封闭蒸汽循环(如[[蒸汽机|Steam Engine]]、[[催化裂化塔|Catalytic Cracking Tower]]和大多数核反应堆的蒸汽循环)中,蒸汽冷凝装置都是重要的组成部分。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Catalytic Cracking Tower",
"icon": ["hbm:tile.machine_catalytic_cracker", 1, 0],
"trigger": [["hbm:tile.machine_catalytic_cracker"]],
"title": {
"en_US": "Catalytic Cracking Tower",
"zh_CN": "催化裂化塔"
},
"content": {
"en_US": "Vital for [[advanced oil processing|Advanced Oil Processing]]. Right-click with a fluid identifier to set the input type. Requires [[steam|Steam]] to work, outputs [[low-pressure steam|Low-Pressure Steam]] in addition to its oil output. Mainly used for cracking [[crude oil|Crude Oil]] into [[cracked oil|Cracked Oil]], but can also convert many other types of petrochemicals.",
"zh_CN": "[[高级原油处理|Advanced Oil Processing]]必不可少的部分。使用流体识别码右键单击已设定输入的流体种类。工作时需要[[蒸汽|Steam]],并同时输出石化产物和[[低压蒸汽|Low-Pressure Steam]]。主要用于将[[原油|Crude Oil]]裂化为[[裂化油|Cracked Oil]],但也可以转化多种其他的石油化学品。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Derrick",
"icon": ["hbm:tile.machine_well", 1, 0],
"trigger": [["hbm:tile.machine_well"]],
"title": {
"en_US": "Oil Derrick",
"zh_CN": "钻油塔"
},
"content": {
"en_US": "The cheapest way of extracting [[oil|Crude Oil]]. When placed on top of an [[oil depsoit|Oil Collection]] and powered, it will slowly drill down and pump up oil and [[natural gas|Natural Gas]]. A less powerful version of the [[pumpjack|Pumpjack]].<br><br>A green indicator means that the derrick is currently drilling or pumping up oil. A red indicator means that the drill is jammed, the tanks are full or the derrick is out of power. A crossed out droplet means that the derrick's drill has reached the max depth, and there's no oil to gather.<br><br>See also:<br>[[Basic Oil Processing]]",
"zh_CN": "钻取[[原油|Crude Oil]]的最廉价方式,当放置在[[油田|Oil Collection]]上方并供电时,便会缓慢向下钻探并抽取原油和[[天然气|Natural Gas]]。是[[石油钻机|Pumpjack]]的弱化版。<br><br>GUI中标识为绿色时表示机器正在钻探或抽取原油为红色时表示机器卡住、 内部储罐已满或者缺少电力。标识为打叉的原油液滴时表示钻油塔的钻头已到 达最大深度,但此处没有可供钻取的原油。<br><br>另见:<br>[[基础炼油|Basic Oil Processing]]。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Diesel Generator",
"icon": ["hbm:tile.machine_diesel", 1, 0],
"trigger": [["hbm:tile.machine_diesel"]],
"title": {
"en_US": "Diesel Generator",
"zh_CN": "柴油发电机"
},
"content": {
"en_US": "A simple, early way of making power out of combustible fuels, like [[diesel|Diesel]] or [[gasoline|Gasoline]]. Can only hold 4,000mB of fuel, so explosive barrels cannot be emptied in them, as those carry 10,000mB. Can be stopped using a redstone signal.<br><br>See also:<br>[[Industrial Combustion Engine]]<br>[[Turbofan]]<br>[[Combined Cycle Gas Turbine]]",
"zh_CN": "一种简单且早期的燃烧[[柴油|Diesel]]、[[汽油|Gasoline]]等可燃流体的发电手段。只能储存4,000mB燃料所以并不能在其中放出装有 10,000mB流体的炸药桶中的燃料。收到红石信号时停止工作。<br><br>另见:<br>[[工业内燃机|Industrial Combustion Engine]]<br>[[涡扇发动机|Turbofan]]<br>[[联合循环燃气轮机|Combined Cycle Gas Turbine]]"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Electric Heater",
"icon": ["hbm:tile.heater_electric", 1, 0],
"trigger": [["hbm:tile.heater_electric"]],
"title": {
"en_US": "Electric Heater",
"zh_CN": "电加热器"
},
"content": {
"en_US": "An [[external heat source|External Heat Source]] powered by electricity. Needs to be configured with a screwdriver.<br><br>Due to the first law of thermodynamics, boiling water with an electric heater will produce less energy than is used to create it.",
"zh_CN": "一种由电力供能的[[外部热源|External Heat Source]],需要用螺丝刀配置。<br><br>由于热力学第一定律,用电加热器烧水发电产生的电力会少于烧水消耗的电力。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Firebox",
"icon": ["hbm:tile.heater_firebox", 1, 0],
"trigger": [["hbm:tile.heater_firebox"]],
"title": {
"en_US": "Firebox",
"zh_CN": "燃烧室"
},
"content": {
"en_US": "Cheapest type of [[external heat source|External Heat Source]]. Burning things like coal, [[coke|Coke]] or [[solid fuel|Solid Fuel]] increases the TU output as well as the efficiency.<br><br>Placing an [[ashpit|Ashpit]] under it will capture ashes, which can be burned again or recycled.",
"zh_CN": "最廉价的[[外部热源|External Heat Source]]。在其中燃烧煤炭、[[焦炭|Coke]]或[[固体燃料|Solid Fuel]]等物品可提高燃烧室的TU输出同时也可提高燃料效率。<br><br>在其下方放置[[储灰槽|Ashpit]]可收集灰烬,收集的灰烬可回收或者再次燃烧。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Hydraulic Fracking Tower",
"icon": ["hbm:tile.machine_fracking_tower", 1, 0],
"trigger": [["hbm:tile.machine_fracking_tower"]],
"title": {
"en_US": "Hydraulic Fracking Tower",
"zh_CN": "水力压裂塔"
},
"content": {
"en_US": "The fastest and most efficient way of collecting [[oil|Crude Oil]] from an [[oil deposit|Oil Collection]], compared to a [[derrick|Derrick]] or [[pumpjack|Pumpjack]].<br><br>Using it like this is not advised though, as the fracking tower's main advantage is being able to access bedrock oil deposits. Pumping oil out of bedrock deposits is slower, but these deposts will never deplete.<br><br>Requires [[fracking solution|Fracking Solution]] in addition to large amounts of power to work, even when using it on regular oil deposits.<br><br>Caution: May alter the landscape a little bit.<br><br>See also:<br>[[Basic Oil Processing]]<br>[[Advanced Oil Processing]]<br>[[Vacuum Oil Processing]]",
"zh_CN": "与[[钻油塔|Derrick]]和[[石油钻机|Pumpjack]]相比,使用水力压裂塔从[[油田|Oil Collection]]中钻取[[原油|Crude Oil]]是最快且效率最高的方式,然而并不建议如此使用水力压裂塔;水力压裂塔的主要 优势是能够开采基岩油田。从基岩油田中采油虽然较缓慢,但基岩油田永不 枯竭。<br><br>工作时需要[[压裂液|Fracking Solution]]以及大量能量,即使开采普通油田也是如此。<br><br>注意:可能会略微改变地貌。<br><br>另见:<br>[[基础炼油|Basic Oil Processing]]<br>[[高级炼油|Advanced Oil Processing]]<br>[[真空炼油|Vacuum Oil Processing]]"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Fractioning Tower",
"icon": ["hbm:tile.machine_fraction_tower", 1, 0],
"trigger": [["hbm:tile.machine_fraction_tower"]],
"title": {
"en_US": "Fractioning Tower",
"zh_CN": "分馏塔"
},
"content": {
"en_US": "Used in many refining processes to extend the [[refinery's|Oil Refinery]] variety of outputs. Splits one fluid into exactly two output fluids. Right-click with a fluid identifier to set the input type. Stacking multiple fractioning towers will combine them, the type has to be set on the lowest one. Input oil travels upwards and output oil travels downwards, so it is advised to always connect pipes to the bottom tower segment. Segments can be split using fraction tower spacers.<br><br>See also:<br>[[Basic Oil Processing]]<br>[[Advanced Oil Processing]]<br>[[Vacuum Oil Processing]]",
"zh_CN": "用于多个原油精炼步骤,以扩展[[炼油厂|Oil Refinery]]产物的种类。可将一种流体分离为刚好两种流体。使用流体识别码右键点击以 设置输入流体种类。多个分馏塔堆叠时会合并,此时需要在最底部的分馏塔处 设置流体种类。输入的流体会向上运动,而输出的流体会向下运动,因此建议 在分馏塔最下方一段连接管道。各段分馏塔之间可使用分馏塔分隔器分隔。<br><br>另见:<br>[[基础炼油|Basic Oil Processing]]<br>[[高级炼油|Advanced Oil Processing]]<br>[[真空炼油|Vacuum Oil Processing]]"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Heat Exchanging Heater",
"icon": ["hbm:tile.heater_heatex", 1, 0],
"trigger": [["hbm:tile.heater_heatex"]],
"title": {
"en_US": "Heat Exchanging Heater",
"zh_CN": "换热加热器"
},
"content": {
"en_US": "Powerful [[external heat source|External Heat Source]] usually used by nuclear reactory that employ a form of [[coolant|Perfluoromethyl]] instead of making [[steam|Steam]] outright. Produces usable heats by using hot fluids and cooling them down in the process.<br><br>The top field in the GUI is for the amount of fluid used per cycle, the bottom field is for the tick delay between cycles for fine-tuning.",
"zh_CN": "强力的[[外部热源|External Heat Source]],主要被使用某种形式的[[冷却剂|Perfluoromethyl]],而完全不产生[[蒸汽|Steam]]的核反应堆使用。通过接收热流体并将其冷却的过程产生可利用的热量。<br><br>GUI上方的输入框用于设定每个工作循环使用的热流体量下方的输入框用于设定 每个工作循环之间的tick数以进行精细调控。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Heating Oven",
"icon": ["hbm:tile.heater_oven", 1, 0],
"trigger": [["hbm:tile.heater_oven"]],
"title": {
"en_US": "Heating Oven",
"zh_CN": "加热炉"
},
"content": {
"en_US": "Advanced version of the [[firebox|Firebox]], an [[external heat source|External Heat Source]]. Burns 5x hotter, but uses up fuel 8x quicker, making it less efficient. Heating ovens have a copper contact at the bottom, allowing them to be stacked, however they only receive heat from below at half efficiency.<br><br>Placing an [[ashpit|Ashpit]] under it will capture ashes, which can be burned again or recycled.",
"zh_CN": "[[燃烧室|Firebox]]的高级版本,也是一种[[外部热源|External Heat Source]]。具有5倍的热量输出速率但燃料消耗速率为8倍这使得其燃料效率不如燃烧 室。加热炉底部有一个铜触点,使得其可以堆叠,但其从底部接受热量的效率只有 一半。<br><br>在其下方放置[[储灰槽|Ashpit]]可收集灰烬,收集的灰烬可回收或者再次燃烧。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "External Heat Source",
"icon": ["hbm:tile.heater_firebox", 1, 0],
"trigger": [],
"title": {
"en_US": "External Heat Source",
"zh_CN": "外部热源"
},
"content": {
"en_US": "Many machines require TU - thermal units - to function. TU is transfered via copper contacts on the undersides of machines, they cannot be connected with pipes or cables.<br><br>Machines that can provide heat are:<br>[[Firebox]]<br>[[Heating Oven]]<br>[[Fluid Burner]]<br>[[Electric Heater]]<br>[[Heat Exchanging Heater]]<br><br>Machines that use TU include, but are not limited to:<br>[[Stirling Engine]]<br>[[Combination Oven]]<br>[[Boiler]]<br>[[Steel Furnace]]<br>[[Crucible]]",
"zh_CN": "很多机器需要TU——“热量单位”才能工作。TU通过机器底部的铜触点进行传输 而不能用线缆或管道等传输。<br><br>可提供热量的机器包括但不限于:<br>[[燃烧室|Firebox]]<br>[[加热炉|Heating Oven]]<br>[[流体燃烧器|Fluid Burner]]<br>[[电加热器|Electric Heater]]<br>[[换热加热器|Heat Exchanging Heater]]<br><br>使用TU的机器包括但不限于<br>[[斯特林发电机|Stirling Engine]]<br>[[复式炼焦炉|Combination Oven]]<br>[[锅炉|Boiler]]<br>[[钢炉|Steel Furnace]]<br>[[坩埚|Crucible]]"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Industrial Combustion Engine",
"icon": ["hbm:tile.machine_combustion_engine", 1, 0],
"trigger": [["hbm:tile.machine_combustion_engine"]],
"title": {
"en_US": "Industrial Combustion Engine",
"zh_CN": "工业内燃机"
},
"content": {
"en_US": "An improved engine using combustible fuels. The efficiency of the fuel grade used depends on the installed piston set. Will not work if no piston set is installed. Flow rate can be adjusted in the GUI.<br><br>See also:<br>[[Diesel Generator]]<br>[[Turbofan]]<br>[[Combined Cycle Gas Turbine]]",
"zh_CN": "改良版的内燃机,通过燃烧可燃流体产能。各个等级燃料的燃烧效率取决于安装 的活塞种类且在未安装活塞时工业内燃机不会工作。可在GUI中调节 燃料燃烧速率。<br><br>另见:<br>[[柴油发电机|Diesel Generator]]<br>[[涡扇发动机|Turbofan]]<br>[[联合循环燃气轮机|Combined Cycle Gas Turbine]]"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Industrial Mixer",
"icon": ["hbm:tile.machine_mixer", 1, 0],
"trigger": [["hbm:tile.machine_mixer"]],
"title": {
"en_US": "Industrial Mixer",
"zh_CN": "工业搅拌机"
},
"content": {
"en_US": "Can combine two fluids and one item into a single fluid. The recipe is defined by setting the output fluid with a fluid identifier. If an output has multiple possible recipes, the recipe can be changed using the [C] button.",
"zh_CN": "可将两种流体和一种物品混合为一种新流体,可通过用流体识别码设定输出的 流体来决定该机器执行的配方。若某种流体有多种可能的配方则可通过“C”按钮 切换使用的配方。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Fluid Burner",
"icon": ["hbm:tile.heater_oilburner", 1, 0],
"trigger": [["hbm:tile.heater_oilburner"]],
"title": {
"en_US": "Fluid Burner",
"zh_CN": "流体燃烧器"
},
"content": {
"en_US": "An [[external heat source|External Heat Source]] powered by flammable fluids, usually derivatives of [[oil|Crude Oil]]. Needs to be turned on in the GUI to function. The flow rate can be increased using a screwdriver, from 1mB/t to 10mB/t.",
"zh_CN": "一种由可燃流体供能的[[外部热源|External Heat Source]],常燃烧来自[[原油|Crude Oil]]的流体。需要在GUI中开机才会工作。可使用螺丝刀调整内部流体的燃烧速率 范围从1mB/t到10mB/t."
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Press",
"icon": ["hbm:tile.machine_press", 1, 0],
"trigger": [["hbm:tile.machine_press"], ["hbm:tile.machine_epress"], ["hbm:tile.machine_conveyor_press"]],
"title": {
"en_US": "Press",
"zh_CN": "锻压机"
},
"content": {
"en_US": "One of the earliest machines, used for making things like plates and wires. A burner press requires a solid fuel like coal to run, as well as a stamp of the desired shape. Stamps are crafted as flat stamps, which are only used in a few recipes, most recipes require the stamp to be turned into a plate or wire stamp using the template folder.<br><br>Electric presses are much faster and require electricity to run instead of fuel.<br><br>Conveyor presses also run on electricity, and can press single items that pass on its conveyor belt. The conveyor press has no GUI, stamps can be removed with a screwdriver.",
"zh_CN": "最早的几台机器之一,用于制造板、线等物品。火力锻压机需要提供煤炭之类的 固体燃料,同时安装需要的形状的锻模才能工作;刚合成出的锻模是空锻模, 只用于少数配方,大多数配方需要使用板、线等形状的锻模,这些锻模可通过 机器模板文件夹转换空锻模得到。<br><br>电动锻压机速度更快,且需要电力而不是固体燃料来运作。<br><br>输送带锻压机同样需要电力运作,并且可锻压经过其输送带部分的单个物品。 输送带锻压机没有GUI其中的锻模可使用螺丝刀右击取下。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Pumpjack",
"icon": ["hbm:tile.machine_pumpjack", 1, 0],
"trigger": [["hbm:tile.machine_pumpjack"]],
"title": {
"en_US": "Pumpjack",
"zh_CN": "石油钻机"
},
"content": {
"en_US": "A faster and more efficient way of extracting [[oil|Crude Oil]]. When placed on top of an [[oil depsoit|Oil Collection]] and powered, it will slowly drill down and pump up oil and [[natural gas|Natural Gas]]. A more powerful version of the [[oil derrick|Derrick]].<br><br>A green indicator means that the derrick is currently drilling or pumping up oil. A red indicator means that the drill is jammed, the tanks are full or the derrick is out of power. A crossed out droplet means that the derrick's drill has reached the max depth, and there's no oil to gather.<br><br>See also:<br>[[Basic Oil Processing]]",
"zh_CN": "速度更快、效率更高的[[原油|Crude Oil]]钻取方式。当放置在[[油田|Oil Collection]]上方并供电时,便会缓慢向下钻探并抽取原油和[[天然气|Natural Gas]]。是[[钻油塔|Derrick]]的强化版。<br><br>GUI中标识为绿色时表示机器正在钻探或抽取原油为红色时表示机器卡住、 内部储罐已满或者缺少电力。标识为打叉的原油液滴时表示钻油塔的钻头已到 达最大深度,但此处没有可供钻取的原油。<br><br>另见:<br>[[基础炼油|Basic Oil Processing]]"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Pyrolysis Oven",
"icon": ["hbm:tile.machine_pyrooven", 1, 0],
"trigger": [["hbm:tile.machine_pyrooven"]],
"title": {
"en_US": "Pyrolysis Oven",
"zh_CN": "热解炉"
},
"content": {
"en_US": "A machine available after [[vacuum oil processing|Vacuum Oil Processing]] which plays a similar role as the [[coker unit|Coker Unit]]. Instead of [[petroleum coke|Coke]], it makes the more powerful [[solid fuel|Solid Fuel]]. Also has several recipes for [[bedrock ore processing|Bedrock Ore]] shared with the [[combination oven|Combination Oven]], for making [[syngas|Syngas]], and for making [[fine soot|Ashpit]].",
"zh_CN": "在[[真空炼油|Vacuum Oil Processing]]阶段后才可获得的机器,与[[焦化装置|Coker Unit]]用途一致。热解炉可将油类固化为能量更高的[[固体燃料|Solid Fuel]],而非[[石油焦炭|Coke]]。也有一些与[[复式炼焦炉|Combination Oven]]共享的基岩矿石处理配方,制作[[合成气|Syngas]]的配方,以及制作[[细烟灰|Ashpit]的配方。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Oil Refinery",
"icon": ["hbm:tile.machine_refinery", 1, 0],
"trigger": [["hbm:tile.machine_refinery"]],
"title": {
"en_US": "Oil Refinery",
"zh_CN": "炼油厂"
},
"content": {
"en_US": "Used for [[processing|Basic Oil Processing]] either [[crude oil|Crude Oil]] or [[cracked oil|Cracked Oil]]. Oil needs to be heated in a [[boiler|Boiler]] beforehand. Has four fluid outputs and one solid output.",
"zh_CN": "用于[[精炼|Basic Oil Processing]][[原油|Crude Oil]]或[[裂化油|Cracked Oil]],这些油在精炼前需要在[[锅炉|Boiler]]中加热。具有四个流体输出槽和一个固体输出槽。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Shredder",
"icon": ["hbm:tile.machine_shredder", 1, 0],
"trigger": [["hbm:tile.machine_shredder"]],
"title": {
"en_US": "Shredder",
"zh_CN": "粉碎机"
},
"content": {
"en_US": "Allows ores to be shredded into powder, which doubles the yield. Any item that has no recipe will be shredded anyway, and turned to scrap. Requires two shredder blades to work, blades made from [[desh|Desh]] will never break. Will process one item from every slot at the same time, so filling all slots will make it run more efficiently.",
"zh_CN": "可将矿物粉碎为粉,以得到双倍产量。任何没有粉碎配方的物品也可以被粉碎, 粉碎后产出废料。需要两个粉碎机刀片才能工作,[[Desh]]制的粉碎机刀片永不损坏。 每次能够同时处理内部所有槽位中的一个物品,因此填满所有的槽位可以使效 率最大化。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Steam Engine",
"icon": ["hbm:tile.machine_steam_engine", 1, 0],
"trigger": [["hbm:tile.machine_steam_engine"]],
"title": {
"en_US": "Steam Engine",
"zh_CN": "蒸汽机"
},
"content": {
"en_US": "The earliest way of making power out of [[steam|Steam]], usually from a [[boiler|Boiler]]. Outputs [[low-pressure steam|Low-Pressure Steam]], which either has to be vented or [[condensed|Condenser]] back into water.<br><br>Can only handle regular pressure steam, higher pressures require a [[steam turbine|Steam Turbine]].",
"zh_CN": "使用[[蒸汽|Steam]]发电的最早方式,而此时蒸汽通常来自[[锅炉|Boiler]]。会输出[[低压蒸汽|Low-Pressure Steam]],这些低压蒸汽必须被排放,或者被[[冷凝|Condenser]]回水。<br><br>蒸汽机只能处理普通蒸汽,处理高等级蒸汽需要[[汽轮机|Steam Turbine]]。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Steel Furnace",
"icon": ["hbm:tile.furnace_steel", 1, 0],
"trigger": [["hbm:tile.furnace_steel"]],
"title": {
"en_US": "Steel Furnace",
"zh_CN": "钢炉"
},
"content": {
"en_US": "A furnace powered by an [[external heat source|External Heat Source]]. Can run three recipes at the same time. Certain recipes, like smelting ores or logs, have a bonus output, indicated by the small meter below the progress bar. Not particularly fast due to the heat transfer limitation, but very versatile.",
"zh_CN": "由[[外部热源|External Heat Source]]驱动的熔炉,可一次性处理三个配方。特定的配方(如烧炼矿物和原木的配方)会有额外输出,其进度由烧炼进度条 下方的小进度条指示。由于热量传输速率限制,其速度不是特别快,但仍然用 途广泛。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Stirling Engine",
"icon": ["hbm:tile.machine_stirling", 1, 0],
"trigger": [["hbm:tile.machine_stirling"], ["hbm:tile.machine_stirling_steel"]],
"title": {
"en_US": "Stirling Engine",
"zh_CN": "斯特林发电机"
},
"content": {
"en_US": "Early machine for turning [[TU|External Heat Source]] directly into energy. Has low efficiency, and can only accept limited amounts of heat. Too much heat will cause the machine to violently disassemble. Detached parts can be collected and slotted back into the machine.<br><br>A step up from the [[wood burner|Wood-Burning Generator]], but not by much.",
"zh_CN": "前期机器,用于将[[TU|External Heat Source]]直接转化为电能。效率较低,而且只能接受有限量的热能。过多的热能会导致机 器剧烈地损毁,而脱落的部件可被捡回并重新安装到机器上。<br><br>与[[火力发电机|Wood-Burning Generator]]相比是一种进步,但进步不大。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Turbofan",
"icon": ["hbm:tile.machine_turbofan", 1, 0],
"trigger": [["hbm:tile.machine_turbofan"]],
"title": {
"en_US": "Turbofan",
"zh_CN": "涡扇发动机"
},
"content": {
"en_US": "An advanced generator using aviation-grade combustible fuel like [[kerosene|Kerosene]]. Can be stopped by supplying a redstone signal to one of its ports. Beware its intake.<br><br>See also:<br>[[Diesel Generator]]<br>[[Industrial Combustion Engine]]<br>[[Combined Cycle Gas Turbine]]",
"zh_CN": "一种高级发电机,使用[[煤油|Kerosene]]等航空级燃料发电。可通过对此机器的一个接口通入红石信号使之停机。<br>注意本机器的进气口。<br><br>另见:<br>[[柴油发电机|Diesel Generator]]<br>[[工业内燃机|Industrial Combustion Engine]]<br>[[联合循环燃气轮机|Combined Cycle Gas Turbine]]"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Wood-Burning Generator",
"icon": ["hbm:tile.machine_wood_burner", 1, 0],
"trigger": [["hbm:tile.machine_wood_burner"]],
"title": {
"en_US": "Wood-Burning Generator",
"zh_CN": "火力发电机"
},
"content": {
"en_US": "The first available way of making power. Can burn solid or liquid fuels, the operating mode may be changed by clicking the arrow button. Burns wooden logs and planks more efficiently. Cables and pipes can be connected at the back.",
"zh_CN": "第一种可用的发电方式。可燃烧固体或液体燃料其工作模式可通过点击GUI中 的箭头按钮改变。能够更高效地燃烧原木和木板。背部可连接电线和管道。"
}
}

View File

@ -9,9 +9,9 @@
"zh_CN": "电木" "zh_CN": "电木"
}, },
"content": { "content": {
"en_US": "Alternative to [[polymer|Polymer]] made from [[aromatic hydrocarbons|Aromatic Hydrocarbons]] derived from [[cracked oil products|Catalytic Cracking Tower]]. Completely interchangeable in all recipes.", "en_US": "Alternative to [[polymer|Polymer]] made from [[aromatic hydrocarbons|Aromatic Hydrocarbons]] derived from [[cracked oil products|Advanced Oil Processing]]. Completely interchangeable in all recipes.",
"uk_UA": "Карболіт (радянська назва бакеліту) — альтернатива [[полімеру|Polymer]], виготовлений з [[ароматичних вуглеводнів|Aromatic Hydrocarbons]], отриманих з [[продуктів крекінгу нафти|Catalytic Cracking Tower]]. Повністю взаємозамінний у всіх рецептах.", "uk_UA": "Карболіт (радянська назва бакеліту) — альтернатива [[полімеру|Polymer]], виготовлений з [[ароматичних вуглеводнів|Aromatic Hydrocarbons]], отриманих з [[продуктів крекінгу нафти|Advanced Oil Processing]]. Повністю взаємозамінний у всіх рецептах.",
"ru_RU": "Альтернатива [[полимеру|Polymer]], изготовленная из [[ароматических углеводородов|Aromatic Hydrocarbons]], полученных из [[продуктов крекинга нефти|Catalytic Cracking Tower]]. Полностью взаимозаменяема во всех рецептах.", "ru_RU": "Альтернатива [[полимеру|Polymer]], изготовленная из [[ароматических углеводородов|Aromatic Hydrocarbons]], полученных из [[продуктов крекинга нефти|Advanced Oil Processing]]. Полностью взаимозаменяема во всех рецептах.",
"zh_CN": "[[聚合物|Polymer]]的替代品,使用处理[[裂化油|Catalytic Cracking Tower]]得到的产品之一[[芳香烃|Aromatic Hydrocarbons]]制作。在所有配方中与聚合物完全通用。" "zh_CN": "[[聚合物|Polymer]]的替代品,使用处理[[裂化油|Advanced Oil Processing]]得到的产品之一[[芳香烃|Aromatic Hydrocarbons]]制作。在所有配方中与聚合物完全通用。"
} }
} }

View File

@ -0,0 +1,13 @@
{
"name": "Borax",
"icon": ["hbm:item.powder_borax", 1, 0],
"trigger": [["hbm:item.powder_borax"]],
"title": {
"en_US": "Borax",
"zh_CN": "硼砂"
},
"content": {
"en_US": "Found as depth deposits near bedrock, required explosives to be mined. Source of [[boron|Boron]], and an efficient way to make [[flux|Flux]].",
"zh_CN": "可在基岩附近的深层岩石团簇中发现,需要爆炸才能开采。<br>是[[硼|Boron]]的来源,也是高效的[[助熔剂|Flux]]原料。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Boron",
"icon": ["hbm:item.ingot_boron", 1, 0],
"trigger": [["hbm:item.ingot_boron"], ["hbm:item.powder_boron"], ["hbm:item.fragment_boron"]],
"title": {
"en_US": "Boron",
"zh_CN": "硼"
},
"content": {
"en_US": "Can be extracted from [[rare earth ore|Rare Earths]], or in small quantities from coal ash. Using an [[ore acidizer|Ore Acidizer]], it can also be made from [[borax|Borax]]. Blocks neutrons, and is therefore mainly used in casings or control rods for nuclear reactors.",
"zh_CN": "可从[[稀土矿石|Rare Earths]]中提取,也可从煤灰中少量获得;此外也可通过[[矿物酸化机|Ore Acidizer]]酸化[[硼砂|Borax]]获取。能够阻挡中子,因此主要用于制造核反应堆的 外壳和控制棒。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Fullerite",
"icon": ["hbm:item.ingot_cft", 1, 0],
"trigger": [["hbm:item.ingot_cft"]],
"title": {
"en_US": "Fullerite",
"zh_CN": "富勒烯"
},
"content": {
"en_US": "Expensive lategame material, derived from fine soot, captured by [[industrial smokestacks|Smokestack]] and [[ash pits|Ash Pit]], processed in various ways, and finally [[acidized|Ore Acidizer]] using [[BTX]], a derivative of [[vaccum oil|Vacuum Oil]].",
"zh_CN": "昂贵的后期材料,是细烟灰的衍生产品;要制造富勒烯,首先要通过[[工业烟囱|Smokestack]]和[[储灰槽|Ash Pit]]收集细烟灰,再经过若干步处理,最终再用[[真空炼油|Vacuum Oil]]的产品之一[[BTX]]进行[[酸化|Ore Acidizer]]即可。"
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Cobalt",
"icon": ["hbm:item.ingot_cobalt", 1, 0],
"trigger": [["hbm:item.ingot_cobalt"], ["hbm:item.nugget_cobalt"], ["hbm:item.billet_cobalt"]],
"title": {
"en_US": "Cobalt",
"zh_CN": "钴"
},
"content": {
"en_US": "Rare ore, also found in the nether near the ceiling. Drops fragments that need to be [[shredded|Shredder]]. Also obtainable from shredding lapis dust, or from [[rare earth ore|Rare Earths]].",
"zh_CN": "稀有的主世界矿物,也可在下界天花板附近找到。挖掘后掉落碎片,需要[[粉碎|Shredder]]处理。也可通过粉碎青金石粉获取,或通过[[稀土矿石|Rare Earths]]获得。"
}
}

View File

@ -9,9 +9,9 @@
"zh_CN": "焦炭" "zh_CN": "焦炭"
}, },
"content": { "content": {
"en_US": "High-purity carbon, has twice the burn value of coal. Can be pressed into [[graphite|Graphite]], used in various [[steel|Steel]] recipes or as a source of carbon for the [[crucible|Crucible]].<br><br>Coal coke can be made by smelting coal briquettes, or combination smelting coal in its various forms.<br><br>Lignite coke is made from the much cheaper and less powerful lignite in much the same way, despite this it has the same characteristics.<br><br>Petroleum coke is made either from non-coal tars in a [[combination oven|Combination Oven]], or by coking various types of oil in a [[coker|Coking Unit]].", "en_US": "High-purity carbon, has twice the burn value of coal. Can be pressed into [[graphite|Graphite]], used in various [[steel|Steel]] recipes or as a source of carbon for the [[crucible|Crucible]].<br><br>Coal coke can be made by smelting coal briquettes, or combination smelting coal in its various forms.<br><br>Lignite coke is made from the much cheaper and less powerful lignite in much the same way, despite this it has the same characteristics.<br><br>Petroleum coke is made either from non-coal tars in a [[combination oven|Combination Oven]], or by coking various types of oil in a [[coker|Coker Unit]].",
"uk_UA": "Високочистий вуглець, має вдвічі вищу горючість, ніж вугілля. Може бути зпресований у [[графіт|Graphite]], використовується у різних рецептах [[сталі|Steel]] або як джерело вуглецю для [[ливарні|Crucible]].<br><br>Вугільний кокс можна виготовляти шляхом обсмаження вугільних брикетів або коксування вугілля в різних його формах.<br><br>Буровугільний кокс виготовляється з набагато дешевшого та менш потужного бурого вугілля майже таким самим способом, незважаючи на це, він має ті ж характеристики.<br><br>Нафтовий кокс виготовляється або з невугільних смол у [[коксовій печі|Combination Oven]], або шляхом коксування різних видів нафтопродуктів у [[коксовій установці|Coking Unit]].", "uk_UA": "Високочистий вуглець, має вдвічі вищу горючість, ніж вугілля. Може бути зпресований у [[графіт|Graphite]], використовується у різних рецептах [[сталі|Steel]] або як джерело вуглецю для [[ливарні|Crucible]].<br><br>Вугільний кокс можна виготовляти шляхом обсмаження вугільних брикетів або коксування вугілля в різних його формах.<br><br>Буровугільний кокс виготовляється з набагато дешевшого та менш потужного бурого вугілля майже таким самим способом, незважаючи на це, він має ті ж характеристики.<br><br>Нафтовий кокс виготовляється або з невугільних смол у [[коксовій печі|Combination Oven]], або шляхом коксування різних видів нафтопродуктів у [[коксовій установці|Coker Unit]].",
"ru_RU": "Высокочистый углерод, имеет вдвое большую энергию сгорания, чем уголь. Может быть спрессован в [[графит|Graphite]], используется в различных рецептах [[стали|Steel]] или как источник углерода для [[плавильни|Crucible]].<br><br>Угольный кокс можно получить путём переплавки угольных брикетов или комбинированной переплавки угля в различных формах.<br><br>Бурый кокс изготавливается из более дешёвого и менее мощного бурого угля тем же способом, но обладает теми же характеристиками.<br><br>Нефтяной кокс производится либо из неугольных смол в [[коксовой печи|Combination Oven]], либо путём коксования различных видов масла в [[коксовой установке|Coking Unit]].", "ru_RU": "Высокочистый углерод, имеет вдвое большую энергию сгорания, чем уголь. Может быть спрессован в [[графит|Graphite]], используется в различных рецептах [[стали|Steel]] или как источник углерода для [[плавильни|Crucible]].<br><br>Угольный кокс можно получить путём переплавки угольных брикетов или комбинированной переплавки угля в различных формах.<br><br>Бурый кокс изготавливается из более дешёвого и менее мощного бурого угля тем же способом, но обладает теми же характеристиками.<br><br>Нефтяной кокс производится либо из неугольных смол в [[коксовой печи|Combination Oven]], либо путём коксования различных видов масла в [[коксовой установке|Coker Unit]].",
"zh_CN": "高纯度的碳,其热值为煤炭的两倍。可被锻压为[[石墨|Graphite]],也可用于多种炼[[钢|Steel]]配方或作为[[坩埚|Crucible]]中碳的来源。<br><br>煤焦炭可通过在熔炉中烧炼煤球获取,或在复式炼焦炉中炼焦各种形式的煤炭获取。<br><br>褐煤焦炭可以以更廉价且品质更低的褐煤为原料,通过相同的方式获取, 尽管其特性与煤焦炭完全相同。<br><br>石油焦炭可通过在[[复式炼焦炉|Combination Oven]]中炼焦焦油(煤焦油除外)获取,也可通过在[[焦化装置|Coking Unit]]中焦化多种油获取。" "zh_CN": "高纯度的碳,其热值为煤炭的两倍。可被锻压为[[石墨|Graphite]],也可用于多种炼[[钢|Steel]]配方或作为[[坩埚|Crucible]]中碳的来源。<br><br>煤焦炭可通过在熔炉中烧炼煤球获取,或在复式炼焦炉中炼焦各种形式的煤炭获取。<br><br>褐煤焦炭可以以更廉价且品质更低的褐煤为原料,通过相同的方式获取, 尽管其特性与煤焦炭完全相同。<br><br>石油焦炭可通过在[[复式炼焦炉|Combination Oven]]中炼焦焦油(煤焦油除外)获取,也可通过在[[焦化装置|Coker Unit]]中焦化多种油获取。"
} }
} }

View File

@ -0,0 +1,13 @@
{
"name": "Dense Wire",
"icon": ["hbm:item.wire_dense", 1, 7900],
"trigger": [["hbm:item.wire_dense", 1, 32767]],
"title": {
"en_US": "Dense Wire",
"zh_CN": "致密线材"
},
"content": {
"en_US": "Made primarily by casting material from the [[crucible|Crucible]]. The foundry mold requires dense wires to be made, therefore it is necessary to make at least one wire from either copper or gold using the [[arc welder|Arc Welder]] recipe.",
"zh_CN": "主要通过铸造来自[[坩埚|Crucible]]的材料制造。致密线材铸模需要致密线材制作,因此在此之前必须使用[[电弧焊机|Arc Welder]]制造至少一个致密铜线或金线。"
}
}

View File

@ -9,9 +9,9 @@
"zh_CN": "Desh" "zh_CN": "Desh"
}, },
"content": { "content": {
"en_US": "High-strength working alloy made in a [[chemical plant|Chemical Plant]]. Requires [[light oil|Light oil]] from basic [[oil|Crude Oil]] refining, [[mercury|Mercury]], a byproduct of [[centrifuging|Centrifuge]] redstone ore and desh blend, which is just [[shredded|Shredder]] rare earth ore chunks.<br><br>Used in a variety of things, especially tools and weapons. Desh tools are slow and only iron tier, but are the first available ones to be unbreakable and offer many tool abilities.", "en_US": "High-strength working alloy made in a [[chemical plant|Chemical Plant]]. Requires [[light oil|Light oil]] from basic [[oil|Crude Oil]] refining, [[mercury|Mercury]], a byproduct of [[centrifuging|Centrifuge]] redstone ore and desh blend, which is just [[shredded|Shredder]] [[rare earth ore chunks|Rare Earths]].<br><br>Used in a variety of things, especially tools and weapons. Desh tools are slow and only iron tier, but are the first available ones to be unbreakable and offer many tool abilities.",
"uk_UA": "Високоміцний робочий сплав, виготовлений на [[хімічному заводі|Chemical Plant]]. Потребує [[легку нафту|Light oil]] з базової переробки [[нафти|Crude Oil]], [[ртуть|Mercury]], побічний продукт [[[центрифугування|Centrifuge]] редстоунової руди та деш суміш, яка є просто [[подрібненими|Shredder]] шматками рідкоземельної руди.<br><br>Використовується в різних речах, особливо в інструментах та зброї. Деш інструменти повільні та відповідають лише залізному тіру, але є першими доступними незламними інструментами з багатьма режимами роботи.", "uk_UA": "Високоміцний робочий сплав, виготовлений на [[хімічному заводі|Chemical Plant]]. Потребує [[легку нафту|Light oil]] з базової переробки [[нафти|Crude Oil]], [[ртуть|Mercury]], побічний продукт [[[центрифугування|Centrifuge]] редстоунової руди та деш суміш, яка є просто [[подрібненими|Shredder]] шматками рідкоземельної руди.<br><br>Використовується в різних речах, особливо в інструментах та зброї. Деш інструменти повільні та відповідають лише залізному тіру, але є першими доступними незламними інструментами з багатьма режимами роботи.",
"ru_RU": "Высокопрочный рабочий сплав, изготовленный на [[химической установке|Chemical Plant]]. Требует [[лёгкую нефть|Light oil]] из базовой переработки [[нефти|Crude Oil]], [[ртуть|Mercury]], побочный продукт [[центрифугирования|Centrifuge]] красной руды, и смесь деш, которая представляет собой просто [[измельчённые|Shredder]] куски редкоземельной руды.<br><br>Используется в различных вещах, особенно в инструментах и оружии. Инструменты из деш медленные и соответствуют железному уровню, но являются первыми доступными неломающимися инструментами с множеством способностей.", "ru_RU": "Высокопрочный рабочий сплав, изготовленный на [[химической установке|Chemical Plant]]. Требует [[лёгкую нефть|Light oil]] из базовой переработки [[нефти|Crude Oil]], [[ртуть|Mercury]], побочный продукт [[центрифугирования|Centrifuge]] красной руды, и смесь деш, которая представляет собой просто [[измельчённые|Shredder]] куски редкоземельной руды.<br><br>Используется в различных вещах, особенно в инструментах и оружии. Инструменты из деш медленные и соответствуют железному уровню, но являются первыми доступными неломающимися инструментами с множеством способностей.",
"zh_CN": "在[[化工厂|Chemical Plant]]中制成的高强度工作合金,需要基础[[原油|Crude Oil]]精炼的产物[[轻油|Light Oil]]、[[离心|Centrifuge]]红石矿石得到的副产物[[水银|Mercury]]以及[[粉碎|Shredder]]稀土矿石块得到的Desh混合物制作。<br><br>用于制作多种物品特别是工具和武器。Desh制工具挖掘速度较慢且挖掘等级 只相当于铁制工具,但其是最早可获得的无法破坏的工具之一,而且具有多个工具 能力。" "zh_CN": "在[[化工厂|Chemical Plant]]中制成的高强度工作合金,需要基础[[原油|Crude Oil]]精炼的产物[[轻油|Light Oil]]、[[离心|Centrifuge]]红石矿石得到的副产物[[水银|Mercury]]以及[[粉碎|Shredder]][[稀土矿石块|Rare Earths]]得到的Desh混合物制作。<br><br>用于制作多种物品特别是工具和武器。Desh制工具挖掘速度较慢且挖掘等级 只相当于铁制工具,但其是最早可获得的无法破坏的工具之一,而且具有多个工具 能力。"
} }
} }

View File

@ -9,9 +9,9 @@
"zh_CN": "聚合物" "zh_CN": "聚合物"
}, },
"content": { "content": {
"en_US": "Polymer ('Teflon') is the first available type of plastic. Requires [[petroleum gas|Petroleum Gas]] and therefore [[oil processing|Crude Oil]].<br><br>Fully interchangable with [[Bakelite]], which becomes available after [[oil cracking|Catalytic Cracking Tower]].", "en_US": "Polymer ('Teflon') is the first available type of plastic. Requires [[petroleum gas|Petroleum Gas]] and therefore [[oil processing|Basic Oil Processing]].<br><br>Fully interchangeable with [[Bakelite]], which becomes available after [[oil cracking|Catalytic Cracking Tower]].",
"uk_UA": "Полімер ('Тефлон') це перший доступний тип пластику. потребує [[нафтовий газ|Petroleum Gas]], а отже, [[переробку нафти|Crude Oil]].<br><br>Повністю взаємозамінний з [[карболітом|Bakelite]], який стає доступним після [[крекінгу нафти|Catalytic Cracking Tower]].", "uk_UA": "Полімер ('Тефлон') це перший доступний тип пластику. потребує [[нафтовий газ|Petroleum Gas]], а отже, [[переробку нафти|Basic Oil Processing]].<br><br>Повністю взаємозамінний з [[карболітом|Bakelite]], який стає доступним після [[крекінгу нафти|Catalytic Cracking Tower]].",
"ru_RU": "Полимер ('Тефлон') — первый доступный тип пластика. Требует [[нефтяного газа|Petroleum Gas]] и, следовательно, [[переработки нефти|Crude Oil]].<br><br>Полностью взаимозаменяем с [[бакелитом|Bakelite]], который становится доступным после [[крекинга нефти|Catalytic Cracking Tower]].", "ru_RU": "Полимер ('Тефлон') — первый доступный тип пластика. Требует [[нефтяного газа|Petroleum Gas]] и, следовательно, [[переработки нефти|Basic Oil Processing]].<br><br>Полностью взаимозаменяем с [[бакелитом|Bakelite]], который становится доступным после [[крекинга нефти|Catalytic Cracking Tower]].",
"zh_CN": "聚合物(“特氟龙”)是第一种可获取的塑料。需要[[石油气|Petroleum Gas]]制作,因此需要 [[原油处理|Crude Oil]]。和[[电木|Bakelite]]完全通用,后者在获得[[催化裂化塔|Catalytic Cracking Tower]]后才可制作。" "zh_CN": "聚合物(“特氟龙”)是第一种可获取的塑料。需要[[石油气|Petroleum Gas]]制作,因此需要 [[原油处理|Basic Oil Processing]]。和[[电木|Bakelite]]完全通用,后者在获得[[催化裂化塔|Catalytic Cracking Tower]]后才可制作。"
} }
} }

View File

@ -0,0 +1,13 @@
{
"name": "Rare Earths",
"icon": ["hbm:item.chunk_ore", 1, 0],
"trigger": [["hbm:item.chunk_ore"], ["hbm:tile.ore_rare"], ["hbm:tile.ore_gneiss_rare"]],
"title": {
"en_US": "Rare Earths",
"zh_CN": "稀土"
},
"content": {
"en_US": "A type of ore, found especially common in [[schist layers|Graphitic Schist]]. Can be shredded into powder to be used for making [[desh|Desh]], or hammered into fragments using an [[anvil|Anvil]] to be shredded and then smelted.<br><br>Contains:<br>[[Boron]]<br>[[Lanthanium]]<br>[[Cobalt]]<br>[[Cerium]]<br>[[Neodymium]]<br>[[Niobium]]<br><br>Also yields [[zirconium|Zirconium]] when [[centrifuged|Centrifuge]].",
"zh_CN": "一大类矿物,主要存在于[[页岩地层|Graphitic Schist]]中。可粉碎为用于制作[[Desh]]的粉末,也可在[[砧|Anvil]]中砸成碎片后再进一步粉碎和烧炼。<br><br>含有:<br>[[硼|Boron]]<br>[[镧|Lanthanium]]<br>[[钴|Cobalt]]<br>[[铈|Cerium]]<br>[[钕|Neodymium]]<br>[[铌|Niobium]]<br><br>使用[[离心机|Centrifuge]]处理时,还可获取[[锆|Zirconium]]."
}
}

View File

@ -0,0 +1,13 @@
{
"name": "Solid Fuel",
"icon": ["hbm:item.solid_fuel", 1, 0],
"trigger": [["hbm:item.solid_fuel"]],
"title": {
"en_US": "Solid Fuel",
"zh_CN": "固体燃料"
},
"content": {
"en_US": "Oil in a solid, conveniently cuboid form. Burns twice as long as coal and way hotter. Commonly made in a [[solidifier|Solidifier]] or [[pyrolysis oven|Pyrolysis Oven]]. Used in solid rocket propellant.",
"zh_CN": "方便处理的方块状固体油。具有煤炭两倍的燃烧时间,而且温度更高。通常在[[工业固化机|Solidifier]]或[[热解炉|Pyrolysis Oven]]中制作。"
}
}

View File

@ -9,7 +9,7 @@
"zh_CN": "铀-235" "zh_CN": "铀-235"
}, },
"content": { "content": {
"en_US": "Enriched uranium. Fissile, usable in some reactors directly as high enriched fuel, or mixed back with [[uranium-238|Uranium-238]] for medium enriched uranium fuels. Weapons grade. Created initially by processing [[uranium hexafluuoride|Uranium Hexafluoride]] in a cascade of four [[gas centrifuges|Gas Centriuge]], available later on by separating [[natural uranium|Uranium]] via [[SILEX]].<br><br>Moderately radioactive.", "en_US": "Enriched uranium. Fissile, usable in some reactors directly as high enriched fuel, or mixed back with [[uranium-238|Uranium-238]] for medium enriched uranium fuels. Weapons grade. Created initially by processing [[uranium hexafluoride|Uranium Hexafluoride]] in a cascade of four [[gas centrifuges|Gas Centriuge]], available later on by separating [[natural uranium|Uranium]] via [[SILEX]].<br><br>Moderately radioactive.",
"uk_UA": "Збагачений уран. Придатний до розщеплення, використовується в деяких реакторах безпосередньо як високозбагачене паливо або змішується з [[ураном-238|Uranium-238]] для отримання середньозбагаченого уранового палива. Збройового класу. Спочатку отримується шялхом переробки [[гексафториду урану|Uranium Hexafluoride]] у каскаді з чотирьох [[газових центрифуг|Gas Centriuge]], пізніше доступний шляхом розділення [[природного урану|Uranium]] за допомогою [[камери лазерного розділення ізотопів|SILEX]].<br><br>Помірно радіоактивний.", "uk_UA": "Збагачений уран. Придатний до розщеплення, використовується в деяких реакторах безпосередньо як високозбагачене паливо або змішується з [[ураном-238|Uranium-238]] для отримання середньозбагаченого уранового палива. Збройового класу. Спочатку отримується шялхом переробки [[гексафториду урану|Uranium Hexafluoride]] у каскаді з чотирьох [[газових центрифуг|Gas Centriuge]], пізніше доступний шляхом розділення [[природного урану|Uranium]] за допомогою [[камери лазерного розділення ізотопів|SILEX]].<br><br>Помірно радіоактивний.",
"ru_RU": "Обогащённый уран. Делящийся, используется в некоторых реакторах непосредственно как высокообогащенное топливо или смешивается с [[ураном-238|Uranium-238]] для среднеобогащенного уранового топлива. Оружейное качество. Изначально создается путём переработки [[гексафторида урана|Uranium Hexafluoride]] в каскаде из четырех [[газовых центрифуг|Gas Centrifuge]], позже доступен через разделение [[натурального урана|Uranium]] с помощью [[SILEX]].<br><br>Умеренно радиоактивен.", "ru_RU": "Обогащённый уран. Делящийся, используется в некоторых реакторах непосредственно как высокообогащенное топливо или смешивается с [[ураном-238|Uranium-238]] для среднеобогащенного уранового топлива. Оружейное качество. Изначально создается путём переработки [[гексафторида урана|Uranium Hexafluoride]] в каскаде из четырех [[газовых центрифуг|Gas Centrifuge]], позже доступен через разделение [[натурального урана|Uranium]] с помощью [[SILEX]].<br><br>Умеренно радиоактивен.",
"zh_CN": "浓缩的铀,容易裂变,可直接作为高浓缩度燃料用于某些反应堆,也可与[[铀-238|Uranium-238]]混合回中浓缩度的铀燃料。 也是一种武器级的同位素。最初可通过在四台串联的[[气体离心机|Gas Centrifuge]]中处理[[六氟化铀|Uranium Hexafluoride]]获取,之后也可直接在[[SILEX]]中 分离[[天然铀|Uranium]]获取。<br><br>放射性中等。" "zh_CN": "浓缩的铀,容易裂变,可直接作为高浓缩度燃料用于某些反应堆,也可与[[铀-238|Uranium-238]]混合回中浓缩度的铀燃料。 也是一种武器级的同位素。最初可通过在四台串联的[[气体离心机|Gas Centrifuge]]中处理[[六氟化铀|Uranium Hexafluoride]]获取,之后也可直接在[[SILEX]]中 分离[[天然铀|Uranium]]获取。<br><br>放射性中等。"

File diff suppressed because it is too large Load Diff

View File

@ -72,6 +72,7 @@
"block.assemblerStrike": {"category": "block", "sounds": ["block/assemblerStrike1", "block/assemblerStrike2"]}, "block.assemblerStrike": {"category": "block", "sounds": ["block/assemblerStrike1", "block/assemblerStrike2"]},
"block.assemblerStart": {"category": "block", "sounds": [{"name": "block/assemblerStart", "stream": false}]}, "block.assemblerStart": {"category": "block", "sounds": [{"name": "block/assemblerStart", "stream": false}]},
"block.assemblerStop": {"category": "block", "sounds": [{"name": "block/assemblerStop", "stream": false}]}, "block.assemblerStop": {"category": "block", "sounds": [{"name": "block/assemblerStop", "stream": false}]},
"block.assemblerCut": {"category": "block", "sounds": [{"name": "block/assemblerCut", "stream": false}]},
"door.TransitionSealOpen": {"category": "block", "sounds": [{"name": "block/door/transition_seal_open", "stream": true}]}, "door.TransitionSealOpen": {"category": "block", "sounds": [{"name": "block/door/transition_seal_open", "stream": true}]},
"door.wghStart": {"category": "block", "sounds": [{"name": "block/door/wgh_start", "stream": true}]}, "door.wghStart": {"category": "block", "sounds": [{"name": "block/door/wgh_start", "stream": true}]},

Binary file not shown.

After

Width:  |  Height:  |  Size: 502 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 820 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 B