From afb559d6041d1b0130d334a4bf8958d80bdc9ad6 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 14 Sep 2025 22:51:27 +0200 Subject: [PATCH] sparks! --- changelog | 6 +- gradle.properties | 2 +- .../gui/GUIMachineAssemblyFactory.java | 4 +- .../recipes/AssemblyMachineRecipes.java | 2 + .../hbm/inventory/recipes/PUREXRecipes.java | 9 ++- src/main/java/com/hbm/lib/RefStrings.java | 2 +- .../java/com/hbm/main/ResourceManager.java | 1 + .../tileentity/RenderAssemblyFactory.java | 65 +++++++++++++++++- .../TileEntityMachineAssemblyFactory.java | 4 +- .../machine/TileEntityMachineTurbofan.java | 2 +- .../assets/hbm/manual/machine/assembler.json | 2 +- .../assets/hbm/textures/armor/t51_arm.png | Bin 0 -> 502 bytes .../assets/hbm/textures/armor/t51_chest.png | Bin 0 -> 820 bytes .../assets/hbm/textures/armor/t51_leg.png | Bin 0 -> 380 bytes .../models/machines/assembly_factory.png | Bin 5024 -> 5448 bytes .../machines/assembly_factory_sparks.png | Bin 0 -> 272 bytes 16 files changed, 84 insertions(+), 15 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/armor/t51_arm.png create mode 100644 src/main/resources/assets/hbm/textures/armor/t51_chest.png create mode 100644 src/main/resources/assets/hbm/textures/armor/t51_leg.png create mode 100644 src/main/resources/assets/hbm/textures/models/machines/assembly_factory_sparks.png diff --git a/changelog b/changelog index ba019f652..682553da7 100644 --- a/changelog +++ b/changelog @@ -15,9 +15,13 @@ * PgUp and PgDown scroll by 5 lines (full page) * 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 fusion reactor item IO being broken * 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 * 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 \ No newline at end of file + * 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 \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index fdd257f7b..77f883e59 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=5441 +mod_build_number=5453 credits=HbMinecraft,\ \ rodolphito (explosion algorithms),\ diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyFactory.java b/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyFactory.java index 583b57bce..ac9ff747c 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyFactory.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyFactory.java @@ -36,8 +36,8 @@ public class GUIMachineAssemblyFactory extends GuiInfoContainer { 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, 3, 16); - assembler.outputTanks[j].renderTankInfo(this, mouseX, mouseY, guiLeft + 105 + (j % 2) * 109, guiTop + 54 + (j / 2) * 56, 3, 16); + 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); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index 096fd0825..de2711f8c 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -216,6 +216,8 @@ public class AssemblyMachineRecipes extends GenericRecipes { 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)) .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)) .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))); diff --git a/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java b/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java index 76cdc088c..c6ab8e83b 100644 --- a/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java @@ -53,9 +53,9 @@ public class PUREXRecipes extends GenericRecipes { this.register(new GenericRecipe("purex.zirnoxmeu").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this) .inputItems(new ComparableStack(ModItems.waste_uranium)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) - .outputItems(new ItemStack(ModItems.nugget_u238, 1), - new ItemStack(ModItems.nugget_pu_mix, 2), - new ItemStack(ModItems.nugget_pu239, 1), + .outputItems(new ItemStack(ModItems.nugget_pu_mix, 1), + new ItemStack(ModItems.nugget_plutonium, 2), + new ItemStack(ModItems.nugget_technetium, 1), new ItemStack(ModItems.nuclear_waste_tiny, 2)) .setIconToFirstIngredient()); @@ -80,8 +80,7 @@ public class PUREXRecipes extends GenericRecipes { this.register(new GenericRecipe("purex.zirnoxmep").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this) .inputItems(new ComparableStack(ModItems.waste_plutonium)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) - .outputItems(new ItemStack(ModItems.nugget_pu_mix, 1), - new ItemStack(ModItems.nugget_pu_mix, 1), + .outputItems(new ItemStack(ModItems.nugget_pu_mix, 2), new ItemStack(ModItems.nugget_technetium, 1), new ItemStack(ModItems.nuclear_waste_tiny, 3)) .setIconToFirstIngredient()); diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 98e253f40..5b17eb388 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; 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: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 4eb451c2b..480e84917 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -580,6 +580,7 @@ public class ResourceManager { 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 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 public static final ResourceLocation chemplant_body_tex = new ResourceLocation(RefStrings.MODID, "textures/models/chemplant_base_new.png"); diff --git a/src/main/java/com/hbm/render/tileentity/RenderAssemblyFactory.java b/src/main/java/com/hbm/render/tileentity/RenderAssemblyFactory.java index a303ef057..06cdbf265 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderAssemblyFactory.java +++ b/src/main/java/com/hbm/render/tileentity/RenderAssemblyFactory.java @@ -12,7 +12,9 @@ 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; @@ -145,7 +147,7 @@ public class RenderAssemblyFactory extends TileEntitySpecialRenderer implements 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.glRotated(arm4[4], 1, 0, 0); GL11.glTranslated(0, -1.625, 0.3125); ResourceManager.assembly_factory.renderPart("Blade4"); } GL11.glPopMatrix(); @@ -189,6 +191,67 @@ public class RenderAssemblyFactory extends TileEntitySpecialRenderer implements } 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); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyFactory.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyFactory.java index 0613437c8..295d1b4a7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyFactory.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyFactory.java @@ -186,7 +186,7 @@ public class TileEntityMachineAssemblyFactory extends TileEntityMachineBase impl this.networkPackNT(100); } else { - if(MainRegistry.proxy.me().getDistance(xCoord , yCoord, zCoord) < 50) { + if((didProcess[0] ||didProcess[1] ||didProcess[2] ||didProcess[3]) && MainRegistry.proxy.me().getDistance(xCoord , yCoord, zCoord) < 50) { if(audio == null) { audio = createAudioLoop(); audio.startSound(); @@ -443,7 +443,7 @@ public class TileEntityMachineAssemblyFactory extends TileEntityMachineBase impl public TragicYuri(int group) { striker = new AssemblerArm( group == 0 ? 0 : 3); saw = new AssemblerArm( group == 0 ? 1 : 2).yepThatsASaw(); - timeUntilReposition = 200; + timeUntilReposition = 140 + rand.nextInt(161); } public void update(boolean working) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java index 6b804feaa..5140ccffc 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java @@ -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 * 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 rot = dir.getRotation(ForgeDirection.UP); diff --git a/src/main/resources/assets/hbm/manual/machine/assembler.json b/src/main/resources/assets/hbm/manual/machine/assembler.json index a39c70492..bbae88842 100644 --- a/src/main/resources/assets/hbm/manual/machine/assembler.json +++ b/src/main/resources/assets/hbm/manual/machine/assembler.json @@ -7,7 +7,7 @@ "zh_CN": "装配机" }, "content": { - "en_US": "Universal machine for building things with up to twelve item inputs. Important early on and used widely throughout progression. Build in an [[anvil|Anvil]], using plates from a [[press|Press]].", + "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]]中制造。" } } diff --git a/src/main/resources/assets/hbm/textures/armor/t51_arm.png b/src/main/resources/assets/hbm/textures/armor/t51_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..fa6f976194e7eeb13ea83fb16c9524dcca1cbbb4 GIT binary patch literal 502 zcmV1^@s6>NuCl00004b3#c}2nYxW zdb>!3`IW+9j2%8+95aS&?{KJLhq0vYc8lR6<|A3M9P#6 z0(?slTV%dI1xio|N_=5XrRNVUq>)FIq~`}}Jg|@?=0h$?hbNL~VwVY(qE>pTLlcN3 zF_$r2TYHkgOB#q)Ot~ zJ+nu&nfByDwQ-@^xKM4(2o2Jmi9>03I=VA$gOfls^&Kv1@7~3pekiGl;Z#-4QOOco zJIjsRI$9{_2(mcIHM_VwMN#+@Db*K&6NX4a?~p)`M^S?>7L zP85F`V;FhpvwRh5#!(lljSJPrjL>jq>*3_7K>#r0eJ@@9$EC(N8k7$(RC;R7DifIr zwZ~=msa2*?0=VOH`OTExg=*tMwQ-@^gvcCt)wqoB_1eg0)^kCjbfaR%QQ3|21%EPR s%sA?6R2$wJ%}(~L(HwiwSu>9Q0po(32r{hubN~PV07*qoM6N<$f_VnxUjP6A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/armor/t51_chest.png b/src/main/resources/assets/hbm/textures/armor/t51_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..1362ee9a8ae05c7d5421e1cbc3ff119ae6cf38d2 GIT binary patch literal 820 zcmeAS@N?(olHy`uVBq!ia0vp^CxQ4S2OE&=%MvyQQY^(zo*^7SP{WbZ!N9=u+SA1` zq+-t7+o!Xd9T*%g`n+ua{rs})Nj2Y{3;iZ7oU>Wb(X~KN+3wh!;<$$R+C9Hn63Uet z6@)lO2};A@!_RlZKl=L&_f6k=x76~v@cFjQXH>dlnJd59?dkInvogNXx@o=P@||@v zH#6T|dSlW|mL?B{id|bzN&GZfEt98%MfQzj-)PTnxjL!kpCi9|pp%-{8Q^^5nP z{^?j3BlknE?6~vEQc?#82G2 zlc!sB=jZ$FIKva!UNmP6B5n=igu|9cZYnuU2WA5X MPgg&ebxsLQ0Aj!JzyJUM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/armor/t51_leg.png b/src/main/resources/assets/hbm/textures/armor/t51_leg.png new file mode 100644 index 0000000000000000000000000000000000000000..0c71e515f6256c6aecde23f8dafe46c3cf7b5e70 GIT binary patch literal 380 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 literal 0 HcmV?d00001