Merge branch 'master' into master

This commit is contained in:
George Paton 2025-08-08 14:55:30 +10:00 committed by GitHub
commit 3877a666a6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
42 changed files with 749 additions and 63 deletions

View File

@ -1,15 +1,7 @@
## Added (last time, i forgor)
* RBMK autoloader
* Can be placed on top of RBMK fuel rods
* Can be configured to switch fuel rods in 5% depletion increments
* Usable with all forms of item transport like conveyors and pneumatic tubes
## Changed
* Replaced "re-enrichment" in the PUREX recipes with "reprocessing"
* All the never completed missile parts (20/20 fuselage, 20 warhead, 10 and 15 tec kerosene thrusters) have been removed
* The electric arc furnace now scrapes the vanilla furnace recipe list on server start in addition to postinit, making sure recipes added during postinit after NTM loads (like Thermal's ingots) are covered too
## Fixed
* Fixed many of the PUREX' recipe categories simply not processing
* It worked last time I swear
* Fixed life-ending issue where the assembler achievement's icon was incorrect
* Fixed RBMK autoloader not having a recipe
* Ow
* Fixed GT6 compatibility watz pellets crashing due to misconfigured recipes
* Removed failed attempt at fixing the gun desync dupe which made things worse

View File

@ -37,6 +37,8 @@ public class HbmKeybinds {
public static KeyBinding hudKey = new KeyBinding(category + ".toggleHUD", Keyboard.KEY_V, category);
public static KeyBinding dashKey = new KeyBinding(category + ".dash", Keyboard.KEY_LSHIFT, category);
public static KeyBinding trainKey = new KeyBinding(category + ".trainInv", Keyboard.KEY_R, category);
public static KeyBinding qmaw = new KeyBinding(category + ".qmaw", Keyboard.KEY_F1, category);
public static KeyBinding abilityCycle = new KeyBinding(category + ".ability", -99, category);
public static KeyBinding abilityAlt = new KeyBinding(category + ".abilityAlt", Keyboard.KEY_LMENU, category);
@ -61,6 +63,8 @@ public class HbmKeybinds {
ClientRegistry.registerKeyBinding(hudKey);
ClientRegistry.registerKeyBinding(dashKey);
ClientRegistry.registerKeyBinding(trainKey);
ClientRegistry.registerKeyBinding(qmaw);
ClientRegistry.registerKeyBinding(reloadKey);
ClientRegistry.registerKeyBinding(gunPrimaryKey);

View File

@ -111,6 +111,10 @@ public class ArcFurnaceRecipes extends SerializableRecipe {
}
// Autogen for furnace recipes
registerFurnaceSmeltables();
}
public static void registerFurnaceSmeltables() {
for(Object o : FurnaceRecipes.smelting().getSmeltingList().entrySet()) {
Entry entry = (Entry) o;
ItemStack input = (ItemStack) entry.getKey();

View File

@ -431,7 +431,7 @@ public class PUREXRecipes extends GenericRecipes<GenericRecipe> {
ItemStack copy = nuggetNQR.copy();
copy.stackSize = 12;
this.register(new GenericRecipe("purex.watzdu").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this)
this.register(new GenericRecipe("purex.watznaqadah").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this)
.inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.NQD))
.inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250))
.outputItems(copy,
@ -440,7 +440,7 @@ public class PUREXRecipes extends GenericRecipes<GenericRecipe> {
.outputFluids(new FluidStack(Fluids.WATZ, 1_000))
.setIconToFirstIngredient());
this.register(new GenericRecipe("purex.watzdu").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this)
this.register(new GenericRecipe("purex.watznaqadria").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this)
.inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.NQR))
.inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250))
.outputItems(new ItemStack(ModItems.nugget_co60, 12),

View File

@ -1236,11 +1236,9 @@ public class ModItems {
public static Item missile_test;
public static Item mp_thruster_10_kerosene;
public static Item mp_thruster_10_kerosene_tec;
public static Item mp_thruster_10_solid;
public static Item mp_thruster_10_xenon;
public static Item mp_thruster_15_kerosene;
public static Item mp_thruster_15_kerosene_tec;
public static Item mp_thruster_15_kerosene_dual;
public static Item mp_thruster_15_kerosene_triple;
public static Item mp_thruster_15_solid;
@ -1351,8 +1349,6 @@ public class ModItems {
public static Item mp_fuselage_15_20_kerosene_magnusson;
public static Item mp_fuselage_15_20_solid;
public static Item mp_fuselage_20_kerosene;
public static Item mp_warhead_10_he;
public static Item mp_warhead_10_incendiary;
public static Item mp_warhead_10_buster;
@ -1369,7 +1365,6 @@ public class ModItems {
public static Item mp_warhead_15_n2;
public static Item mp_warhead_15_balefire;
public static Item mp_warhead_15_turbine;
public static Item mp_warhead_20_he;
public static Item mp_chip_1;
public static Item mp_chip_2;
@ -3592,11 +3587,9 @@ public class ModItems {
sat_relay = new ItemSatChip().setUnlocalizedName("sat_relay").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":sat_relay");
mp_thruster_10_kerosene = new ItemCustomMissilePart().makeThruster(FuelType.KEROSENE, 1F, 1.5F, PartSize.SIZE_10).setHealth(10F) .setUnlocalizedName("mp_thruster_10_kerosene");
mp_thruster_10_kerosene_tec = new ItemCustomMissilePart().makeThruster(FuelType.KEROSENE, 1F, 1.5F, PartSize.SIZE_10).setHealth(15F).setRarity(Rarity.COMMON).setUnlocalizedName("mp_thruster_10_kerosene_tec");
mp_thruster_10_solid = new ItemCustomMissilePart().makeThruster(FuelType.SOLID, 1F, 1.5F, PartSize.SIZE_10).setHealth(15F) .setUnlocalizedName("mp_thruster_10_solid");
mp_thruster_10_xenon = new ItemCustomMissilePart().makeThruster(FuelType.XENON, 1F, 1.5F, PartSize.SIZE_10).setHealth(5F) .setUnlocalizedName("mp_thruster_10_xenon");
mp_thruster_15_kerosene = new ItemCustomMissilePart().makeThruster(FuelType.KEROSENE, 1F, 7.5F, PartSize.SIZE_15).setHealth(15F) .setUnlocalizedName("mp_thruster_15_kerosene");
mp_thruster_15_kerosene_tec = new ItemCustomMissilePart().makeThruster(FuelType.KEROSENE, 1F, 7.5F, PartSize.SIZE_15).setHealth(20F).setRarity(Rarity.COMMON).setUnlocalizedName("mp_thruster_15_kerosene_tec");
mp_thruster_15_kerosene_dual = new ItemCustomMissilePart().makeThruster(FuelType.KEROSENE, 1F, 2.5F, PartSize.SIZE_15).setHealth(15F) .setUnlocalizedName("mp_thruster_15_kerosene_dual");
mp_thruster_15_kerosene_triple = new ItemCustomMissilePart().makeThruster(FuelType.KEROSENE, 1F, 5F, PartSize.SIZE_15).setHealth(15F) .setUnlocalizedName("mp_thruster_15_kerosene_triple");
mp_thruster_15_solid = new ItemCustomMissilePart().makeThruster(FuelType.SOLID, 1F, 5F, PartSize.SIZE_15).setHealth(20F) .setUnlocalizedName("mp_thruster_15_solid");
@ -3707,8 +3700,6 @@ public class ModItems {
mp_fuselage_15_20_kerosene_magnusson = ((ItemCustomMissilePart)mp_fuselage_15_20_kerosene).copy().setRarity(Rarity.RARE).setAuthor("VT-6/24").setTitle("White Forest Rocket").setWittyText("And get your cranio-conjugal parasite away from my nose cone!").setUnlocalizedName("mp_fuselage_15_20_kerosene_magnusson");
mp_fuselage_15_20_solid = new ItemCustomMissilePart().makeFuselage(FuelType.SOLID, 20000, PartSize.SIZE_15, PartSize.SIZE_20).setHealth(70F).setUnlocalizedName("mp_fuselage_15_20_solid").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_fuselage");
mp_fuselage_20_kerosene = new ItemCustomMissilePart().makeFuselage(FuelType.KEROSENE, 1000F, PartSize.SIZE_20, PartSize.SIZE_20) .setUnlocalizedName("mp_f_20").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_fuselage");
mp_warhead_10_he = new ItemCustomMissilePart().makeWarhead(WarheadType.HE, 15F, 1.5F, PartSize.SIZE_10).setHealth(5F) .setUnlocalizedName("mp_warhead_10_he").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_warhead");
mp_warhead_10_incendiary = new ItemCustomMissilePart().makeWarhead(WarheadType.INC, 15F, 1.5F, PartSize.SIZE_10).setHealth(5F) .setUnlocalizedName("mp_warhead_10_incendiary").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_warhead");
mp_warhead_10_buster = new ItemCustomMissilePart().makeWarhead(WarheadType.BUSTER, 5F, 1.5F, PartSize.SIZE_10).setHealth(5F) .setUnlocalizedName("mp_warhead_10_buster").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_warhead");
@ -3725,7 +3716,6 @@ public class ModItems {
mp_warhead_15_n2 = new ItemCustomMissilePart().makeWarhead(WarheadType.N2, 100F, 5F, PartSize.SIZE_15).setWittyText("[screams geometrically]").setHealth(20F).setRarity(Rarity.RARE).setUnlocalizedName("mp_warhead_15_n2").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_warhead");
mp_warhead_15_balefire = new ItemCustomMissilePart().makeWarhead(WarheadType.BALEFIRE, 100F, 7.5F, PartSize.SIZE_15).setRarity(Rarity.LEGENDARY).setAuthor("VT-6/24").setHealth(15F).setWittyText("Hightower, never forgetti.").setUnlocalizedName("mp_warhead_15_balefire").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_warhead");
mp_warhead_15_turbine = new ItemCustomMissilePart().makeWarhead(WarheadType.TURBINE, 200F, 5F, PartSize.SIZE_15).setRarity(Rarity.SEWS_CLOTHES_AND_SUCKS_HORSE_COCK).setHealth(250F).setUnlocalizedName("mp_warhead_15_turbine").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_warhead");
mp_warhead_20_he = new ItemCustomMissilePart().makeWarhead(WarheadType.HE, 15F, 1F, PartSize.SIZE_20) .setUnlocalizedName("mp_w_20").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_warhead");
mp_chip_1 = new ItemCustomMissilePart().makeChip(0.1F) .setUnlocalizedName("mp_c_1").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_c_1");
mp_chip_2 = new ItemCustomMissilePart().makeChip(0.05F) .setUnlocalizedName("mp_c_2").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_c_2");
@ -6204,11 +6194,9 @@ public class ModItems {
//Missile Parts
GameRegistry.registerItem(mp_thruster_10_kerosene, mp_thruster_10_kerosene.getUnlocalizedName());
GameRegistry.registerItem(mp_thruster_10_kerosene_tec, mp_thruster_10_kerosene_tec.getUnlocalizedName());
GameRegistry.registerItem(mp_thruster_10_solid, mp_thruster_10_solid.getUnlocalizedName());
GameRegistry.registerItem(mp_thruster_10_xenon, mp_thruster_10_xenon.getUnlocalizedName());
GameRegistry.registerItem(mp_thruster_15_kerosene, mp_thruster_15_kerosene.getUnlocalizedName());
GameRegistry.registerItem(mp_thruster_15_kerosene_tec, mp_thruster_15_kerosene_tec.getUnlocalizedName());
GameRegistry.registerItem(mp_thruster_15_kerosene_dual, mp_thruster_15_kerosene_dual.getUnlocalizedName());
GameRegistry.registerItem(mp_thruster_15_kerosene_triple, mp_thruster_15_kerosene_triple.getUnlocalizedName());
GameRegistry.registerItem(mp_thruster_15_solid, mp_thruster_15_solid.getUnlocalizedName());
@ -6306,7 +6294,6 @@ public class ModItems {
GameRegistry.registerItem(mp_fuselage_15_20_kerosene, mp_fuselage_15_20_kerosene.getUnlocalizedName());
GameRegistry.registerItem(mp_fuselage_15_20_kerosene_magnusson, mp_fuselage_15_20_kerosene_magnusson.getUnlocalizedName());
GameRegistry.registerItem(mp_fuselage_15_20_solid, mp_fuselage_15_20_solid.getUnlocalizedName());
GameRegistry.registerItem(mp_fuselage_20_kerosene, mp_fuselage_20_kerosene.getUnlocalizedName());
GameRegistry.registerItem(mp_warhead_10_he, mp_warhead_10_he.getUnlocalizedName());
GameRegistry.registerItem(mp_warhead_10_incendiary, mp_warhead_10_incendiary.getUnlocalizedName());
GameRegistry.registerItem(mp_warhead_10_buster, mp_warhead_10_buster.getUnlocalizedName());
@ -6323,7 +6310,6 @@ public class ModItems {
GameRegistry.registerItem(mp_warhead_15_n2, mp_warhead_15_n2.getUnlocalizedName());
GameRegistry.registerItem(mp_warhead_15_balefire, mp_warhead_15_balefire.getUnlocalizedName());
GameRegistry.registerItem(mp_warhead_15_turbine, mp_warhead_15_turbine.getUnlocalizedName());
GameRegistry.registerItem(mp_warhead_20_he, mp_warhead_20_he.getUnlocalizedName());
GameRegistry.registerItem(mp_chip_1, mp_chip_1.getUnlocalizedName());
GameRegistry.registerItem(mp_chip_2, mp_chip_2.getUnlocalizedName());
GameRegistry.registerItem(mp_chip_3, mp_chip_3.getUnlocalizedName());

View File

@ -450,8 +450,8 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I
Minecraft.getMinecraft().renderEngine.bindTexture(Gui.icons);
}
@Override
public boolean getShareTag() { return false; }
/*@Override
public boolean getShareTag() { return false; }*/ // nbt sync dupe fix, didn't work
public static class SmokeNode {

View File

@ -968,6 +968,7 @@ public class MainRegistry {
event.registerServerCommand(new CommandPacketInfo());
event.registerServerCommand(new CommandReloadServer());
event.registerServerCommand(new CommandLocate());
ArcFurnaceRecipes.registerFurnaceSmeltables(); // because we have to wait for other mods to take their merry ass time to register recipes
}
@EventHandler
@ -1725,6 +1726,10 @@ public class MainRegistry {
ignoreMappings.add("hbm:tile.machine_arc_furnace_off");
ignoreMappings.add("hbm:tile.machine_arc_furnace_on");
ignoreMappings.add("hbm:item.heavy_component");
ignoreMappings.add("hbm:item.mp_w_20");
ignoreMappings.add("hbm:item.mp_f_20");
ignoreMappings.add("hbm:item.mp_thruster_10_kerosene_tec");
ignoreMappings.add("hbm:item.mp_thruster_15_kerosene_tec");
/// REMAP ///
remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses);

View File

@ -40,7 +40,6 @@ import com.hbm.items.weapon.sedna.factory.XFactory12ga;
import com.hbm.lib.ModDamageSource;
import com.hbm.lib.RefStrings;
import com.hbm.packet.PacketDispatcher;
import com.hbm.packet.toclient.HeldItemNBTPacket;
import com.hbm.packet.toclient.PermaSyncPacket;
import com.hbm.packet.toclient.PlayerInformPacket;
import com.hbm.packet.toclient.SerializableRecipePacket;
@ -990,10 +989,10 @@ public class ModEventHandler {
}
}
if(!player.worldObj.isRemote && event.phase == TickEvent.Phase.END && player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemGunBaseNT && player instanceof EntityPlayerMP) {
/*if(!player.worldObj.isRemote && event.phase == TickEvent.Phase.END && player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemGunBaseNT && player instanceof EntityPlayerMP) {
HeldItemNBTPacket packet = new HeldItemNBTPacket(player.getHeldItem());
PacketDispatcher.wrapper.sendTo(packet, (EntityPlayerMP) player);
}
}*/
}
@SubscribeEvent

View File

@ -14,6 +14,7 @@ import com.hbm.extprop.HbmPlayerProps;
import com.hbm.handler.ArmorModHandler;
import com.hbm.handler.HTTPHandler;
import com.hbm.handler.HazmatRegistry;
import com.hbm.handler.HbmKeybinds;
import com.hbm.handler.ImpactWorldHandler;
import com.hbm.hazard.HazardSystem;
import com.hbm.interfaces.IHoldableWeapon;
@ -36,6 +37,9 @@ import com.hbm.lib.Library;
import com.hbm.lib.RefStrings;
import com.hbm.packet.PacketDispatcher;
import com.hbm.packet.toserver.AuxButtonPacket;
import com.hbm.qmaw.GuiQMAW;
import com.hbm.qmaw.QMAWLoader;
import com.hbm.qmaw.QuickManualAndWiki;
import com.hbm.render.anim.HbmAnimations;
import com.hbm.render.anim.HbmAnimations.Animation;
import com.hbm.render.block.ct.CTStitchReceiver;
@ -747,6 +751,17 @@ public class ModEventHandlerClient {
list.add(EnumChatFormatting.RED + "Error loading cannery: " + ex.getLocalizedMessage());
}
try {
QuickManualAndWiki qmaw = QMAWLoader.triggers.get(comp);
if(qmaw != null) {
list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("qmaw.tab", Keyboard.getKeyName(HbmKeybinds.qmaw.getKeyCode())));
lastQMAW = qmaw;
qmawTimestamp = Clock.get_ms();
}
} catch(Exception ex) {
list.add(EnumChatFormatting.RED + "Error loading cannery: " + ex.getLocalizedMessage());
}
/*ItemStack copy = stack.copy();
List<MaterialStack> materials = Mats.getMaterialsFromItem(copy);
@ -759,6 +774,8 @@ public class ModEventHandlerClient {
private static long canneryTimestamp;
private static ComparableStack lastCannery = null;
private static long qmawTimestamp;
private static QuickManualAndWiki lastQMAW = null;
private ResourceLocation ashes = new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_ash.png");
@ -891,6 +908,16 @@ public class ModEventHandlerClient {
}
}
if(Keyboard.isKeyDown(HbmKeybinds.qmaw.getKeyCode()) && Minecraft.getMinecraft().currentScreen != null) {
QuickManualAndWiki qmaw = qmawTimestamp > Clock.get_ms() - 100 ? lastQMAW : null;
if(qmaw != null) {
Minecraft.getMinecraft().thePlayer.closeScreen();
FMLCommonHandler.instance().showGuiScreen(new GuiQMAW(qmaw));
}
}
if(Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) && Keyboard.isKeyDown(Keyboard.KEY_LMENU)) {
ItemStack stack = getMouseOverStack();

View File

@ -1193,11 +1193,9 @@ public class ResourceManager {
public static final IModelCustom launch_table_small_scaffold_empty = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/launch_table/launch_table_small_scaffold_empty.obj"));
public static final IModelCustom mp_t_10_kerosene = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_10_kerosene.obj"));
public static final IModelCustom mp_t_10_kerosene_tec = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_10_kerosene_tec.obj"));
public static final IModelCustom mp_t_10_solid = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_10_solid.obj"));
public static final IModelCustom mp_t_10_xenon = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_10_xenon.obj"));
public static final IModelCustom mp_t_15_kerosene = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_15_kerosene.obj"));
public static final IModelCustom mp_t_15_kerosene_tec = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_15_kerosene_tec.obj"));
public static final IModelCustom mp_t_15_kerosene_dual = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_15_kerosene_dual.obj"));
public static final IModelCustom mp_t_15_kerosene_triple = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_15_kerosene_triple.obj"));
public static final IModelCustom mp_t_15_solid = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_15_solid.obj"));
@ -1225,7 +1223,6 @@ public class ResourceManager {
public static final IModelCustom mp_f_15_kerosene = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_f_15_kerosene.obj"));
public static final IModelCustom mp_f_15_hydrogen = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_f_15_hydrogen.obj"));
public static final IModelCustom mp_f_15_20_kerosene = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_f_15_20_kerosene.obj"));
public static final IModelCustom mp_f_20 = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_f_20.obj"));
public static final IModelCustom mp_w_10_he = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_10_he.obj"));
public static final IModelCustom mp_w_10_incendiary = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_10_incendiary.obj"));
@ -1240,7 +1237,6 @@ public class ResourceManager {
public static final IModelCustom mp_w_15_n2 = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_15_n2.obj"));
public static final IModelCustom mp_w_15_balefire = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_15_balefire.obj"));
public static final IModelCustom mp_w_15_turbine = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_15_turbine.obj"));
public static final IModelCustom mp_w_20 = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_20.obj"));
//Carts
public static final IModelCustom cart = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/vehicles/cart.obj"));

View File

@ -1,5 +1,292 @@
package com.hbm.qmaw;
public class GuiQMAW {
import java.util.ArrayList;
import java.util.List;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.GL11;
import com.hbm.lib.RefStrings;
import com.hbm.qmaw.components.*;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.resources.LanguageManager;
import net.minecraft.item.ItemStack;
import net.minecraft.util.MathHelper;
import net.minecraft.util.ResourceLocation;
public class GuiQMAW extends GuiScreen {
protected static final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_wiki.png");
public String title;
public ItemStack icon;
public List<List<ManualElement>> lines = new ArrayList();
protected int xSize = 340;
protected int ySize = 224;
protected int guiLeft;
protected int guiTop;
protected boolean isDragging = false;
protected int scrollProgress = 0;
protected int lastClickX = 0;
protected int lastClickY = 0;
public static final String EN_US = "en_US";
public GuiQMAW(QuickManualAndWiki qmaw) {
parseQMAW(qmaw);
}
protected void parseQMAW(QuickManualAndWiki qmaw) {
LanguageManager lang = Minecraft.getMinecraft().getLanguageManager();
this.title = qmaw.title.get(lang.getCurrentLanguage());
if(title == null) this.title = qmaw.title.get(EN_US);
if(title == null) this.title = "Missing Localization!";
this.icon = qmaw.icon;
String toParse = qmaw.contents.get(lang.getCurrentLanguage());
if(toParse == null) toParse = qmaw.contents.get(EN_US);
if(toParse == null) toParse = "Missing Localization!";
toParse = "" + toParse; // strings are reference types, no?
int maxLineLength = xSize - 29;
String prevToParse = "" + toParse;
int maxIterations = 1000;
int currentLineWidth = 0;
while(!toParse.isEmpty() && maxIterations > 0) {
if(this.lines.isEmpty()) this.lines.add(new ArrayList());
List<ManualElement> currentLine = this.lines.get(this.lines.size() - 1);
toParse = toParse.trim();
maxIterations--;
if(toParse.startsWith("<br>")) {
toParse = toParse.substring(4);
currentLine = new ArrayList();
this.lines.add(currentLine);
currentLineWidth = 0;
continue;
}
// handle links
if(toParse.startsWith("[[")) {
int end = toParse.indexOf("]]");
if(end != -1) {
String link = toParse.substring(2, end);
toParse = toParse.substring(end + 2);
int pipe = link.indexOf("|");
QComponentLink linkComponent;
String suffix = toParse.startsWith(" ") ? " " : "";
if(pipe == -1) {
linkComponent = new QComponentLink(link, link + suffix);
} else {
linkComponent = new QComponentLink(link.substring(pipe + 1, link.length()), link.substring(0, pipe) + suffix);
}
// append to current line
int width = linkComponent.getWidth();
if(width + currentLineWidth <= maxLineLength) {
currentLine.add(linkComponent);
currentLineWidth += width;
// new line
} else {
currentLine = new ArrayList();
this.lines.add(currentLine);
currentLine.add(linkComponent);
currentLineWidth = width;
}
prevToParse = "" + toParse;
continue;
}
}
// handle standard text
int delimit = toParse.length();
int spaceIndex = toParse.indexOf(" ");
if(spaceIndex != -1) delimit = Math.min(delimit, spaceIndex);
int linkIndex = toParse.indexOf("[[");
if(linkIndex != -1) delimit = Math.min(delimit, linkIndex);
int brIndex = toParse.indexOf("<br>");
if(brIndex != -1) delimit = Math.min(delimit, brIndex);
if(delimit > 0) {
QComponentText textComponent = new QComponentText(toParse.substring(0, delimit) + (spaceIndex == delimit ? " " : ""));
toParse = toParse.substring(delimit);
// append to current line
int width = textComponent.getWidth();
if(width + currentLineWidth <= maxLineLength) {
currentLine.add(textComponent);
currentLineWidth += width;
// new line
} else {
currentLine = new ArrayList();
this.lines.add(currentLine);
currentLine.add(textComponent);
currentLineWidth = width;
}
prevToParse = "" + toParse;
continue;
}
if(toParse.equals(prevToParse)) break;
prevToParse = "" + toParse;
}
}
@Override
public void initGui() {
super.initGui();
this.guiLeft = (this.width - this.xSize) / 2;
this.guiTop = (this.height - this.ySize) / 2;
}
@Override
protected void mouseClicked(int x, int y, int key) {
super.mouseClicked(x, y, key);
if(key == 0) {
this.lastClickX = x;
this.lastClickY = y;
}
}
public int getSliderPosition() {
double progress = (double) scrollProgress / (double) (lines.size() - 1);
return 25 + (int) (progress * 180);
}
@Override
public void drawScreen(int mouseX, int mouseY, float f) {
if(Mouse.isButtonDown(0) && guiLeft + xSize - 15 <= mouseX && guiLeft + xSize - 15 + 12 > mouseX && guiTop + 25 < mouseY && guiTop + 25 + 191 >= mouseY) {
isDragging = true;
}
if(!Mouse.isButtonDown(0)) isDragging = false;
if(isDragging) {
int min = guiTop + 25 + 8;
int max = guiTop + 25 + 191 - 8;
int span = max - min;
double progress = MathHelper.clamp_double((double) (mouseY - min) / span, 0D, 1D);
this.scrollProgress = MathHelper.clamp_int((int) Math.round((lines.size() - 1) * progress), 0, lines.size() - 1);
}
handleScroll();
//this.drawRect(0, 0, this.width, this.height, 0x80919191);
this.drawRect(0, 0, this.width, this.height, 0xe0000000);
this.drawGuiContainerBackgroundLayer(f, mouseX, mouseY);
GL11.glDisable(GL11.GL_LIGHTING);
this.drawGuiContainerForegroundLayer(mouseX, mouseY);
GL11.glEnable(GL11.GL_LIGHTING);
this.lastClickX = 0;
this.lastClickY = 0;
}
protected void handleScroll() {
if(!Mouse.isButtonDown(0) && !Mouse.isButtonDown(1) && Mouse.next()) {
int scroll = Mouse.getEventDWheel();
if(scroll > 0 && this.scrollProgress > 0) this.scrollProgress--;
if(scroll < 0 && this.scrollProgress < this.lines.size() - 1) this.scrollProgress++;
}
}
private void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
int x = 7;
int y = 4;
if(this.icon != null) {
GL11.glPushMatrix();
GL11.glEnable(GL11.GL_DEPTH_TEST);
Minecraft mc = Minecraft.getMinecraft();
GL11.glRotated(180, 1, 0, 0);
RenderHelper.enableStandardItemLighting();
GL11.glRotated(-180, 1, 0, 0);
itemRender.renderItemAndEffectIntoGUI(this.fontRendererObj, mc.renderEngine, this.icon, guiLeft + x, guiTop + y);
itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, mc.renderEngine, this.icon, guiLeft + x, guiTop + y, null);
RenderHelper.disableStandardItemLighting();
GL11.glDisable(GL11.GL_DEPTH_TEST);
GL11.glPopMatrix();
x += 18;
y += (16 - this.fontRendererObj.FONT_HEIGHT) / 2;
}
y += 1;
this.fontRendererObj.drawString(title, guiLeft + x, guiTop + y, 0xFFFFFF);
}
private void drawGuiContainerBackgroundLayer(float f, int mouseX, int mouseY) {
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
Minecraft.getMinecraft().getTextureManager().bindTexture(texture);
drawTexturedModalRect(guiLeft, guiTop, 0, 0, 170, ySize);
drawTexturedModalRect(guiLeft + 170, guiTop, 22, 0, 170, ySize);
// scroll bar
drawTexturedModalRect(guiLeft + xSize - 15, guiTop + getSliderPosition(), 192, 0, 12, 16);
int x = guiLeft + 7;
int y = guiTop + 30;
int lineNum = 0;
for(List<ManualElement> line : lines) {
lineNum++;
if(lineNum <= this.scrollProgress) continue;
int maxHeight = 0;
int inset = 0;
for(ManualElement element : line) {
maxHeight = Math.max(maxHeight, element.getHeight());
}
if(y + maxHeight > guiTop + 219) break;
if(line.isEmpty()) y += this.fontRendererObj.FONT_HEIGHT;
for(ManualElement element : line) {
int elementX = x + inset;
int elementY = y + (maxHeight - element.getHeight()) / 2;
boolean mouseOver = (elementX <= mouseX && elementX + element.getWidth() > mouseX && elementY < mouseY && elementY + element.getHeight() >= mouseY);
element.render(mouseOver, elementX, elementY, mouseX, mouseY);
if(elementX <= lastClickX && elementX + element.getWidth() > lastClickX && elementY < lastClickY && elementY + element.getHeight() >= lastClickY)
element.onClick();
inset += element.getWidth();
}
y += maxHeight + 2;
}
}
@Override
protected void keyTyped(char typedChar, int keyCode) {
if(keyCode == 1 || keyCode == this.mc.gameSettings.keyBindInventory.getKeyCode()) {
this.mc.displayGuiScreen((GuiScreen) null);
this.mc.setIngameFocus();
}
}
}

View File

@ -1,12 +1,9 @@
package com.hbm.qmaw;
public abstract class ManualElement {
public int x;
public int y;
public abstract int getWidth();
public abstract int getHeight();
public abstract void render(boolean isMouseOver, int mouseX, int mouseY);
public abstract void render(boolean isMouseOver, int x, int y, int mouseX, int mouseY);
public abstract void onClick();
}

View File

@ -7,13 +7,19 @@ import java.io.InputStreamReader;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map.Entry;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.hbm.interfaces.NotableComments;
import com.hbm.inventory.RecipesCommon.ComparableStack;
import com.hbm.inventory.recipes.loader.SerializableRecipe;
import com.hbm.items.ModItems;
import com.hbm.main.MainRegistry;
import net.minecraft.client.Minecraft;
@ -23,6 +29,7 @@ import net.minecraft.client.resources.IResourceManager;
import net.minecraft.client.resources.IResourceManagerReloadListener;
import net.minecraft.client.resources.IResourcePack;
import net.minecraft.client.resources.ResourcePackRepository;
import net.minecraft.item.ItemStack;
@NotableComments
public class QMAWLoader implements IResourceManagerReloadListener {
@ -31,6 +38,7 @@ public class QMAWLoader implements IResourceManagerReloadListener {
public static final Gson gson = new Gson();
public static final JsonParser parser = new JsonParser();
public static HashMap<String, QuickManualAndWiki> qmaw = new HashMap();
public static HashMap<ComparableStack, QuickManualAndWiki> triggers = new HashMap();
@Override
public void onResourceManagerReload(IResourceManager resMan) {
@ -50,18 +58,27 @@ public class QMAWLoader implements IResourceManagerReloadListener {
//the mod's file, assuming the mod is a file (not the case in a dev env, fuck!)
//no fucking null check, if this fails then the entire game will sink along with the ship
registerModFileURL(new File(QMAWLoader.class.getProtectionDomain().getCodeSource().getLocation().getPath())); // i am going to shit myself
String path = QMAWLoader.class.getProtectionDomain().getCodeSource().getLocation().getPath();
// exclude .class in the case of a dev env
if(!path.endsWith(".class")) registerModFileURL(new File(path)); // i am going to shit myself
qmaw.clear();
triggers.clear();
agonyEngine();
}
/** "digital equivalent to holywater" yielded few results on google, if only i had the answer i would drown this entire class in it */
/** "digital equivalent to holywater" yielded few results on google, if only i had the answer i would drown this entire class in it <br><br>
* This affront to god can load QMAW definition files from four different sources:<br>
* * Any mod's jar that has registered itself to include QMAW files<br>
* * The dev environment, because "the mod file" would in this case be this very class file, and that's incorrect<br>
* * ZIP-based resource packs<br>
* * Folder-based resource packs
* */
public static void agonyEngine() {
for(File modFile : registeredModFiles) dissectZip(modFile);
File devEnvManualFolder = new File(Minecraft.getMinecraft().mcDataDir.getAbsolutePath().replace("/eclipse/.", "") + "/src/main/resources/assets/hbm/manual");
File devEnvManualFolder = new File(Minecraft.getMinecraft().mcDataDir.getAbsolutePath().replace("/eclipse/.".replace('/', File.separatorChar), "") + "/src/main/resources/assets/hbm/manual".replace('/', File.separatorChar));
if(devEnvManualFolder.exists() && devEnvManualFolder.isDirectory()) {
MainRegistry.logger.info("[QMAW] Exploring " + devEnvManualFolder.getAbsolutePath());
dissectManualFolder(devEnvManualFolder);
@ -154,7 +171,40 @@ public class QMAWLoader implements IResourceManagerReloadListener {
}
}
public static void registerJson(String name, JsonObject json) {
//TBI
/** Extracts all the info from a json file's main object to add a QMAW to the system. Very barebones, only handles name, icon and the localized text. */
public static void registerJson(String file, JsonObject json) {
String name = json.get("name").getAsString();
QuickManualAndWiki qmaw = new QuickManualAndWiki(name);
if(json.has("icon")) {
qmaw.setIcon(SerializableRecipe.readItemStack(json.get("icon").getAsJsonArray()));
}
JsonObject title = json.get("title").getAsJsonObject();
for(Entry<String, JsonElement> part : title.entrySet()) {
qmaw.addTitle(part.getKey(), part.getValue().getAsString());
}
JsonObject content = json.get("content").getAsJsonObject();
for(Entry<String, JsonElement> part : content.entrySet()) {
qmaw.addLang(part.getKey(), part.getValue().getAsString());
}
JsonArray triggers = json.get("trigger").getAsJsonArray();
for(JsonElement element : triggers) {
ItemStack trigger = SerializableRecipe.readItemStack(element.getAsJsonArray());
// items get renamed and removed all the time, so we add some more debug goodness for those cases
if(trigger == null || trigger.getItem() == ModItems.nothing) {
MainRegistry.logger.info("[QMAW] Manual " + file + " references nonexistant trigger " + element.toString());
} else {
QMAWLoader.triggers.put(new ComparableStack(trigger).makeSingular(), qmaw);
}
}
if(!qmaw.contents.isEmpty()) {
QMAWLoader.qmaw.put(name, qmaw);
}
}
}

View File

@ -1,5 +1,33 @@
package com.hbm.qmaw;
import java.util.HashMap;
import net.minecraft.item.ItemStack;
public class QuickManualAndWiki {
public String name;
public ItemStack icon;
public HashMap<String, String> title = new HashMap();
public HashMap<String, String> contents = new HashMap();
public QuickManualAndWiki(String name) {
this.name = name;
}
public QuickManualAndWiki setIcon(ItemStack stack) {
this.icon = stack;
return this;
}
public QuickManualAndWiki addTitle(String lang, String title) {
this.title.put(lang, title);
return this;
}
public QuickManualAndWiki addLang(String lang, String contents) {
this.contents.put(lang, contents);
return this;
}
}

View File

@ -0,0 +1,91 @@
package com.hbm.qmaw.components;
import org.lwjgl.opengl.GL11;
import com.hbm.qmaw.GuiQMAW;
import com.hbm.qmaw.ManualElement;
import com.hbm.qmaw.QMAWLoader;
import com.hbm.qmaw.QuickManualAndWiki;
import cpw.mods.fml.common.FMLCommonHandler;
import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.PositionedSoundRecord;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
public class QComponentLink extends ManualElement {
protected String link;
protected ItemStack icon;
protected String text;
protected FontRenderer font;
protected int color = 0x0094FF;
protected int hoverColor = 0xFFD800;
protected static RenderItem itemRender = new RenderItem();
public QComponentLink(String link, String text) {
this.text = text;
this.link = link;
QuickManualAndWiki qmaw = QMAWLoader.qmaw.get(link);
if(qmaw == null) {
this.color = this.hoverColor = 0xFF7F7F;
} else {
this.icon = qmaw.icon;
}
this.font = Minecraft.getMinecraft().fontRenderer;
}
public QComponentLink setColor(int color, int hoverColor) {
this.color = color;
this.hoverColor = hoverColor;
return this;
}
@Override
public int getWidth() {
return font.getStringWidth(text) + (icon != null ? 18 : 0);
}
@Override
public int getHeight() {
return Math.max(font.FONT_HEIGHT, icon != null ? 16 : 0);
}
@Override
public void render(boolean isMouseOver, int x, int y, int mouseX, int mouseY) {
if(this.icon != null) {
GL11.glPushMatrix();
GL11.glEnable(GL11.GL_DEPTH_TEST);
Minecraft mc = Minecraft.getMinecraft();
GL11.glRotated(180, 1, 0, 0);
RenderHelper.enableStandardItemLighting();
GL11.glRotated(-180, 1, 0, 0);
itemRender.renderItemAndEffectIntoGUI(this.font, mc.renderEngine, this.icon, x, y);
itemRender.renderItemOverlayIntoGUI(this.font, mc.renderEngine, this.icon, x, y, null);
RenderHelper.disableStandardItemLighting();
GL11.glDisable(GL11.GL_DEPTH_TEST);
GL11.glPopMatrix();
x += 18;
y += (16 - font.FONT_HEIGHT) / 2;
}
font.drawString(text, x, y, isMouseOver ? hoverColor : color);
}
@Override public void onClick() {
QuickManualAndWiki qmaw = QMAWLoader.qmaw.get(link);
if(qmaw != null) {
Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F));
FMLCommonHandler.instance().showGuiScreen(new GuiQMAW(qmaw));
}
}
}

View File

@ -36,7 +36,7 @@ public class QComponentText extends ManualElement {
}
@Override
public void render(boolean isMouseOver, int mouseX, int mouseY) {
public void render(boolean isMouseOver, int x, int y, int mouseX, int mouseY) {
font.drawString(text, x, y, color);
}

View File

@ -34,13 +34,10 @@ public class MissilePart {
parts.clear();
MissilePart.registerPart(ModItems.mp_thruster_10_kerosene, PartType.THRUSTER, 1, 1, ResourceManager.mp_t_10_kerosene, ResourceManager.mp_t_10_kerosene_tex);
MissilePart.registerPart(ModItems.mp_thruster_10_kerosene_tec, PartType.THRUSTER, 1.25, 1.25, ResourceManager.mp_t_10_kerosene_tec, ResourceManager.universal);
MissilePart.registerPart(ModItems.mp_thruster_10_solid, PartType.THRUSTER, 0.5, 1, ResourceManager.mp_t_10_solid, ResourceManager.mp_t_10_solid_tex);
MissilePart.registerPart(ModItems.mp_thruster_10_xenon, PartType.THRUSTER, 0.5, 1, ResourceManager.mp_t_10_xenon, ResourceManager.mp_t_10_xenon_tex);
//
MissilePart.registerPart(ModItems.mp_thruster_15_kerosene, PartType.THRUSTER, 1.5, 1.5, ResourceManager.mp_t_15_kerosene, ResourceManager.mp_t_15_kerosene_tex);
MissilePart.registerPart(ModItems.mp_thruster_15_kerosene_tec, PartType.THRUSTER, 1.5, 3.25, ResourceManager.mp_t_15_kerosene_tec, ResourceManager.universal);
MissilePart.registerPart(ModItems.mp_thruster_15_kerosene_dual, PartType.THRUSTER, 1, 1.5, ResourceManager.mp_t_15_kerosene_dual, ResourceManager.mp_t_15_kerosene_dual_tex);
MissilePart.registerPart(ModItems.mp_thruster_15_kerosene_triple, PartType.THRUSTER, 1, 1.5, ResourceManager.mp_t_15_kerosene_triple, ResourceManager.mp_t_15_kerosene_dual_tex);
MissilePart.registerPart(ModItems.mp_thruster_15_solid, PartType.THRUSTER, 0.5, 1, ResourceManager.mp_t_15_solid, ResourceManager.mp_t_15_solid_tex);
MissilePart.registerPart(ModItems.mp_thruster_15_solid_hexdecuple, PartType.THRUSTER, 0.5, 1, ResourceManager.mp_t_15_solid_hexdecuple, ResourceManager.mp_t_15_solid_hexdecuple_tex);
@ -149,8 +146,6 @@ public class MissilePart {
MissilePart.registerPart(ModItems.mp_fuselage_15_20_kerosene, PartType.FUSELAGE, 16, 10, ResourceManager.mp_f_15_20_kerosene, ResourceManager.mp_f_15_20_kerosene_tex);
MissilePart.registerPart(ModItems.mp_fuselage_15_20_kerosene_magnusson, PartType.FUSELAGE, 16, 10, ResourceManager.mp_f_15_20_kerosene, ResourceManager.mp_f_15_20_kerosene_magnusson_tex);
MissilePart.registerPart(ModItems.mp_fuselage_15_20_solid, PartType.FUSELAGE, 16, 10, ResourceManager.mp_f_15_20_kerosene, ResourceManager.mp_f_15_20_solid_tex);
//
MissilePart.registerPart(ModItems.mp_fuselage_20_kerosene, PartType.FUSELAGE, 10, 8, ResourceManager.mp_f_20, ResourceManager.universal);
//////
@ -171,9 +166,6 @@ public class MissilePart {
MissilePart.registerPart(ModItems.mp_warhead_15_n2, PartType.WARHEAD, 3, 2, ResourceManager.mp_w_15_n2, ResourceManager.mp_w_15_n2_tex);
MissilePart.registerPart(ModItems.mp_warhead_15_balefire, PartType.WARHEAD, 2.75, 2, ResourceManager.mp_w_15_balefire, ResourceManager.mp_w_15_balefire_tex);
MissilePart.registerPart(ModItems.mp_warhead_15_turbine, PartType.WARHEAD, 2.25, 2, ResourceManager.mp_w_15_turbine, ResourceManager.mp_w_15_turbine_tex);
//
MissilePart.registerPart(ModItems.mp_warhead_20_he, PartType.WARHEAD, 3, 2.25, ResourceManager.mp_w_20, ResourceManager.universal);
}
public static void registerPart(Item item, PartType type, double height, double guiheight, IModelCustom model, ResourceLocation texture) {

View File

@ -3722,6 +3722,8 @@ potion.hbm_telekinesis=! ! !
purex.recycle=Wiederanreicherung von %s
purex.schrab=Schrabidium extrahieren aus %s
qmaw.tab=[ Drücke %s für Hilfe ]
radar.clearMap=Karte zurücksetzen
radar.detectMissiles=Raketen erkennen
radar.detectPlayers=Spieler erkennen

View File

@ -4784,6 +4784,8 @@ potion.hbm_telekinesis=! ! !
purex.recycle=Reprocessing of %s
purex.schrab=Schrabidium extraction from %s
qmaw.tab=[ Press %s for help ]
radar.clearMap=Clear Map
radar.detectMissiles=Detect Missiles
radar.detectPlayers=Detect Players

View File

@ -0,0 +1,11 @@
{
"name": "Advanced Alloy",
"icon": ["hbm:item.ingot_advanced_alloy", 1, 0],
"trigger": [["hbm:item.ingot_advanced_alloy"], ["hbm:item.powder_advanced_alloy"], ["hbm:item.plate_advanced_alloy"]],
"title": {
"en_US": "Advanced Alloy"
},
"content": {
"en_US": "Made in a [[blast furnace|Blast Furnace]] from [[steel|Steel]] and [[Minecraft grade copper|Minecraft Grade Copper]]. Makes better-than-diamond gear. Also used in some high-powered magnets for the [[fusion reactor|Fusion Reactor]] and the [[exposure chamber|Exposure Chamber]]."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Bakelite",
"icon": ["hbm:item.ingot_bakelite", 1, 0],
"trigger": [["hbm:item.ingot_bakelite"], ["hbm:item.powder_bakelite"]],
"title": {
"en_US": "Bakelite"
},
"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."
}
}

View File

@ -1,7 +0,0 @@
{
"name": "DEMO",
"icon": ["hbm:item.gun_light_revolver", 1, 0],
"content": {
"en_US": "This is a test page that links to [[Demo|DEMO]].\n\nFormat line break"
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Minecraft Grade Copper",
"icon": ["hbm:item.ingot_red_copper", 1, 0],
"trigger": [["hbm:item.ingot_red_copper"], ["hbm:item.powder_red_copper"]],
"title": {
"en_US": "Minecraft Grade Copper (Red Copper)"
},
"content": {
"en_US": "Alloy made from copper and redstone in equal parts using the [[blast furnace|Blast Furnace]]. Used in almost all things electric, commonly in wire form."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Plutonium-238",
"icon": ["hbm:item.billet_pu238", 1, 0],
"trigger": [["hbm:item.ingot_pu238"], ["hbm:item.billet_pu238"], ["hbm:item.nugget_pu238"]],
"title": {
"en_US": "Plutonium-238"
},
"content": {
"en_US": "Radioisotope, used mainly in [[RTGs|RTG]]. Derived from [[plutonium|Plutonium]] hexafluoride, or from various nuclear fuels, mainly ones using [[uranium-235|Uranium-235]]. Usable with [[beryllium|Beryllium]] as Pu238Be neutron sources in [[RBMKs|RBMK]].<br><br>Moderately radioactive, very hot."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Plutonium-239",
"icon": ["hbm:item.billet_pu239", 1, 0],
"trigger": [["hbm:item.ingot_pu239"], ["hbm:item.billet_pu239"], ["hbm:item.nugget_pu239"]],
"title": {
"en_US": "Plutonium-239"
},
"content": {
"en_US": "Primary fissile isotope of [[plutonium|Plutonium]]. Can be extracted from many spent fuels that use [[uranium-238|Uranium-238]] or directly from [[reactor-grade plutonium|Reactor-Grade Plutonium]]. Usable in high enriched fuels for various reactors, mixed with other isotopes for lower enriched fuels, or as fissile material in many nuclear bombs.<br><br>Moderately radioactive."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Plutonium-240",
"icon": ["hbm:item.billet_pu240", 1, 0],
"trigger": [["hbm:item.ingot_pu240"], ["hbm:item.billet_pu240"], ["hbm:item.nugget_pu240"]],
"title": {
"en_US": "Plutonium-240"
},
"content": {
"en_US": "Non-fissile isotope found in [[plutonium|Plutonium]] and [[reactor-grade plutonium|Reactor-Grade-Plutonium]]. Only useful when manually making reactor-grade plutonium from [[plutonium-239|Plutonium-239]] or inspecialized [[zirconium|Zirconium]] fast breeder rods for making [[plutonium-241|Plutonium-241]] in the [[RBMK]]."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Plutonium-241",
"icon": ["hbm:item.billet_pu241", 1, 0],
"trigger": [["hbm:item.ingot_pu241"], ["hbm:item.billet_pu241"], ["hbm:item.nugget_pu241"]],
"title": {
"en_US": "Plutonium-241"
},
"content": {
"en_US": "Secondary fissile isotope of [[plutonium|Plutonium]]. Can be recovered from [[plutonium-240|Plutonium-240]]-rich spent [[RBMK]] fuels, as well as certain types of [[zirconium|Zirconium]] fast breefer fuels. Only used in specialized breeding fuels and as high enriched fuel, which is more powerful than its [[plutonium-239|Plutonium-239]] counterpart. Plutonium-241 in RBMKs yields [[americium-241|Americium-241]] and [[americium-242|Americium-242]] when reprocessed.<br><br>Highly radioactive."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Reactor-Grade Plutonium",
"icon": ["hbm:item.billet_pu_mix", 1, 0],
"trigger": [["hbm:item.ingot_pu_mix"], ["hbm:item.billet_pu_mix"], ["hbm:item.nugget_pu_mix"]],
"title": {
"en_US": "Reactor-Grade Plutonium"
},
"content": {
"en_US": "Mixture of [[plutonium-239|Plutonium-239]] and [[plutonium-240|Plutonium-240]]. Common result of reprocessing many [[uranium|Uranium]]-based fuels, as well as by breeding uranium in the [[Chicago Pile]]. Usable in many reactors as medium enriched plutonium fuel.<br><br>Moderately radioactive."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Plutonium",
"icon": ["hbm:item.ingot_plutonium", 1, 0],
"trigger": [["hbm:item.ingot_plutonium"], ["hbm:item.billet_plutonium"], ["hbm:item.nugget_plutonium"], ["hbm:item.powder_plutonium"]],
"title": {
"en_US": "Plutonium"
},
"content": {
"en_US": "Rare form of impure plutonium, composed of plutonium-238, 239 and 240. Plutonium in ore form is disabled by default. May be processed in a [[gas centrifuge|Gas Centrifuge]] in hexafluoride form, or used for certain [[cyclotron|Cyclotron]] recipes.<br><br>Moderately radioactive.<br><br>See also:<br>[[Plutonium-238]]<br>[[Plutonium-239]]<br>[[Plutonium-240]]<br>[[Plutonium-241]]"
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Polonium-210",
"icon": ["hbm:item.billet_polonium", 1, 0],
"trigger": [["hbm:item.ingot_polonium"], ["hbm:item.billet_polonium"], ["hbm:item.nugget_polonium"]],
"title": {
"en_US": "Polonium-210"
},
"content": {
"en_US": "Radioisotope derived from reprocessing [[radium-226|Radium-226]] neutron sources. Usable for [[RTGs|RTG]], or with [[beryllium|Beryllium]] in Po210Be neutron sources for [[RBMKs|RBMK]].<br><br>Highly radioactive, very hot."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Polymer",
"icon": ["hbm:item.ingot_polymer", 1, 0],
"trigger": [["hbm:item.ingot_polymer"], ["hbm:item.powder_polymer"]],
"title": {
"en_US": "Polymer"
},
"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]]."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Radium-226",
"icon": ["hbm:item.billet_ra226", 1, 0],
"trigger": [["hbm:item.ingot_ra226"], ["hbm:item.billet_ra226"], ["hbm:item.nugget_ra226"], ["hbm:item.powder_ra226"]],
"title": {
"en_US": "Radium-226"
},
"content": {
"en_US": "Rare radioactive material found in [[uranium|Uranium]] and [[thorium|Thorium-232]] ores, may be extracted using a [[centrifuge|Centrifuge]]. Used with [[beryllium|Beryllium]] in Ra226Be neutron sources, which are vital for kickstarting the [[Chicago Pile]], [[PWR]], [[research reactor|Research Reactor]] and [[RBMK]]. The first available neutron source, and often times the cheapest.<br><br>Moderately radioactive."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Silicon",
"icon": ["hbm:item.billet_silicon", 1, 0],
"trigger": [["hbm:item.ingot_silicon"], ["hbm:item.billet_silicon"], ["hbm:item.nugget_silicon"]],
"title": {
"en_US": "Silicon"
},
"content": {
"en_US": "Important material for producing integrated circuits, and any electronics more sophisticated than an analog circuit. Created in an [[electric arc furnace|Electric Arc Furnace]] using things that contain silicon dioxide, like regular sand, nether quartz, fiberglass, flint or [[asbestos|Asbestos]]. Used primarily as wafers (i.e. billets) which are [[pressed|Burner Press]] using a circuit stamp, and then crafted into different types of microchips. Due to requiring an arc furnace, silicon is available after obtaining [[polymer|Polmyer]], requiring [[oil|Crude Oil]] processing."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Steel",
"icon": ["hbm:item.ingot_steel", 1, 0],
"trigger": [["hbm:item.ingot_steel"], ["hbm:item.plate_steel"], ["hbm:item.powder_steel"]],
"title": {
"en_US": "Steel"
},
"content": {
"en_US": "Upgraded version of iron, basic material. Used in almost everything. Initially obtained by combining coal and iron in a [[blast furnace|Blast Furnace]]. Upgraded recipes are available later on via [[crucible|Crucible]] and [[rotary furnace|Rotary Furnace]]."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Technetium",
"icon": ["hbm:item.ingot_technetium", 1, 0],
"trigger": [["hbm:item.billet_technetium"], ["hbm:item.ingot_technetium"], ["hbm:item.nugget_technetium"]],
"title": {
"en_US": "Technetium"
},
"content": {
"en_US": "Synthetic metal, reprocessed from [[ZIRNOX]] or [[PWR]] fuel early on. May also be extracted from some [[RBMK]] fuels or [[bedrock ore|Bedrock Ore]] with high-performance solvent.<br><br>Primarily used for [[technetium steel|Technetium Steel]].<br><br>Moderately radioactive."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Technetium Steel",
"icon": ["hbm:item.ingot_tcalloy", 1, 0],
"trigger": [["hbm:item.ingot_tcalloy"], ["hbm:item.powder_tcalloy"]],
"title": {
"en_US": "Technetium Steel"
},
"content": {
"en_US": "Alloy made from [[steel|Steel]] and [[technetium|Technetium]]. Corrosion resistant, used in stronger fluid tanks and many advanced machines. Obtainable after either a [[ZIRNOX]] or [[PWR]] due to technetium being synthetic.<br><br>Fully interchangable with [[cadmium steel|Cadmium Steel]]."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Thorium-232",
"icon": ["hbm:item.billet_th232", 1, 0],
"trigger": [["hbm:item.ingot_th232"], ["hbm:item.billet_th232"], ["hbm:item.nugget_th232"], ["hbm:item.powder_thorium"]],
"title": {
"en_US": "Thorium-232"
},
"content": {
"en_US": "Fertile (i.e. can be bred) isotope which yields [[uranium-233|Uranium-233]]. Can either be irradiated in an [[RBMK]] to produce [[thorium fuel|Thorium Fuel]] or combined with uranium-233. Thorium-derived fuels are generally cost-effective but not very powerful. Also usable in [[liquid thorium salt|Liquid Thorium Salt]], a powerful [[PWR]] coolant (turning it into a molten salt reactor) which yields tons of uranium-233 quickly.<br><br>Slightly radioactive."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Uranium-233",
"icon": ["hbm:item.billet_u233", 1, 0],
"trigger": [["hbm:item.ingot_u233"], ["hbm:item.billet_u233"], ["hbm:item.nugget_u233"]],
"title": {
"en_US": "Uranium-233"
},
"content": {
"en_US": "Artificial type of fissile uranium (i.e. reactor capable), created by reprocessing [[thorium-based fuels|Thorium Fuel]]. High enriched uranium-233 fuel is generally more powerful than fuel derived from [[uranium-235|Uranium-235]].<br><br>Moderately radioactive."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Uranium-235",
"icon": ["hbm:item.billet_u235", 1, 0],
"trigger": [["hbm:item.ingot_u235"], ["hbm:item.billet_u235"], ["hbm:item.nugget_u235"]],
"title": {
"en_US": "Uranium-235"
},
"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."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Uranium-238",
"icon": ["hbm:item.billet_u238", 1, 0],
"trigger": [["hbm:item.ingot_u238"], ["hbm:item.billet_u238"], ["hbm:item.nugget_u238"]],
"title": {
"en_US": "Uranium-238"
},
"content": {
"en_US": "Depleted uranium, not fissile (i.e. not directly reactor-usable). Primarily a byproduct from enriching [[uranium|Uranium]]. Used in [[ferrouranium|Ferrouranium]], for [[depleted uranium ammo|Depleted Uranium Ammo]] and for certain low-enriched fuels. Fuels that contain uranium-238 typically yield useful [[plutonium-239|Plutonium-239]] when reprocessing.<br><br>Slightly radioactive."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Uranium",
"icon": ["hbm:item.ingot_uranium", 1, 0],
"trigger": [["hbm:item.ingot_uranium"], ["hbm:item.billet_uranium"], ["hbm:item.nugget_uranium"], ["hbm:item.powder_uranium"], ["hbm:tile.ore_uranium"]],
"title": {
"en_US": "Uranium"
},
"content": {
"en_US": "Natural uranium, slightly radioactive. Not very fissile on its own, can be enriched by turning it into [[uranium hexafluoride|Uranium Hexafluoride]] and processing it in [[gas centrifuges|Gas Centrifuge]]. [[ZIRNOX]], [[RBMK]] and [[Chigago Pile]] may use natural uranium as fuel without enrichment.<br><br>See also:<br>[[Uranium-233]]<br>[[Uranium-235]]<br>[[Uranium-238]]"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1017 B