From d70464b3d12457f35120c998cf3b9f188580853b Mon Sep 17 00:00:00 2001 From: Bob Date: Wed, 6 Aug 2025 20:13:44 +0200 Subject: [PATCH] QMAW the second (third?) --- changelog | 16 +--- .../inventory/recipes/ArcFurnaceRecipes.java | 4 + .../hbm/inventory/recipes/PUREXRecipes.java | 4 +- src/main/java/com/hbm/items/ModItems.java | 14 ---- .../hbm/items/weapon/sedna/ItemGunBaseNT.java | 4 +- src/main/java/com/hbm/main/MainRegistry.java | 5 ++ .../java/com/hbm/main/ModEventHandler.java | 5 +- .../com/hbm/main/ModEventHandlerClient.java | 26 ++++++ .../java/com/hbm/main/ResourceManager.java | 4 - src/main/java/com/hbm/qmaw/GuiQMAW.java | 60 +++++++++++++- src/main/java/com/hbm/qmaw/QMAWLoader.java | 54 ++++++++++++- .../java/com/hbm/qmaw/QuickManualAndWiki.java | 28 +++++++ .../hbm/qmaw/components/QComponentLink.java | 81 +++++++++++++++++++ .../java/com/hbm/render/util/MissilePart.java | 8 -- .../resources/assets/hbm/manual/demo.json | 4 + 15 files changed, 268 insertions(+), 49 deletions(-) create mode 100644 src/main/java/com/hbm/qmaw/components/QComponentLink.java diff --git a/changelog b/changelog index bc517c4ea..fa5fe2270 100644 --- a/changelog +++ b/changelog @@ -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 \ No newline at end of file +* Fixed GT6 compatibility watz pellets crashing due to misconfigured recipes +* Removed failed attempt at fixing the gun desync dupe which made things worse \ No newline at end of file diff --git a/src/main/java/com/hbm/inventory/recipes/ArcFurnaceRecipes.java b/src/main/java/com/hbm/inventory/recipes/ArcFurnaceRecipes.java index 35b202158..fae8f617f 100644 --- a/src/main/java/com/hbm/inventory/recipes/ArcFurnaceRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ArcFurnaceRecipes.java @@ -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(); diff --git a/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java b/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java index 3849b1759..76cdc088c 100644 --- a/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java @@ -431,7 +431,7 @@ public class PUREXRecipes extends GenericRecipes { 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 { .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), diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 24af636e0..f04a7218f 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -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()); diff --git a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java index f77640e05..704eb09a6 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java +++ b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java @@ -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 { diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index f797b0de3..d6cd9eea2 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -967,6 +967,7 @@ public class MainRegistry { event.registerServerCommand(new CommandRadiation()); event.registerServerCommand(new CommandPacketInfo()); event.registerServerCommand(new CommandReloadServer()); + ArcFurnaceRecipes.registerFurnaceSmeltables(); // because we have to wait for other mods to take their merry ass time to register recipes } @EventHandler @@ -1724,6 +1725,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); diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index 4a3ded4e7..7632100df 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -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 diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index ed62ac103..823e38433 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -36,6 +36,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 +750,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.GREEN + I18nUtil.resolveKey("qmaw.tab")); + lastQMAW = qmaw; + qmawTimestamp = Clock.get_ms(); + } + } catch(Exception ex) { + list.add(EnumChatFormatting.RED + "Error loading cannery: " + ex.getLocalizedMessage()); + } + /*ItemStack copy = stack.copy(); List materials = Mats.getMaterialsFromItem(copy); @@ -759,6 +773,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 +907,16 @@ public class ModEventHandlerClient { } } + if(Keyboard.isKeyDown(Keyboard.KEY_TAB) && 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(); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index a3651233d..bc109ad26 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -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")); diff --git a/src/main/java/com/hbm/qmaw/GuiQMAW.java b/src/main/java/com/hbm/qmaw/GuiQMAW.java index b579a846e..9e3b37595 100644 --- a/src/main/java/com/hbm/qmaw/GuiQMAW.java +++ b/src/main/java/com/hbm/qmaw/GuiQMAW.java @@ -1,5 +1,63 @@ package com.hbm.qmaw; -public class GuiQMAW { +import java.util.ArrayList; +import java.util.List; +import org.lwjgl.opengl.GL11; + +import com.hbm.lib.RefStrings; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; +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 List lines = new ArrayList(); + + protected int xSize = 192; + protected int ySize = 256; + protected int guiLeft; + protected int guiTop; + + public GuiQMAW(QuickManualAndWiki qmaw) { + parseQMAW(qmaw); + } + + protected void parseQMAW(QuickManualAndWiki qmaw) { + + } + + @Override + public void initGui() { + super.initGui(); + this.guiLeft = (this.width - this.xSize) / 2; + this.guiTop = (this.height - this.ySize) / 2; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + this.drawDefaultBackground(); + this.drawGuiContainerBackgroundLayer(f, mouseX, mouseY); + GL11.glDisable(GL11.GL_LIGHTING); + this.drawGuiContainerForegroundLayer(mouseX, mouseY); + GL11.glEnable(GL11.GL_LIGHTING); + } + + private void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { + + int x = 0; + int y = 0; + + 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, xSize, ySize); + } } diff --git a/src/main/java/com/hbm/qmaw/QMAWLoader.java b/src/main/java/com/hbm/qmaw/QMAWLoader.java index 710511a4b..c5bdf391e 100644 --- a/src/main/java/com/hbm/qmaw/QMAWLoader.java +++ b/src/main/java/com/hbm/qmaw/QMAWLoader.java @@ -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 qmaw = new HashMap(); + public static HashMap triggers = new HashMap(); @Override public void onResourceManagerReload(IResourceManager resMan) { @@ -50,13 +58,22 @@ 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

+ * This affront to god can load QMAW definition files from four different sources:
+ * * Any mod's jar that has registered itself to include QMAW files
+ * * The dev environment, because "the mod file" would in this case be this very class file, and that's incorrect
+ * * ZIP-based resource packs
+ * * Folder-based resource packs + * */ public static void agonyEngine() { for(File modFile : registeredModFiles) dissectZip(modFile); @@ -154,7 +171,38 @@ public class QMAWLoader implements IResourceManagerReloadListener { } } + /** 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 name, JsonObject json) { - //TBI + 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 part : title.entrySet()) { + qmaw.addTitle(part.getKey(), part.getValue().getAsString()); + } + + JsonObject content = json.get("content").getAsJsonObject(); + for(Entry 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 " + name + " references nonexistant trigger " + element.toString()); + } else { + QMAWLoader.triggers.put(new ComparableStack(trigger).makeSingular(), qmaw); + } + } + + if(!qmaw.contents.isEmpty()) { + QMAWLoader.qmaw.put(name, qmaw); + } } } diff --git a/src/main/java/com/hbm/qmaw/QuickManualAndWiki.java b/src/main/java/com/hbm/qmaw/QuickManualAndWiki.java index 7f206bad6..f961cd2fe 100644 --- a/src/main/java/com/hbm/qmaw/QuickManualAndWiki.java +++ b/src/main/java/com/hbm/qmaw/QuickManualAndWiki.java @@ -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 title = new HashMap(); + public HashMap 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; + } } diff --git a/src/main/java/com/hbm/qmaw/components/QComponentLink.java b/src/main/java/com/hbm/qmaw/components/QComponentLink.java new file mode 100644 index 000000000..6024deb6f --- /dev/null +++ b/src/main/java/com/hbm/qmaw/components/QComponentLink.java @@ -0,0 +1,81 @@ +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.gui.FontRenderer; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.item.ItemStack; + +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; + } + } + + 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 ? 20 : 0); + } + + @Override + public int getHeight() { + return Math.max(font.FONT_HEIGHT, icon != null ? 18 : 0); + } + + @Override + public void render(boolean isMouseOver, int mouseX, int mouseY) { + int x = this.x; + int y = this.y; + + if(this.icon != null) { + + GL11.glEnable(GL11.GL_DEPTH_TEST); + Minecraft mc = Minecraft.getMinecraft(); + 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); + + x += 20; + y += (18 - 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) FMLCommonHandler.instance().showGuiScreen(new GuiQMAW(qmaw)); + } +} diff --git a/src/main/java/com/hbm/render/util/MissilePart.java b/src/main/java/com/hbm/render/util/MissilePart.java index dbec574c4..1f33a4b6a 100644 --- a/src/main/java/com/hbm/render/util/MissilePart.java +++ b/src/main/java/com/hbm/render/util/MissilePart.java @@ -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) { diff --git a/src/main/resources/assets/hbm/manual/demo.json b/src/main/resources/assets/hbm/manual/demo.json index f21a54d12..d64a6de99 100644 --- a/src/main/resources/assets/hbm/manual/demo.json +++ b/src/main/resources/assets/hbm/manual/demo.json @@ -1,6 +1,10 @@ { "name": "DEMO", "icon": ["hbm:item.gun_light_revolver", 1, 0], + "trigger": [["hbm:item.plate_iron"], ["hbm:item.plate_gold"], ["hbm:item.plate_sludge"]], + "title": { + "en_US": "TEST PAGE" + } "content": { "en_US": "This is a test page that links to [[Demo|DEMO]].\n\nFormat line break" }