From b9787fa08e562b041dbdaedaba10fc674514045a Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 7 Nov 2024 15:50:14 +0100 Subject: [PATCH] the mechanism --- changelog | 1 + .../container/ContainerMachineAmmoPress.java | 17 ++- .../inventory/gui/GUIMachineAmmoPress.java | 61 ++++++--- .../hbm/inventory/gui/GuiInfoContainer.java | 6 + .../inventory/recipes/AmmoPressRecipes.java | 125 ++++++++++++++---- .../weapon/sedna/factory/GunFactory.java | 2 +- .../sedna/factory/GunFactoryClient.java | 4 +- .../weapon/sedna/factory/LegoClient.java | 10 +- .../weapon/sedna/factory/XFactory40mm.java | 9 +- .../machine/TileEntityMachineAmmoPress.java | 69 +++++++++- .../machine/TileEntityMachineWoodBurner.java | 2 + .../assets/hbm/textures/items/ammo.png | Bin 14728 -> 14833 bytes .../items/ammo_standard.g26_flare_supply.png | Bin 0 -> 237 bytes .../items/ammo_standard.g26_flare_weapon.png | Bin 0 -> 235 bytes 14 files changed, 246 insertions(+), 60 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/items/ammo_standard.g26_flare_supply.png create mode 100644 src/main/resources/assets/hbm/textures/items/ammo_standard.g26_flare_weapon.png diff --git a/changelog b/changelog index d7a485e02..5c4f38227 100644 --- a/changelog +++ b/changelog @@ -66,3 +66,4 @@ * Fixed empty particle capsules not being extractable from the ICF pellet maker * Fixed issue regarding mass storage filters when using GTNH-NEI * Fixed DFC emitters calculating their original 98% inefficiency twice when hitting another emitter or tungsten crate +* Fixed the wood burner destroying container items like buckets when using lava as fuel diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineAmmoPress.java b/src/main/java/com/hbm/inventory/container/ContainerMachineAmmoPress.java index 6ca5459c7..1dbe82ef2 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineAmmoPress.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineAmmoPress.java @@ -1,6 +1,8 @@ package com.hbm.inventory.container; import com.hbm.inventory.SlotCraftingOutput; +import com.hbm.inventory.recipes.AmmoPressRecipes; +import com.hbm.inventory.recipes.AmmoPressRecipes.AmmoPressRecipe; import com.hbm.tileentity.machine.TileEntityMachineAmmoPress; import net.minecraft.entity.player.EntityPlayer; @@ -49,9 +51,20 @@ public class ContainerMachineAmmoPress extends Container { return null; } } else { - if(!this.mergeItemStack(stack, 0, 9, false)) { - return null; + + if(press.selectedRecipe < 0 || press.selectedRecipe >= AmmoPressRecipes.recipes.size()) return null; + AmmoPressRecipe recipe = AmmoPressRecipes.recipes.get(press.selectedRecipe); + + for(int i = 0; i < 9; i++) { + if(recipe.input[i] == null) continue; + if(recipe.input[i].matchesRecipe(stack, true)) { + if(!this.mergeItemStack(stack, i, i + 1, false)) { + return null; + } + } } + + return null; } if(stack.stackSize == 0) { diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineAmmoPress.java b/src/main/java/com/hbm/inventory/gui/GUIMachineAmmoPress.java index 4c45aa15a..9c1c8e2cd 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineAmmoPress.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineAmmoPress.java @@ -19,7 +19,6 @@ import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.TileEntityMachineAmmoPress; import net.minecraft.client.Minecraft; -import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiTextField; import net.minecraft.client.renderer.OpenGlHelper; @@ -30,7 +29,6 @@ import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.oredict.OreDictionary; public class GUIMachineAmmoPress extends GuiInfoContainer { @@ -99,7 +97,7 @@ public class GUIMachineAmmoPress extends GuiInfoContainer { private void resetPaging() { this.index = 0; - this.size = Math.max(0, (int)Math.ceil((this.recipes.size() - 12) / 2D)); + this.size = Math.max(0, (int)Math.ceil((this.recipes.size() - 12) / 3D)); } @Override @@ -123,6 +121,21 @@ public class GUIMachineAmmoPress extends GuiInfoContainer { if(scroll < 0 && this.index < this.size) this.index++; } } + + for(int i = index * 3; i < index * 3 + 12; i++) { + + if(i >= this.recipes.size()) + break; + + int ind = i - index * 3; + + int ix = 16 + 18 * (ind / 3); + int iy = 17 + 18 * (ind % 3); + if(guiLeft + ix <= x && guiLeft + ix + 18 > x && guiTop + iy < y && guiTop + iy + 18 >= y) { + AmmoPressRecipe recipe = this.recipes.get(i); + this.renderToolTip(recipe.output, x, y); + } + } } @Override @@ -132,13 +145,13 @@ public class GUIMachineAmmoPress extends GuiInfoContainer { this.search.mouseClicked(x, y, k); if(guiLeft + 7 <= x && guiLeft + 7 + 9 > x && guiTop + 17 < y && guiTop + 17 + 54 >= y) { - mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + click(); if(this.index > 0) this.index--; return; } if(guiLeft + 88 <= x && guiLeft + 88 + 9 > x && guiTop + 17 < y && guiTop + 17 + 54 >= y) { - mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + click(); if(this.index < this.size) this.index++; return; } @@ -164,7 +177,7 @@ public class GUIMachineAmmoPress extends GuiInfoContainer { NBTTagCompound data = new NBTTagCompound(); data.setInteger("selection", this.selection); PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, press.xCoord, press.yCoord, press.zCoord)); - mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + click(); return; } } @@ -208,11 +221,12 @@ public class GUIMachineAmmoPress extends GuiInfoContainer { AmmoPressRecipe recipe = recipes.get(i); FontRenderer font = null; - if (recipe.output != null) font = recipe.output.getItem().getFontRenderer(recipe.output); - if (font == null) font = fontRendererObj; + if(recipe.output != null) font = recipe.output.getItem().getFontRenderer(recipe.output); + if(font == null) font = fontRendererObj; itemRender.zLevel = 100.0F; itemRender.renderItemAndEffectIntoGUI(font, this.mc.getTextureManager(), recipe.output, guiLeft + 17 + 18 * (ind / 3), guiTop + 18 + 18 * (ind % 3)); + itemRender.zLevel = 0.0F; GL11.glEnable(GL11.GL_ALPHA_TEST); @@ -224,6 +238,12 @@ public class GUIMachineAmmoPress extends GuiInfoContainer { this.drawTexturedModalRect(guiLeft + 16 + 18 * (ind / 3), guiTop + 17 + 18 * (ind % 3), 194, 0, 18, 18); else this.drawTexturedModalRect(guiLeft + 16 + 18 * (ind / 3), guiTop + 17 + 18 * (ind % 3), 212, 0, 18, 18); + + GL11.glPushMatrix(); + GL11.glTranslated(guiLeft + 17 + 18 * (ind / 3) + 8, guiTop + 18 + 18 * (ind % 3) + 8, 0); + GL11.glScaled(0.5, 0.5, 1); + itemRender.renderItemOverlayIntoGUI(font, this.mc.getTextureManager(), recipe.output, 0, 0, recipe.output.stackSize + ""); + GL11.glPopMatrix(); } if(selection >= 0 && selection < AmmoPressRecipes.recipes.size()) { @@ -232,6 +252,7 @@ public class GUIMachineAmmoPress extends GuiInfoContainer { for(int i = 0; i < 9; i++) { AStack stack = recipe.input[i]; if(stack == null) continue; + if(press.slots[i] != null) continue; List inputs = stack.extractForNEI(); ItemStack input = inputs.get((int) (Math.abs(System.currentTimeMillis() / 1000) % inputs.size())); @@ -239,22 +260,26 @@ public class GUIMachineAmmoPress extends GuiInfoContainer { GL11.glDisable(GL11.GL_LIGHTING); GL11.glEnable(GL12.GL_RESCALE_NORMAL); + FontRenderer font = input.getItem().getFontRenderer(input); + if(font == null) font = fontRendererObj; + itemRender.zLevel = 10.0F; - itemRender.renderItemAndEffectIntoGUI(input.getItem().getFontRenderer(input), this.mc.getTextureManager(), input, guiLeft + 116 + 18 * (i % 3), guiTop + 18 + 18 * (i / 3)); + itemRender.renderItemAndEffectIntoGUI(font, this.mc.getTextureManager(), input, guiLeft + 116 + 18 * (i % 3), guiTop + 18 + 18 * (i / 3)); + itemRender.renderItemOverlayIntoGUI(font, this.mc.getTextureManager(), input, guiLeft + 116 + 18 * (i % 3), guiTop + 18 + 18 * (i / 3), input.stackSize > 1 ? (input.stackSize + "") : null); itemRender.zLevel = 0.0F; GL11.glEnable(GL11.GL_ALPHA_TEST); GL11.glDisable(GL11.GL_LIGHTING); - } - Minecraft.getMinecraft().getTextureManager().bindTexture(texture); - this.zLevel = 300.0F; - OpenGlHelper.glBlendFunc(770, 771, 1, 0); - GL11.glColor4f(1F, 1F, 1F, 0.5F); - GL11.glEnable(GL11.GL_BLEND); - drawTexturedModalRect(guiLeft + 116, guiTop + 18, 116, 18, 54, 54); - GL11.glColor4f(1F, 1F, 1F, 1F); - GL11.glDisable(GL11.GL_BLEND); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + this.zLevel = 300.0F; + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glColor4f(1F, 1F, 1F, 0.5F); + GL11.glEnable(GL11.GL_BLEND); + drawTexturedModalRect(guiLeft + 116 + 18 * (i % 3), guiTop + 18+ 18 * (i / 3), 116 + 18 * (i % 3), 18+ 18 * (i / 3), 18, 18); + GL11.glColor4f(1F, 1F, 1F, 1F); + GL11.glDisable(GL11.GL_BLEND); + } } this.search.drawTextBox(); diff --git a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java index c77fcd6b9..5499a16fe 100644 --- a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java +++ b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java @@ -22,6 +22,7 @@ import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.renderer.RenderHelper; @@ -291,6 +292,11 @@ public abstract class GuiInfoContainer extends GuiContainer implements INEIGuiHa GL11.glEnable(GL12.GL_RESCALE_NORMAL); } } + + public void click() { + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + } + ///NEI drag and drop support @Override @Optional.Method(modid = "NotEnoughItems") diff --git a/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java b/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java index f11bb0feb..a4ae668ba 100644 --- a/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java @@ -30,8 +30,10 @@ public class AmmoPressRecipes extends SerializableRecipe { OreDictStack lead = new OreDictStack(PB.ingot()); OreDictStack steel = new OreDictStack(STEEL.ingot()); + OreDictStack wSteel = new OreDictStack(WEAPONSTEEL.ingot()); OreDictStack copper = new OreDictStack(CU.ingot()); OreDictStack plastic = new OreDictStack(ANY_PLASTIC.ingot()); + OreDictStack uranium = new OreDictStack(U238.ingot()); OreDictStack smokeless = new OreDictStack(ANY_SMOKELESS.dust()); ComparableStack cSmall = new ComparableStack(ModItems.casing, 1, EnumCasingType.SMALL); ComparableStack cBig = new ComparableStack(ModItems.casing, 1, EnumCasingType.LARGE); @@ -41,73 +43,140 @@ public class AmmoPressRecipes extends SerializableRecipe { ComparableStack pShell = new ComparableStack(ModItems.casing, 1, EnumCasingType.BUCKSHOT); ComparableStack sShell = new ComparableStack(ModItems.casing, 1, EnumCasingType.BUCKSHOT_ADVANCED); - recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P9_SP, 8), + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.M357_SP, 8), null, lead, null, null, smokeless, null, null, cSmall, null)); - recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P9_FMJ, 8), + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.M357_FMJ, 8), null, steel, null, null, smokeless, null, null, cSmall, null)); - recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P9_JHP, 8), - plastic, copper, null, - null, smokeless, null, - null, cSmall, null)); - recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P9_JHP, 8), + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.M357_JHP, 8), plastic, copper, null, null, smokeless, null, null, cSmall, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.M357_AP, 8), + null, wSteel, null, + null, smokeless.copy(2), null, + null, sSmall, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.M357_EXPRESS, 8), + null, steel, null, + null, smokeless.copy(3), null, + null, cSmall, null)); - recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P9_SP, 8), + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.M44_SP, 6), null, lead, null, null, smokeless, null, null, cSmall, null)); - recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P9_FMJ, 8), + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.M44_FMJ, 6), null, steel, null, null, smokeless, null, null, cSmall, null)); - recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P9_JHP, 8), - plastic, copper, null, - null, smokeless, null, - null, cSmall, null)); - recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P9_JHP, 8), + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.M44_JHP, 6), plastic, copper, null, null, smokeless, null, null, cSmall, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.M44_AP, 6), + null, wSteel, null, + null, smokeless.copy(2), null, + null, sSmall, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.M44_EXPRESS, 6), + null, steel, null, + null, smokeless.copy(3), null, + null, cSmall, null)); - recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P9_SP, 8), + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P22_SP, 24), null, lead, null, null, smokeless, null, null, cSmall, null)); - recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P9_FMJ, 8), + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P22_FMJ, 24), null, steel, null, null, smokeless, null, null, cSmall, null)); - recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P9_JHP, 8), - plastic, copper, null, - null, smokeless, null, - null, cSmall, null)); - recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P9_JHP, 8), + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P22_JHP, 24), plastic, copper, null, null, smokeless, null, null, cSmall, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P22_AP, 24), + null, wSteel, null, + null, smokeless.copy(2), null, + null, sSmall, null)); - recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P9_SP, 8), + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P9_SP, 12), null, lead, null, null, smokeless, null, null, cSmall, null)); - recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P9_FMJ, 8), + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P9_FMJ, 12), null, steel, null, null, smokeless, null, null, cSmall, null)); - recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P9_JHP, 8), - plastic, copper, null, - null, smokeless, null, - null, cSmall, null)); - recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P9_JHP, 8), + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P9_JHP, 12), plastic, copper, null, null, smokeless, null, null, cSmall, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P9_AP, 12), + null, wSteel, null, + null, smokeless.copy(2), null, + null, sSmall, null)); + + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.R556_SP, 16), + null, lead.copy(2), null, + null, smokeless.copy(2), null, + null, cSmall.copy(2), null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.R556_FMJ, 16), + null, steel.copy(2), null, + null, smokeless.copy(2), null, + null, cSmall.copy(2), null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.R556_JHP, 16), + plastic, copper.copy(2), null, + null, smokeless.copy(2), null, + null, cSmall.copy(2), null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.R556_AP, 16), + null, wSteel.copy(2), null, + null, smokeless.copy(4), null, + null, sSmall.copy(2), null)); + + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.R762_SP, 12), + null, lead.copy(2), null, + null, smokeless.copy(2), null, + null, cSmall.copy(2), null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.R762_FMJ, 12), + null, steel.copy(2), null, + null, smokeless.copy(2), null, + null, cSmall.copy(2), null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.R762_JHP, 12), + plastic, copper.copy(2), null, + null, smokeless.copy(2), null, + null, cSmall.copy(2), null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.R762_AP, 12), + null, wSteel.copy(2), null, + null, smokeless.copy(4), null, + null, sSmall.copy(2), null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.R762_DU, 12), + null, uranium.copy(2), null, + null, smokeless.copy(4), null, + null, sSmall.copy(2), null)); + + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.BMG50_SP, 12), + null, lead.copy(2), null, + null, smokeless.copy(3), null, + null, cBig, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.BMG50_FMJ, 12), + null, steel.copy(2), null, + null, smokeless.copy(3), null, + null, cBig, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.BMG50_JHP, 12), + plastic, copper.copy(2), null, + null, smokeless.copy(3), null, + null, cBig, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.BMG50_AP, 12), + null, wSteel.copy(2), null, + null, smokeless.copy(6), null, + null, sBig, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.BMG50_DU, 12), + null, uranium.copy(2), null, + null, smokeless.copy(6), null, + null, sBig, null)); } @Override diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java index f96cb449a..49e3fefc1 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java @@ -74,7 +74,7 @@ public class GunFactory { R762_SP, R762_FMJ, R762_JHP, R762_AP, R762_DU, BMG50_SP, BMG50_FMJ, BMG50_JHP, BMG50_AP, BMG50_DU, G12_BP, G12_BP_MAGNUM, G12_BP_SLUG, G12, G12_SLUG, G12_FLECHETTE, G12_MAGNUM, G12_EXPLOSIVE, G12_PHOSPHORUS, G12_ANTHRAX, - G26_FLARE, + G26_FLARE, G26_FLARE_SUPPLY, G26_FLARE_WEAPON, G40_HE, G40_HEAT, G40_DEMO, G40_INC, G40_PHOSPHORUS, ROCKET_HE, ROCKET_HEAT, ROCKET_DEMO, ROCKET_INC, ROCKET_PHOSPHORUS, FLAME_DIESEL, FLAME_GAS, FLAME_NAPALM, FLAME_BALEFIRE, diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java index d65646e31..a5364c41e 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java @@ -122,8 +122,10 @@ public class GunFactoryClient { g12_phosphorus.setRenderer(LegoClient.RENDER_AP_BULLET); g12_anthrax.setRenderer(LegoClient.RENDER_STANDARD_BULLET); g12_equestrian.setRenderer(LegoClient.RENDER_LEGENDARY_BULLET); - + g26_flare.setRenderer(LegoClient.RENDER_FLARE); + g26_flare_supply.setRenderer(LegoClient.RENDER_FLARE_SUPPLY); + g26_flare_weapon.setRenderer(LegoClient.RENDER_FLARE_WEAPON); setRendererBulk(LegoClient.RENDER_GRENADE, g40_he, g40_heat, g40_demo, g40_inc); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java b/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java index 76a4bea17..7d3d7134d 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java @@ -115,8 +115,12 @@ public class LegoClient { GL11.glEnable(GL11.GL_TEXTURE_2D); } + public static BiConsumer RENDER_FLARE = (bullet, interp) -> { renderFlare(bullet, interp, 1F, 0.5F, 0.5F); }; + public static BiConsumer RENDER_FLARE_SUPPLY = (bullet, interp) -> { renderFlare(bullet, interp, 0.5F, 0.5F, 1F); }; + public static BiConsumer RENDER_FLARE_WEAPON = (bullet, interp) -> { renderFlare(bullet, interp, 0.5F, 1F, 0.5F); }; + private static final ResourceLocation flare = new ResourceLocation(RefStrings.MODID + ":textures/particle/flare.png"); - public static BiConsumer RENDER_FLARE = (bullet, interp) -> { + public static void renderFlare(EntityBulletBaseMK4 bullet, float interp, float r, float g, float b) { if(bullet.ticksExisted < 2) return; @@ -144,7 +148,7 @@ public class LegoClient { double posZ = 0; double scale = Math.min(5, (bullet.ticksExisted + interp - 2) * 0.5) * (0.8 + bullet.worldObj.rand.nextDouble() * 0.4); - tess.setColorRGBA_F(1F, 0.5F, 0.5F, 0.5F); + tess.setColorRGBA_F(r, g, b, 0.5F); tess.addVertexWithUV((double) (posX - f1 * scale - f3 * scale), (double) (posY - f5 * scale), (double) (posZ - f2 * scale - f4 * scale), 1, 1); tess.addVertexWithUV((double) (posX - f1 * scale + f3 * scale), (double) (posY + f5 * scale), (double) (posZ - f2 * scale + f4 * scale), 1, 0); tess.addVertexWithUV((double) (posX + f1 * scale + f3 * scale), (double) (posY + f5 * scale), (double) (posZ + f2 * scale + f4 * scale), 0, 0); @@ -166,7 +170,7 @@ public class LegoClient { GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); GL11.glDisable(GL11.GL_BLEND); GL11.glPopMatrix(); - }; + } public static BiConsumer RENDER_GRENADE = (bullet, interp) -> { GL11.glScalef(0.25F, 0.25F, 0.25F); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory40mm.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory40mm.java index b53280475..bd4e17ae1 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory40mm.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory40mm.java @@ -41,6 +41,9 @@ import net.minecraftforge.common.util.ForgeDirection; public class XFactory40mm { public static BulletConfig g26_flare; + public static BulletConfig g26_flare_supply; + public static BulletConfig g26_flare_weapon; + public static BulletConfig g40_he; public static BulletConfig g40_heat; public static BulletConfig g40_demo; @@ -99,7 +102,9 @@ public class XFactory40mm { public static void init() { - g26_flare = new BulletConfig().setItem(EnumAmmo.G26_FLARE).setLife(100).setVel(2F).setGrav(0.035D).setRenderRotations(false).setOnImpact(LAMBDA_STANDARD_IGNITE).setCasing(new SpentCasing(CasingType.STRAIGHT).setColor(0x9E1616).setScale(2F).register("G40Flare")); + g26_flare = new BulletConfig().setItem(EnumAmmo.G26_FLARE).setLife(100).setVel(2F).setGrav(0.015D).setRenderRotations(false).setOnImpact(LAMBDA_STANDARD_IGNITE).setCasing(new SpentCasing(CasingType.STRAIGHT).setColor(0x9E1616).setScale(2F).register("g26Flare")); + g26_flare_supply = new BulletConfig().setItem(EnumAmmo.G26_FLARE_SUPPLY).setLife(100).setVel(2F).setGrav(0.015D).setRenderRotations(false).setOnImpact(LAMBDA_STANDARD_IGNITE).setCasing(new SpentCasing(CasingType.STRAIGHT).setColor(0x3C80F0).setScale(2F).register("g26FlareSupply")); + g26_flare_weapon = new BulletConfig().setItem(EnumAmmo.G26_FLARE_WEAPON).setLife(100).setVel(2F).setGrav(0.015D).setRenderRotations(false).setOnImpact(LAMBDA_STANDARD_IGNITE).setCasing(new SpentCasing(CasingType.STRAIGHT).setColor(0x278400).setScale(2F).register("g26FlareWeapon")); BulletConfig g40_base = new BulletConfig().setLife(200).setVel(2F).setGrav(0.035D); g40_he = g40_base.clone().setItem(EnumAmmo.G40_HE).setOnImpact(LAMBDA_STANDARD_EXPLODE).setCasing(new SpentCasing(CasingType.STRAIGHT).setColor(0x777777).setScale(2, 2F, 1.5F).register("g40")); @@ -111,7 +116,7 @@ public class XFactory40mm { .dura(100).draw(7).inspect(39).crosshair(Crosshair.L_CIRCUMFLEX).smoke(LAMBDA_SMOKE) .rec(new Receiver(0) .dmg(15F).delay(20).reload(28).jam(33).sound("hbm:weapon.hkShoot", 1.0F, 1.0F) - .mag(new MagazineSingleReload(0, 1).addConfigs(g26_flare)) + .mag(new MagazineSingleReload(0, 1).addConfigs(g26_flare, g26_flare_supply, g26_flare_weapon)) .offset(0.75, -0.0625, -0.1875D) .setupStandardFire().recoil(Lego.LAMBDA_STANDARD_RECOIL)) .setupStandardConfiguration() diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAmmoPress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAmmoPress.java index 1b5ee0f0c..759f7c625 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAmmoPress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAmmoPress.java @@ -3,6 +3,8 @@ package com.hbm.tileentity.machine; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerMachineAmmoPress; import com.hbm.inventory.gui.GUIMachineAmmoPress; +import com.hbm.inventory.recipes.AmmoPressRecipes; +import com.hbm.inventory.recipes.AmmoPressRecipes.AmmoPressRecipe; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; @@ -11,6 +13,7 @@ import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; @@ -29,12 +32,68 @@ public class TileEntityMachineAmmoPress extends TileEntityMachineBase implements @Override public void updateEntity() { - if(!worldObj.isRemote) { - + this.performRecipe(); this.networkPackNT(25); } } + + // we want to update the output every time the grid changes, but producing output changes the grid again, so we just put a recursion brake on this fucker + public static boolean recipeLock = false; + + @Override + public void setInventorySlotContents(int slot, ItemStack stack) { + super.setInventorySlotContents(slot, stack); + + if(!recipeLock) { + recipeLock = true; + if(slot < 10) this.performRecipe(); + recipeLock = false; + } + } + + public void performRecipe() { + if(selectedRecipe < 0 || selectedRecipe >= AmmoPressRecipes.recipes.size()) return; + + AmmoPressRecipe recipe = AmmoPressRecipes.recipes.get(selectedRecipe); + + if(slots[9] != null) { + if(slots[9].getItem() != recipe.output.getItem()) return; + if(slots[9].getItemDamage() != recipe.output.getItemDamage()) return; + if(slots[9].stackSize + recipe.output.stackSize > slots[9].getMaxStackSize()) return; + } + + if(this.hasIngredients(recipe)) { + this.produceAmmo(recipe); + performRecipe(); + } + } + + public boolean hasIngredients(AmmoPressRecipe recipe) { + + for(int i = 0; i < 9; i++) { + if(recipe.input[i] == null && slots[i] == null) continue; + if(recipe.input[i] != null && slots[i] == null) return false; + if(recipe.input[i] == null && slots[i] != null) return false; + if(!recipe.input[i].matchesRecipe(slots[i], false)) return false; + } + + return true; + } + + //implies hasIngredients returns true, will violently explode otherwise + protected void produceAmmo(AmmoPressRecipe recipe) { + + for(int i = 0; i < 9; i++) { + if(recipe.input[i] != null) this.decrStackSize(i, recipe.input[i].stacksize); + } + + if(slots[9] == null) { + slots[9] = recipe.output.copy(); + } else { + slots[9].stackSize += recipe.output.stackSize; + } + } @Override public void serialize(ByteBuf buf) { super.serialize(buf); @@ -47,9 +106,6 @@ public class TileEntityMachineAmmoPress extends TileEntityMachineBase implements this.selectedRecipe = buf.readInt(); } - @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerMachineAmmoPress(player.inventory, this); } - @Override @SideOnly(Side.CLIENT) public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIMachineAmmoPress(player.inventory, this); } - @Override public boolean hasPermission(EntityPlayer player) { return this.isUseableByPlayer(player); @@ -62,4 +118,7 @@ public class TileEntityMachineAmmoPress extends TileEntityMachineBase implements else this.selectedRecipe = newRecipe; this.markDirty(); } + + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerMachineAmmoPress(player.inventory, this); } + @Override @SideOnly(Side.CLIENT) public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIMachineAmmoPress(player.inventory, this); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineWoodBurner.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineWoodBurner.java index 110b9eba7..c29468236 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineWoodBurner.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineWoodBurner.java @@ -95,7 +95,9 @@ public class TileEntityMachineWoodBurner extends TileEntityMachineBase implement if(processAsh(ashLevelMisc, EnumAshType.MISC, threshold)) ashLevelMisc -= threshold; this.maxBurnTime = this.burnTime = burn; + ItemStack container = slots[0].getItem().getContainerItem(slots[0]); this.decrStackSize(0, 1); + if(slots[0] == null) slots[0] = container.copy(); this.markChanged(); } } diff --git a/src/main/resources/assets/hbm/textures/items/ammo.png b/src/main/resources/assets/hbm/textures/items/ammo.png index 59ddc335f24d1d080a7b39a4eb5e80410194c7d8..5deaaa648026ccdc97121181aedaf6dce4ce8661 100644 GIT binary patch literal 14833 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