diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEFluid.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEFluid.java index fced47c1a30..e544ba91fbb 100644 --- a/src/main/java/gregtech/api/metatileentity/implementations/MTEFluid.java +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEFluid.java @@ -64,6 +64,7 @@ import gregtech.api.util.ISerializableObject; import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; import gregtech.common.GTClient; +import gregtech.common.blocks.ItemMachines; import gregtech.common.config.Other; import gregtech.common.covers.CoverDrain; import gregtech.common.covers.CoverFluidRegulator; @@ -473,6 +474,138 @@ public void blockPipeOnSide(ForgeDirection side, EntityPlayer entityPlayer, byte } } + @Override + public void onLeftclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + // Only trigger if the player is sneaking + if (!aPlayer.isSneaking()) { + return; + } + + // Retrieve the item's MetaTileEntity + final ItemStack handItem = aPlayer.inventory.getCurrentItem(); + if (handItem == null) return; + + IMetaTileEntity meta = ItemMachines.getMetaTileEntity(handItem); + if (!(meta instanceof MTEFluid handFluid)) return; + + // Preserve old connections and meta ID + byte oldConnections = this.mConnections; + short oldMetaID = (short) aBaseMetaTileEntity.getMetaTileID(); + + // Create the new fluid pipe + MTEFluid newPipe = (MTEFluid) handFluid.newMetaEntity(aBaseMetaTileEntity); + if (newPipe == null) return; + + // Preserve old connections + newPipe.mConnections = oldConnections; + newPipe.mDisableInput = this.mDisableInput; + + // Record old pipe parameters + long oldCapacity = this.mCapacity; + boolean oldGasProof = this.mGasProof; + int oldHeatResistance = this.mHeatResistance; + + // Add fluid to the new pipe + if (this.mPipeAmount <= newPipe.mPipeAmount) { + for (int i = 0; i < mPipeAmount; i++) { + if (this.mFluids[i] != null) { + newPipe.mFluids[i] = this.mFluids[i].copy(); + newPipe.mFluids[i].amount = Math.min(this.mFluids[i].amount, newPipe.mCapacity); + } + } + } + + // Update to the new pipe + aBaseMetaTileEntity.setMetaTileID((short) handItem.getItemDamage()); + aBaseMetaTileEntity.setMetaTileEntity(newPipe); + + // Construct a change message if needed + StringBuilder message = new StringBuilder(); + + // Compare capacity changes + if (oldCapacity != newPipe.mCapacity) { + message.append(oldCapacity * 20) + .append("L/seconds → "); + message.append(newPipe.mCapacity > oldCapacity ? EnumChatFormatting.GREEN : EnumChatFormatting.RED) + .append(newPipe.mCapacity * 20) + .append("L/secs") + .append(EnumChatFormatting.RESET); + } + + // Compare heat resistance + if (oldHeatResistance != newPipe.mHeatResistance) { + if (message.length() > 0) message.append(" | "); + message.append(oldHeatResistance) + .append("K → "); + message + .append(newPipe.mHeatResistance > oldHeatResistance ? EnumChatFormatting.GREEN : EnumChatFormatting.RED) + .append(newPipe.mHeatResistance) + .append("K") + .append(EnumChatFormatting.RESET); + } + + // Compare gas handling + if (oldGasProof != newPipe.mGasProof) { + if (message.length() > 0) message.append(" | "); + if (newPipe.mGasProof) { + message.append(EnumChatFormatting.GREEN) + .append("Now Gas-Proof"); + } else { + message.append(EnumChatFormatting.RED) + .append("No Longer Gas-Proof"); + } + message.append(EnumChatFormatting.RESET); + } + + // Send a chat message if anything changed + if (message.length() > 0) { + GTUtility.sendChatToPlayer( + aPlayer, + StatCollector.translateToLocal("GT5U.item.pipe.swap") + " " + message.toString()); + } + + // Force updates to sync changes + aBaseMetaTileEntity.markDirty(); + aBaseMetaTileEntity.issueTextureUpdate(); + aBaseMetaTileEntity.issueBlockUpdate(); + aBaseMetaTileEntity.issueClientUpdate(); + + // Handle inventory operations unless in creative mode + if (!aPlayer.capabilities.isCreativeMode) { + ItemStack oldPipe = new ItemStack(handItem.getItem(), 1, oldMetaID); + boolean addedToInventory = false; + + // Attempt to stack with existing items + if (oldPipe != null) { + for (int i = 0; i < aPlayer.inventory.mainInventory.length; i++) { + ItemStack slot = aPlayer.inventory.mainInventory[i]; + if (slot != null && slot.getItem() == oldPipe.getItem() + && slot.getItemDamage() == oldPipe.getItemDamage() + && slot.stackSize < slot.getMaxStackSize()) { + slot.stackSize++; + addedToInventory = true; + break; + } + } + // Add new stack if stacking failed + if (!addedToInventory) { + addedToInventory = aPlayer.inventory.addItemStackToInventory(oldPipe); + } + // If still unsuccessful, drop the item + if (!addedToInventory) { + aPlayer.dropPlayerItemWithRandomChoice(oldPipe, false); + } + } + + // Decrement the placed pipe from the player's hand + handItem.stackSize--; + if (handItem.stackSize <= 0) { + aPlayer.inventory.setInventorySlotContents(aPlayer.inventory.currentItem, null); + } + } + return; + } + @Override public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer entityPlayer, float aX, float aY, float aZ, ItemStack aTool) { diff --git a/src/main/resources/assets/gregtech/lang/en_US.lang b/src/main/resources/assets/gregtech/lang/en_US.lang index b3bd01890f1..28ec1bc9e1e 100644 --- a/src/main/resources/assets/gregtech/lang/en_US.lang +++ b/src/main/resources/assets/gregtech/lang/en_US.lang @@ -688,6 +688,7 @@ GT5U.item.pipe.gas_proof.yes=Yes GT5U.item.pipe.gas_proof.no=No GT5U.item.pipe.amount=Pipe Amount GT5U.item.pipe.empty=Empty +GT5U.item.pipe.swap=Pipe Swapped: gt.behaviour.paintspray.infinite.gui.header=Select a Color gt.behaviour.paintspray.infinite.gui.lock_error=§eSpray can is §clocked§e! §bSneak middle-click to unlock.