From db3f58b4cd585d8decdc4996aeb7c319d32084c6 Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 9 Oct 2025 16:57:31 +0200 Subject: [PATCH] just throw a continental breakfast at my face --- changelog | 3 + .../container/ContainerCraneExtractor.java | 4 +- .../hbm/inventory/gui/GUICraneExtractor.java | 23 ++++-- .../hbm/inventory/gui/GUICraneInserter.java | 12 +++ src/main/java/com/hbm/items/ModItems.java | 2 + .../weapon/sedna/factory/XFactoryTool.java | 12 +++ .../items/weapon/sedna/impl/ItemGunDrill.java | 78 ++++++++++++++++++ .../network/TileEntityCraneExtractor.java | 22 ++++- .../gui/storage/gui_crane_ejector.png | Bin 2756 -> 3287 bytes 9 files changed, 144 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/hbm/items/weapon/sedna/impl/ItemGunDrill.java diff --git a/changelog b/changelog index 868af6d84..1f85ec8e0 100644 --- a/changelog +++ b/changelog @@ -8,6 +8,9 @@ * The multi ID now changes metadata based on the selected fluid type, allowing it to be usable for crafting pre-defined pipes * The multi ID fluid selector now displays fluid traits in addition to the name when hovering over an icon * Added more values to the data table returned by RBMK consoles via OC integration +* The conveyor ejector now has a "only take maximum possible" toggle + * Enabling this means that, if stack ejection upgrades are installed, only stacks that meet the limit can be ejected + * Items with a lower maximum stacksize will be ejected regardless ## Fixed * Fixed the T-51b set not having radiation resistance diff --git a/src/main/java/com/hbm/inventory/container/ContainerCraneExtractor.java b/src/main/java/com/hbm/inventory/container/ContainerCraneExtractor.java index 1da5825e1..7dd438083 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCraneExtractor.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCraneExtractor.java @@ -26,13 +26,13 @@ public class ContainerCraneExtractor extends ContainerBase { } //buffer - addSlots(extractor,9,8,17,3,3); + addSlots(extractor, 9, 8, 17, 3, 3); //upgrades this.addSlotToContainer(new SlotUpgrade(extractor, 18, 152, 23)); this.addSlotToContainer(new SlotUpgrade(extractor, 19, 152, 47)); - playerInv(invPlayer, 8, 103, 161); + playerInv(invPlayer, 26, 103, 161); } diff --git a/src/main/java/com/hbm/inventory/gui/GUICraneExtractor.java b/src/main/java/com/hbm/inventory/gui/GUICraneExtractor.java index 18cd12019..665328d5a 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICraneExtractor.java +++ b/src/main/java/com/hbm/inventory/gui/GUICraneExtractor.java @@ -12,7 +12,6 @@ import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.network.TileEntityCraneExtractor; import net.minecraft.client.Minecraft; -import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Slot; @@ -29,7 +28,7 @@ public class GUICraneExtractor extends GuiInfoContainer { super(new ContainerCraneExtractor(invPlayer, tedf)); ejector = tedf; - this.xSize = 176; + this.xSize = 212; this.ySize = 185; } @@ -46,15 +45,25 @@ public class GUICraneExtractor extends GuiInfoContainer { } } } + + if(guiLeft + 187 <= x && guiLeft + 187 + 18 > x && guiTop + 34 < y && guiTop + 34 + 18 >= y) { + this.func_146283_a(Arrays.asList(new String[] { "Only take maximum possible: " + (ejector.maxEject ? EnumChatFormatting.GREEN + "ON" : EnumChatFormatting.RED + "OFF") }), x, y); + } } @Override protected void mouseClicked(int x, int y, int i) { super.mouseClicked(x, y, i); - if(guiLeft + 128 <= x && guiLeft + 128 + 14 > x && guiTop + 30 < y && guiTop + 30 + 26 >= y) { + if(guiLeft + 187 <= x && guiLeft + 187 + 18 > x && guiTop + 34 < y && guiTop + 34 + 18 >= y) { + click(); + NBTTagCompound data = new NBTTagCompound(); + data.setBoolean("maxEject", true); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, ejector.xCoord, ejector.yCoord, ejector.zCoord)); + } - mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + if(guiLeft + 128 <= x && guiLeft + 128 + 14 > x && guiTop + 30 < y && guiTop + 30 + 26 >= y) { + click(); NBTTagCompound data = new NBTTagCompound(); data.setBoolean("whitelist", true); PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, ejector.xCoord, ejector.yCoord, ejector.zCoord)); @@ -74,10 +83,12 @@ public class GUICraneExtractor extends GuiInfoContainer { Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + if(ejector.maxEject) drawTexturedModalRect(guiLeft + 187, guiTop + 34, 212, 0, 18, 18); + if(ejector.isWhitelist) { - drawTexturedModalRect(guiLeft + 139, guiTop + 33, 176, 0, 3, 6); + drawTexturedModalRect(guiLeft + 139, guiTop + 33, 212, 18, 3, 6); } else { - drawTexturedModalRect(guiLeft + 139, guiTop + 47, 176, 0, 3, 6); + drawTexturedModalRect(guiLeft + 139, guiTop + 47, 212, 18, 3, 6); } } } diff --git a/src/main/java/com/hbm/inventory/gui/GUICraneInserter.java b/src/main/java/com/hbm/inventory/gui/GUICraneInserter.java index a4890ae00..87ecd1917 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICraneInserter.java +++ b/src/main/java/com/hbm/inventory/gui/GUICraneInserter.java @@ -1,5 +1,7 @@ package com.hbm.inventory.gui; +import java.util.Arrays; + import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerCraneInserter; @@ -13,6 +15,7 @@ import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; public class GUICraneInserter extends GuiInfoContainer { @@ -27,6 +30,15 @@ public class GUICraneInserter extends GuiInfoContainer { this.xSize = 176; this.ySize = 185; } + + @Override + public void drawScreen(int x, int y, float interp) { + super.drawScreen(x, y, interp); + + if(guiLeft + 151 <= x && guiLeft + 151 + 18 > x && guiTop + 34 < y && guiTop + 34 + 18 >= y) { + this.func_146283_a(Arrays.asList(new String[] { "Destroy overflow: " + (inserter.destroyer ? EnumChatFormatting.GREEN + "ON" : EnumChatFormatting.RED + "OFF") }), x, y); + } + } @Override protected void mouseClicked(int x, int y, int i) { diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 6d8d05db8..6dee7b14a 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1480,6 +1480,7 @@ public class ModItems { public static Item gun_double_barrel_sacred_dragon; public static Item gun_n_i_4_n_i; public static Item gun_charge_thrower; + public static Item gun_drill; public static Item ammo_standard; public static Item ammo_secret; @@ -6417,6 +6418,7 @@ public class ModItems { GameRegistry.registerItem(gun_fireext, gun_fireext.getUnlocalizedName()); GameRegistry.registerItem(gun_charge_thrower, gun_charge_thrower.getUnlocalizedName()); + GameRegistry.registerItem(gun_drill, gun_drill.getUnlocalizedName()); GameRegistry.registerItem(ammo_standard, ammo_standard.getUnlocalizedName()); GameRegistry.registerItem(ammo_secret, ammo_secret.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryTool.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryTool.java index 3237bd1d0..5fbd2d7e5 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryTool.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryTool.java @@ -24,6 +24,7 @@ import com.hbm.items.weapon.sedna.ItemGunBaseNT.LambdaContext; import com.hbm.items.weapon.sedna.ItemGunBaseNT.WeaponQuality; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; import com.hbm.items.weapon.sedna.impl.ItemGunChargeThrower; +import com.hbm.items.weapon.sedna.impl.ItemGunDrill; import com.hbm.items.weapon.sedna.mags.MagazineFullReload; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; @@ -275,6 +276,17 @@ public class XFactoryTool { .setupStandardConfiguration() .anim(LAMBDA_CT_ANIMS).orchestra(Orchestras.ORCHESTRA_CHARGE_THROWER) ).setUnlocalizedName("gun_charge_thrower"); + + ModItems.gun_drill = new ItemGunDrill(WeaponQuality.UTILITY, new GunConfig() + .dura(3_000).draw(10).inspect(55).reloadChangeType(true).hideCrosshair(false).crosshair(Crosshair.L_CIRCUMFLEX) + .rec(new Receiver(0) + .dmg(10F).delay(4).dry(10).auto(true).spread(0F).spreadHipfire(0F).reload(60).jam(0).sound("hbm:weapon.fire.grenade", 1.0F, 1.0F) + .mag(new MagazineFullReload(0, 1).addConfigs(ct_hook, ct_mortar, ct_mortar_charge)) + .offset(1, -0.0625 * 2.5, -0.25D) + .setupStandardFire()) + .setupStandardConfiguration() + //.anim(LAMBDA_CT_ANIMS).orchestra(Orchestras.ORCHESTRA_CHARGE_THROWER) + ).setUnlocalizedName("gun_drill"); } public static BiConsumer LAMBDA_RECOIL_CT = (stack, ctx) -> { diff --git a/src/main/java/com/hbm/items/weapon/sedna/impl/ItemGunDrill.java b/src/main/java/com/hbm/items/weapon/sedna/impl/ItemGunDrill.java new file mode 100644 index 000000000..3a888903d --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/impl/ItemGunDrill.java @@ -0,0 +1,78 @@ +package com.hbm.items.weapon.sedna.impl; + +import com.hbm.inventory.fluid.FluidType; +import com.hbm.items.weapon.sedna.GunConfig; +import com.hbm.items.weapon.sedna.ItemGunBaseNT; + +import api.hbm.energymk2.IBatteryItem; +import api.hbm.fluidmk2.IFillableItem; +import net.minecraft.item.ItemStack; + +public class ItemGunDrill extends ItemGunBaseNT implements IFillableItem, IBatteryItem { + + public ItemGunDrill(WeaponQuality quality, GunConfig... cfg) { + super(quality, cfg); + } + + @Override + public boolean acceptsFluid(FluidType type, ItemStack stack) { + return false; + } + + @Override + public int tryFill(FluidType type, int amount, ItemStack stack) { + return 0; + } + + @Override public boolean providesFluid(FluidType type, ItemStack stack) { return false; } + + @Override + public int tryEmpty(FluidType type, int amount, ItemStack stack) { + return 0; + } + + @Override + public FluidType getFirstFluidType(ItemStack stack) { + return null; + } + + @Override + public int getFill(ItemStack stack) { + return 0; + } + + @Override + public void chargeBattery(ItemStack stack, long i) { + + } + + @Override + public void setCharge(ItemStack stack, long i) { + + } + + @Override + public void dischargeBattery(ItemStack stack, long i) { + + } + + @Override + public long getCharge(ItemStack stack) { + return 0; + } + + @Override + public long getMaxCharge(ItemStack stack) { + return 0; + } + + @Override + public long getChargeRate() { + return 0; + } + + @Override + public long getDischargeRate() { + return 0; + } +} diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java b/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java index 804c42321..d57e98720 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java @@ -31,6 +31,7 @@ import net.minecraftforge.common.util.ForgeDirection; public class TileEntityCraneExtractor extends TileEntityCraneBase implements IGUIProvider, IControlReceiverFilter { public boolean isWhitelist = false; + public boolean maxEject = false; public ModulePatternMatcher matcher; public TileEntityCraneExtractor() { @@ -113,8 +114,10 @@ public class TileEntityCraneExtractor extends TileEntityCraneBase implements IGU int index = access == null ? i : access[i]; ItemStack stack = inv.getStackInSlot(index); - if(stack != null && (sided == null || sided.canExtractItem(index, stack, inputSide.getOpposite().ordinal()))){ - + if(stack != null && (sided == null || sided.canExtractItem(index, stack, inputSide.getOpposite().ordinal()))) { + + int maxTarget = Math.min(amount, stack.getMaxStackSize()); + if(this.maxEject && stack.stackSize < maxTarget) continue; boolean match = this.matchesFilter(stack); if((isWhitelist && match) || (!isWhitelist && !match)) { @@ -146,6 +149,9 @@ public class TileEntityCraneExtractor extends TileEntityCraneBase implements IGU if(stack != null){ stack = stack.copy(); int toSend = Math.min(amount, stack.stackSize); + + int maxTarget = Math.min(amount, stack.getMaxStackSize()); + if(this.maxEject && stack.stackSize < maxTarget) continue; decrStackSize(i, toSend); stack.stackSize = toSend; @@ -169,7 +175,7 @@ public class TileEntityCraneExtractor extends TileEntityCraneBase implements IGU moving.setItemStack(stack); worldObj.spawnEntityInWorld(moving); - if (belt instanceof IEnterableBlock) { + if(belt instanceof IEnterableBlock) { IEnterableBlock enterable = (IEnterableBlock) belt; if(enterable.canItemEnter(worldObj, xCoord + outputSide.offsetX, yCoord + outputSide.offsetY, zCoord + outputSide.offsetZ, outputSide.getOpposite(), moving)) { @@ -183,6 +189,7 @@ public class TileEntityCraneExtractor extends TileEntityCraneBase implements IGU public void serialize(ByteBuf buf) { super.serialize(buf); buf.writeBoolean(isWhitelist); + buf.writeBoolean(maxEject); this.matcher.serialize(buf); } @@ -190,6 +197,7 @@ public class TileEntityCraneExtractor extends TileEntityCraneBase implements IGU public void deserialize(ByteBuf buf) { super.deserialize(buf); isWhitelist = buf.readBoolean(); + maxEject = buf.readBoolean(); this.matcher.deserialize(buf); } @@ -250,6 +258,7 @@ public class TileEntityCraneExtractor extends TileEntityCraneBase implements IGU public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.isWhitelist = nbt.getBoolean("isWhitelist"); + this.maxEject = nbt.getBoolean("maxEject"); this.matcher.readFromNBT(nbt); } @@ -257,6 +266,7 @@ public class TileEntityCraneExtractor extends TileEntityCraneBase implements IGU public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setBoolean("isWhitelist", this.isWhitelist); + nbt.setBoolean("maxEject", this.maxEject); this.matcher.writeToNBT(nbt); } @@ -270,14 +280,18 @@ public class TileEntityCraneExtractor extends TileEntityCraneBase implements IGU if(data.hasKey("whitelist")) { this.isWhitelist = !this.isWhitelist; } + if(data.hasKey("maxEject")) { + this.maxEject = !this.maxEject; + } if(data.hasKey("slot")){ setFilterContents(data); } + this.markDirty(); } @Override public int[] getFilterSlots() { - return new int[]{0,9}; + return new int[] {0, 9}; } } diff --git a/src/main/resources/assets/hbm/textures/gui/storage/gui_crane_ejector.png b/src/main/resources/assets/hbm/textures/gui/storage/gui_crane_ejector.png index a8905fe305646753aae87bf22e3e992ae5c662fd..0b5283311aaaeb097106be2302251cffd51f32c1 100644 GIT binary patch literal 3287 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