From 94d37e391071df8b9ed23d19b7e9ee4f5728f468 Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 17 Mar 2026 15:16:27 +0100 Subject: [PATCH] mhhhh, donuts --- changelog | 2 + src/main/java/com/hbm/blocks/ModBlocks.java | 10 +- .../fusion/MachineFusionPlasmaForge.java | 17 ++- .../recipes/AssemblyMachineRecipes.java | 1 - .../inventory/recipes/PlasmaForgeRecipes.java | 80 +++++++++++ src/main/java/com/hbm/main/ClientProxy.java | 1 + .../module/machine/ModuleMachinePlasma.java | 37 +++++ .../fusion/TileEntityFusionPlasmaForge.java | 128 +++++++++++++++++- .../gui/reactors/gui_fusion_plasmaforge.png | Bin 0 -> 7226 bytes 9 files changed, 259 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/recipes/PlasmaForgeRecipes.java create mode 100644 src/main/java/com/hbm/module/machine/ModuleMachinePlasma.java create mode 100644 src/main/resources/assets/hbm/textures/gui/reactors/gui_fusion_plasmaforge.png diff --git a/changelog b/changelog index 882222e24..f75344b58 100644 --- a/changelog +++ b/changelog @@ -2,6 +2,8 @@ * Doubled bismuth and tantalum yields from high-performance solvent bedrock ore processing * Hoppers and buckets can now be made out of steel * RoR gauges now show the lowest and highest configured value on the actual gauge +* The steel sword now looks like a medival broad sword with the appropriate scale +* All remaining items have been removed from the template folder, siren tracks and plate stamps are now made in th ## Fixed * Fixed size 15 dual kerosene thruster not rendering at all diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 8703cb9cc..2c9a506ab 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -8,15 +8,7 @@ import com.hbm.blocks.generic.*; import com.hbm.blocks.generic.BlockHazard.ExtDisplayEffect; import com.hbm.blocks.machine.*; import com.hbm.blocks.machine.albion.*; -import com.hbm.blocks.machine.fusion.MachineFusionBoiler; -import com.hbm.blocks.machine.fusion.MachineFusionBreeder; -import com.hbm.blocks.machine.fusion.MachineFusionCollector; -import com.hbm.blocks.machine.fusion.MachineFusionCoupler; -import com.hbm.blocks.machine.fusion.MachineFusionKlystron; -import com.hbm.blocks.machine.fusion.MachineFusionKlystronCreative; -import com.hbm.blocks.machine.fusion.MachineFusionMHDT; -import com.hbm.blocks.machine.fusion.MachineFusionPlasmaForge; -import com.hbm.blocks.machine.fusion.MachineFusionTorus; +import com.hbm.blocks.machine.fusion.*; import com.hbm.blocks.machine.pile.*; import com.hbm.blocks.machine.rbmk.*; import com.hbm.blocks.network.*; diff --git a/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionPlasmaForge.java b/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionPlasmaForge.java index 02158d812..3e6235a0c 100644 --- a/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionPlasmaForge.java +++ b/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionPlasmaForge.java @@ -1,11 +1,14 @@ package com.hbm.blocks.machine.fusion; import com.hbm.blocks.BlockDummyable; +import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.fusion.TileEntityFusionPlasmaForge; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public class MachineFusionPlasmaForge extends BlockDummyable { @@ -16,16 +19,20 @@ public class MachineFusionPlasmaForge extends BlockDummyable { @Override public TileEntity createNewTileEntity(World world, int meta) { if(meta >= 12) return new TileEntityFusionPlasmaForge(); + if(meta >= 6) return new TileEntityProxyCombo().inventory().power().fluid(); return null; } - + @Override - public int[] getDimensions() { - return new int[] { 4, 0, 5, 5, 5, 5 }; + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + return this.standardOpenBehavior(world, x, y, z, player, 0); } + @Override public int[] getDimensions() { return new int[] { 4, 0, 5, 5, 5, 5 }; } + @Override public int getOffset() { return 5; } + @Override - public int getOffset() { - return 5; + public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { + super.fillSpace(world, x, y, z, dir, o); } } diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index b91609144..75550e704 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -1154,7 +1154,6 @@ public class AssemblyMachineRecipes extends GenericRecipes { new ComparableStack(ModItems.motor_bismuth, 3))); } } - } public static HashMap getRecipes() { diff --git a/src/main/java/com/hbm/inventory/recipes/PlasmaForgeRecipes.java b/src/main/java/com/hbm/inventory/recipes/PlasmaForgeRecipes.java new file mode 100644 index 000000000..c6634c69a --- /dev/null +++ b/src/main/java/com/hbm/inventory/recipes/PlasmaForgeRecipes.java @@ -0,0 +1,80 @@ +package com.hbm.inventory.recipes; + +import static com.hbm.inventory.OreDictManager.BSCCO; +import static com.hbm.inventory.OreDictManager.SBD; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.FluidStack; +import com.hbm.inventory.RecipesCommon.AStack; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.RecipesCommon.OreDictStack; +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.inventory.recipes.loader.GenericRecipes; +import com.hbm.items.ModItems; +import com.hbm.items.ItemEnums.EnumExpensiveType; +import com.hbm.items.ItemGenericPart.EnumPartType; +import com.hbm.items.machine.ItemFluidIcon; +import com.hbm.items.machine.ItemCircuit.EnumCircuitType; + +import net.minecraft.item.ItemStack; + +public class PlasmaForgeRecipes extends GenericRecipes { + + public static final PlasmaForgeRecipes INSTANCE = new PlasmaForgeRecipes(); + + @Override public int inputItemLimit() { return 12; } + @Override public int inputFluidLimit() { return 1; } + @Override public int outputItemLimit() { return 1; } + @Override public int outputFluidLimit() { return 0; } + + @Override public String getFileName() { return "hbmPlasmaForge.json"; } + @Override public GenericRecipe instantiateRecipe(String name) { return new GenericRecipe(name); } + + @Override + public void registerDefaults() { + + this.register(new GenericRecipe("plsm.gerald").setup(6_000, 100).outputItems(new ItemStack(ModItems.sat_gerald, 1)) + .inputItems(new OreDictStack(SBD.plateCast(), 64), + new OreDictStack(SBD.plateCast(), 64), + new OreDictStack(BSCCO.wireDense(), 64), + new OreDictStack(BSCCO.wireDense(), 64), + new ComparableStack(ModBlocks.det_nuke, 64), + new ComparableStack(ModItems.part_generic, 64, EnumPartType.HDE), + new ComparableStack(ModItems.part_generic, 64, EnumPartType.HDE), + new ComparableStack(ModItems.part_generic, 64, EnumPartType.HDE), + new ComparableStack(ModItems.part_generic, 64, EnumPartType.HDE), + new ComparableStack(ModItems.circuit, 64, EnumCircuitType.CONTROLLER_QUANTUM), + new ComparableStack(ModItems.coin_ufo, 1)) + .inputItemsEx(new OreDictStack(SBD.plateCast(), 64), + new OreDictStack(BSCCO.wireDense(), 64), + new ComparableStack(ModBlocks.det_nuke, 64), + new ComparableStack(ModItems.item_expensive, 64, EnumExpensiveType.BRONZE_TUBES), + new ComparableStack(ModItems.item_expensive, 64, EnumExpensiveType.BRONZE_TUBES), + new ComparableStack(ModItems.item_expensive, 64, EnumExpensiveType.BRONZE_TUBES), + new ComparableStack(ModItems.part_generic, 64, EnumPartType.HDE), + new ComparableStack(ModItems.part_generic, 64, EnumPartType.HDE), + new ComparableStack(ModItems.part_generic, 64, EnumPartType.HDE), + new ComparableStack(ModItems.circuit, 64, EnumCircuitType.CONTROLLER_QUANTUM), + new ComparableStack(ModItems.item_expensive, 64, EnumExpensiveType.COMPUTER), + new ComparableStack(ModItems.coin_ufo, 1)).setPools(GenericRecipes.POOL_PREFIX_DISCOVER + "gerald")); + } + + public static HashMap getRecipes() { + HashMap recipes = new HashMap(); + + for(GenericRecipe recipe : INSTANCE.recipeOrderedList) { + List input = new ArrayList(); + if(recipe.inputItem != null) for(AStack stack : recipe.inputItem) input.add(stack); + if(recipe.inputFluid != null) for(FluidStack stack : recipe.inputFluid) input.add(ItemFluidIcon.make(stack)); + List output = new ArrayList(); + if(recipe.outputItem != null) for(IOutput stack : recipe.outputItem) output.add(stack.getAllPossibilities()); + recipes.put(input.toArray(), output.toArray()); + } + + return recipes; + } +} diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 374b28ba8..610786c2a 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -488,6 +488,7 @@ public class ClientProxy extends ServerProxy { double[] tir = new double[] {0, 0, 0}; double[] sir = new double[] {1, 1, 1}; + MinecraftForgeClient.registerItemRenderer(ModItems.steel_sword, new ItemRenderTransformer(rtp, ttp_high, stp, rfp, tfp, sfp, rir, tir, sir)); MinecraftForgeClient.registerItemRenderer(ModItems.titanium_sword, new ItemRenderTransformer(rtp, ttp_high, stp, rfp, tfp, sfp, rir, tir, sir)); MinecraftForgeClient.registerItemRenderer(ModItems.alloy_sword, new ItemRenderTransformer(rtp, ttp_high, stp, rfp, tfp, sfp, rir, tir, sir)); MinecraftForgeClient.registerItemRenderer(ModItems.desh_sword, new ItemRenderTransformer(rtp, ttp_low, stp, rfp, tfp, sfp, rir, tir, sir)); diff --git a/src/main/java/com/hbm/module/machine/ModuleMachinePlasma.java b/src/main/java/com/hbm/module/machine/ModuleMachinePlasma.java new file mode 100644 index 000000000..0e4de9b3a --- /dev/null +++ b/src/main/java/com/hbm/module/machine/ModuleMachinePlasma.java @@ -0,0 +1,37 @@ +package com.hbm.module.machine; + +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.recipes.PlasmaForgeRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.inventory.recipes.loader.GenericRecipes; +import com.hbm.util.BobMathUtil; + +import api.hbm.energymk2.IEnergyHandlerMK2; +import net.minecraft.item.ItemStack; + +public class ModuleMachinePlasma extends ModuleMachineBase { + + public ModuleMachinePlasma(int index, IEnergyHandlerMK2 battery, ItemStack[] slots) { + super(index, battery, slots); + this.inputSlots = new int[12]; + this.outputSlots = new int[1]; + this.inputTanks = new FluidTank[1]; + this.outputTanks = new FluidTank[0]; + } + + @Override + public GenericRecipes getRecipeSet() { + return PlasmaForgeRecipes.INSTANCE; + } + + @Override + public void setupTanks(GenericRecipe recipe) { + super.setupTanks(recipe); + if(recipe == null) return; + for(int i = 0; i < inputTanks.length; i++) if(recipe.inputFluid != null && recipe.inputFluid.length > i) inputTanks[i].changeTankSize(BobMathUtil.max(inputTanks[i].getFill(), recipe.inputFluid[i].fill * 2, 16_000)); + } + + public ModuleMachinePlasma itemInput(int from) { for(int i = 0; i < inputSlots.length; i++) inputSlots[i] = from + i; return this; } + public ModuleMachinePlasma itemOutput(int a) { outputSlots[0] = a; return this; } + public ModuleMachinePlasma fluidInput(FluidTank a) { inputTanks[0] = a; return this; } +} diff --git a/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionPlasmaForge.java b/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionPlasmaForge.java index 830057d3d..36e103dd1 100644 --- a/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionPlasmaForge.java +++ b/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionPlasmaForge.java @@ -1,7 +1,131 @@ package com.hbm.tileentity.machine.fusion; -import net.minecraft.tileentity.TileEntity; +import com.hbm.interfaces.IControlReceiver; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.recipes.PlasmaForgeRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.items.ModItems; +import com.hbm.lib.Library; +import com.hbm.module.machine.ModuleMachinePlasma; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BobMathUtil; +import com.hbm.util.fauxpointtwelve.DirPos; -public class TileEntityFusionPlasmaForge extends TileEntity { +import api.hbm.energymk2.IEnergyReceiverMK2; +import api.hbm.fluidmk2.IFluidStandardReceiverMK2; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +public class TileEntityFusionPlasmaForge extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardReceiverMK2, IControlReceiver, IGUIProvider { + + public FluidTank inputTank; + + public long power; + public long maxPower = 10_000_000; + + public ModuleMachinePlasma plasmaModule; + + public TileEntityFusionPlasmaForge() { + super(16); + this.inputTank = new FluidTank(Fluids.NONE, 16_000); + + this.plasmaModule = new ModuleMachinePlasma(0, this, slots) + .itemInput(3).itemOutput(15).fluidInput(inputTank); + } + + @Override + public String getName() { + return "container.machinePlasmaForge"; + } + + @Override + public void updateEntity() { + + if(maxPower <= 0) this.maxPower = 1_000_000; + + if(!worldObj.isRemote) { + + GenericRecipe recipe = PlasmaForgeRecipes.INSTANCE.recipeNameMap.get(plasmaModule.recipe); + if(recipe != null) this.maxPower = recipe.power * 100; + + this.maxPower = BobMathUtil.max(this.power, this.maxPower, 100_000); + this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); + + for(DirPos pos : getConPos()) { + this.trySubscribe(worldObj, pos); + if(inputTank.getTankType() != Fluids.NONE) this.trySubscribe(inputTank.getTankType(), worldObj, pos); + } + } + } + + public DirPos[] getConPos() { + return new DirPos[] { + + }; + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) { + if(slot == 0) return true; // battery + if(slot == 1 && stack.getItem() == ModItems.blueprints) return true; + // TODO booster material + if(this.plasmaModule.isItemValid(slot, stack)) return true; // recipe input crap + return false; + } + + @Override + public boolean canExtractItem(int i, ItemStack itemStack, int j) { + return i == 15 || this.plasmaModule.isSlotClogged(i); + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + return new int[] {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; + } + + @Override public long getPower() { return power; } + @Override public void setPower(long power) { this.power = power; } + @Override public long getMaxPower() { return maxPower; } + + @Override public FluidTank[] getReceivingTanks() { return new FluidTank[] {inputTank}; } + @Override public FluidTank[] getAllTanks() { return new FluidTank[] {inputTank}; } + + @Override public boolean hasPermission(EntityPlayer player) { return this.isUseableByPlayer(player); } + + @Override + public void receiveControl(NBTTagCompound data) { + + } + + AxisAlignedBB bb = null; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + if(bb == null) bb = AxisAlignedBB.getBoundingBox(xCoord - 5, yCoord, zCoord - 5, xCoord + 5, yCoord + 6, zCoord + 6); + return bb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return null; + } + + @Override + public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return null; + } } diff --git a/src/main/resources/assets/hbm/textures/gui/reactors/gui_fusion_plasmaforge.png b/src/main/resources/assets/hbm/textures/gui/reactors/gui_fusion_plasmaforge.png new file mode 100644 index 0000000000000000000000000000000000000000..ed940ab4fd58838dd3472be2a7e0d3cd976a132a GIT binary patch literal 7226 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