From c684b3830bf6eaa96e2abf2f0b9d4895f9afe764 Mon Sep 17 00:00:00 2001 From: Léa Gris Date: Wed, 3 Mar 2021 19:55:11 +0100 Subject: quickfix(ao): reset ao state after rendering tileblock Reset RenderBlock.enableAO to false after rendering Gregtech tile blocks. Minecraft makes assumption that enableAO is false when it renders a lower door panel. Leaving enableAO to true in the RenderBlock instance after rendering gregtech tile blocks caused lower door panels to randomply pick some remanent ambient occlusion colour values it should not. --- src/main/java/gregtech/common/render/GT_Renderer_Block.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/main/java/gregtech/common/render/GT_Renderer_Block.java b/src/main/java/gregtech/common/render/GT_Renderer_Block.java index 6cb161fcb8..5265be43e1 100644 --- a/src/main/java/gregtech/common/render/GT_Renderer_Block.java +++ b/src/main/java/gregtech/common/render/GT_Renderer_Block.java @@ -558,13 +558,20 @@ public class GT_Renderer_Block implements ISimpleBlockRenderingHandler { IMetaTileEntity metaTileEntity; if ((metaTileEntity = ((IGregTechTileEntity) tileEntity).getMetaTileEntity()) != null && metaTileEntity.renderInWorld(aWorld, aX, aY, aZ, aBlock, aRenderer)) { + aRenderer.enableAO = false; return true; } } - if ((tileEntity instanceof IPipeRenderedTileEntity)) { - return renderPipeBlock(aWorld, aX, aY, aZ, aBlock, (IPipeRenderedTileEntity) tileEntity, aRenderer); + if (tileEntity instanceof IPipeRenderedTileEntity && + renderPipeBlock(aWorld, aX, aY, aZ, aBlock, (IPipeRenderedTileEntity) tileEntity, aRenderer)) { + aRenderer.enableAO = false; + return true; } - return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer); + if (renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer)) { + aRenderer.enableAO = false; + return true; + } + return false; } public boolean shouldRender3DInInventory(int aModel) { -- cgit From c1e9de7731890b6a90c7ebdcd5a64152a6079007 Mon Sep 17 00:00:00 2001 From: Glease <4586901+Glease@users.noreply.github.com> Date: Thu, 4 Mar 2021 03:22:54 +0800 Subject: Allow adjusting tick rate of fluid regulator Signed-off-by: Glease <4586901+Glease@users.noreply.github.com> --- .../common/covers/GT_Cover_FluidRegulator.java | 247 +++++++++++++-------- 1 file changed, 153 insertions(+), 94 deletions(-) (limited to 'src') diff --git a/src/main/java/gregtech/common/covers/GT_Cover_FluidRegulator.java b/src/main/java/gregtech/common/covers/GT_Cover_FluidRegulator.java index 4ddc54e2a1..4fbd2ccb68 100644 --- a/src/main/java/gregtech/common/covers/GT_Cover_FluidRegulator.java +++ b/src/main/java/gregtech/common/covers/GT_Cover_FluidRegulator.java @@ -16,38 +16,78 @@ import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidHandler; +/** + * Cover variable + *
+ * 1111 1111 1111 1111 1111 1111 1111 1111
+ *  |- interval-| |- flow rate 2 compl. -|
+ * ^ export?
+ * 
+ * Concat export and flow rate 2 compl. together to get actual flow rate. + * A positive actual flow rate is export, and vice versa. + *

+ * Interval is an unsigned 11 bit integer minus 1, so the range is 1~2048. + * The stored bits will be flipped bitwise if speed is negative. + * This way, `0` means 1tick interval, while `-1` means 1 tick interval as well, preserving the legacy behavior. + */ public class GT_Cover_FluidRegulator extends GT_CoverBehavior { + private static final int SPEED_LENGTH = 20; + private static final int TICK_RATE_LENGTH = Integer.SIZE - SPEED_LENGTH - 1; + private static final int TICK_RATE_MIN = 1; + private static final int TICK_RATE_MAX = (-1 >>> (Integer.SIZE - TICK_RATE_LENGTH)) + TICK_RATE_MIN; + private static final int TICK_RATE_BITMASK = (TICK_RATE_MAX - TICK_RATE_MIN) << SPEED_LENGTH; + public final int mTransferRate; private boolean allowFluid = false; public GT_Cover_FluidRegulator(int aTransferRate) { + if (aTransferRate > (-1 >>> (Integer.SIZE - SPEED_LENGTH))) + throw new IllegalArgumentException("aTransferRate too big: " + aTransferRate); this.mTransferRate = aTransferRate; } + private static int getSpeed(int aCoverVariable) { + // positive or 0 -> interval bits need to be set to zero + // negative -> interval bits need to be set to one + return aCoverVariable >= 0 ? aCoverVariable & ~TICK_RATE_BITMASK : aCoverVariable | TICK_RATE_BITMASK; + } + + private static int getTickRate(int aCoverVariable) { + // range: TICK_RATE_MIN ~ TICK_RATE_MAX + return ((Math.abs(aCoverVariable) & TICK_RATE_BITMASK) >>> SPEED_LENGTH) + TICK_RATE_MIN; + } + + private static int generateNewCoverVariable(int aFlowRate, int aTickRate) { + int tToStoreRaw = aTickRate - TICK_RATE_MIN; + int tToStore = aFlowRate >= 0 ? tToStoreRaw : ~tToStoreRaw; + return aFlowRate & ~TICK_RATE_BITMASK | (tToStore << SPEED_LENGTH); + } + public int doCoverThings(byte aSide, byte aInputRedstone, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - long aTimer) { - if (aCoverVariable == 0) { + long aTimer) { + int tSpeed = getSpeed(aCoverVariable); + if (tSpeed == 0) { return aCoverVariable; } if ((aTileEntity instanceof IFluidHandler)) { IFluidHandler tTank1; IFluidHandler tTank2; - ForgeDirection directionFrom; - ForgeDirection directionTo; - if (aCoverVariable > 0) { + ForgeDirection directionFrom; + ForgeDirection directionTo; + if (tSpeed > 0) { tTank2 = aTileEntity.getITankContainerAtSide(aSide); tTank1 = (IFluidHandler) aTileEntity; - directionFrom = ForgeDirection.getOrientation(aSide); - directionTo = ForgeDirection.getOrientation(aSide).getOpposite(); + directionFrom = ForgeDirection.getOrientation(aSide); + directionTo = ForgeDirection.getOrientation(aSide).getOpposite(); } else { tTank1 = aTileEntity.getITankContainerAtSide(aSide); tTank2 = (IFluidHandler) aTileEntity; - directionFrom = ForgeDirection.getOrientation(aSide).getOpposite(); - directionTo = ForgeDirection.getOrientation(aSide); + directionFrom = ForgeDirection.getOrientation(aSide).getOpposite(); + directionTo = ForgeDirection.getOrientation(aSide); } if (tTank1 != null && tTank2 != null) { allowFluid = true; - FluidStack tLiquid = tTank1.drain(directionFrom, Math.abs(aCoverVariable), false); + FluidStack tLiquid = tTank1.drain(directionFrom, Math.abs(tSpeed), false); if (tLiquid != null) { tLiquid = tLiquid.copy(); tLiquid.amount = tTank2.fill(directionTo, tLiquid, false); @@ -61,82 +101,83 @@ public class GT_Cover_FluidRegulator extends GT_CoverBehavior { return aCoverVariable; } + private int adjustSpeed(EntityPlayer aPlayer, int aCoverVariable, int scale) { + int tSpeed = getSpeed(aCoverVariable); + tSpeed += scale; + int tTickRate = getTickRate(aCoverVariable); + if (Math.abs(tSpeed) > mTransferRate * tTickRate) { + tSpeed = mTransferRate * tTickRate * (tSpeed > 0 ? 1 : -1); + GT_Utility.sendChatToPlayer(aPlayer, trans("219", "Pump speed limit reached!")); + } + if (tTickRate == 1) { + GT_Utility.sendChatToPlayer(aPlayer, + trans("048", "Pump speed: ") + tSpeed + trans("049", "L/tick ") + tSpeed * 20 + trans("050", "L/sec")); + } else { + GT_Utility.sendChatToPlayer(aPlayer, + String.format(trans("207", "Pump speed: %dL every %d ticks, %.2f L/sec on average"), tSpeed, tTickRate, tSpeed * 20d / tTickRate)); + } + return generateNewCoverVariable(tSpeed, tTickRate); + } + public int onCoverScrewdriverclick(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { + EntityPlayer aPlayer, float aX, float aY, float aZ) { if (GT_Utility.getClickedFacingCoords(aSide, aX, aY, aZ)[0] >= 0.5F) { - aCoverVariable += aPlayer.isSneaking() ? 256 : 16; + return adjustSpeed(aPlayer, aCoverVariable, aPlayer.isSneaking() ? 256 : 16); } else { - aCoverVariable -= aPlayer.isSneaking() ? 256 : 16; - } - if (aCoverVariable > mTransferRate) { - aCoverVariable = mTransferRate; - } - if (aCoverVariable < (0 - mTransferRate)) { - aCoverVariable = (0 - mTransferRate); + return adjustSpeed(aPlayer, aCoverVariable, aPlayer.isSneaking() ? -256 : -16); } - GT_Utility.sendChatToPlayer(aPlayer, - trans("048", "Pump speed: ") + aCoverVariable + trans("049", "L/tick ") + aCoverVariable * 20 + trans("050", "L/sec")); - return aCoverVariable; } public boolean onCoverRightclick(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity, - EntityPlayer aPlayer, float aX, float aY, float aZ) { + EntityPlayer aPlayer, float aX, float aY, float aZ) { if (GT_Utility.getClickedFacingCoords(aSide, aX, aY, aZ)[0] >= 0.5F) { - aCoverVariable++; + aCoverVariable = adjustSpeed(aPlayer, aCoverVariable, 1); } else { - aCoverVariable--; - } - if (aCoverVariable > mTransferRate) { - aCoverVariable = mTransferRate; + aCoverVariable = adjustSpeed(aPlayer, aCoverVariable, -1); } - if (aCoverVariable < (0 - mTransferRate)) { - aCoverVariable = (0 - mTransferRate); - } - GT_Utility.sendChatToPlayer(aPlayer, - trans("048", "Pump speed: ") + aCoverVariable + trans("049", "L/tick ") + aCoverVariable * 20 + trans("050", "L/sec")); aTileEntity.setCoverDataAtSide(aSide, aCoverVariable); return true; } - public boolean letsRedstoneGoIn(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } + public boolean letsRedstoneGoIn(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } - public boolean letsRedstoneGoOut(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } + public boolean letsRedstoneGoOut(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } - public boolean letsEnergyIn(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } + public boolean letsEnergyIn(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } - public boolean letsEnergyOut(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } + public boolean letsEnergyOut(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } - public boolean letsItemsIn(byte aSide, int aCoverID, int aCoverVariable, int aSlot, ICoverable aTileEntity) { - return true; - } + public boolean letsItemsIn(byte aSide, int aCoverID, int aCoverVariable, int aSlot, ICoverable aTileEntity) { + return true; + } - public boolean letsItemsOut(byte aSide, int aCoverID, int aCoverVariable, int aSlot, ICoverable aTileEntity) { - return true; - } + public boolean letsItemsOut(byte aSide, int aCoverID, int aCoverVariable, int aSlot, ICoverable aTileEntity) { + return true; + } - public boolean letsFluidIn(byte aSide, int aCoverID, int aCoverVariable, Fluid aFluid, ICoverable aTileEntity) { - return allowFluid; - } + public boolean letsFluidIn(byte aSide, int aCoverID, int aCoverVariable, Fluid aFluid, ICoverable aTileEntity) { + return allowFluid; + } - public boolean letsFluidOut(byte aSide, int aCoverID, int aCoverVariable, Fluid aFluid, ICoverable aTileEntity) { - return allowFluid; - } + public boolean letsFluidOut(byte aSide, int aCoverID, int aCoverVariable, Fluid aFluid, ICoverable aTileEntity) { + return allowFluid; + } - public boolean alwaysLookConnected(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return true; - } + public boolean alwaysLookConnected(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } - public int getTickRate(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - return 1; - } + public int getTickRate(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return getTickRate(aCoverVariable); + } /** * GUI Stuff @@ -165,6 +206,9 @@ public class GT_Cover_FluidRegulator extends GT_CoverBehavior { private int speed; private boolean export; + private int tickRate; + + private boolean warn = false; public GUI(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { super(aTileEntity, 176, 107, GT_Utility.intToStack(aCoverID)); @@ -172,26 +216,32 @@ public class GT_Cover_FluidRegulator extends GT_CoverBehavior { this.coverID = aCoverID; this.coverVariable = aCoverVariable; - this.speed = Math.abs(coverVariable); - this.export = coverVariable >= 0; - new GT_GuiIconButton(this, 0,startX + spaceX*0,startY+spaceY*0, GT_GuiIcon.EXPORT).setTooltipText(trans("006","Export")); - new GT_GuiIconButton(this, 1,startX + spaceX*1,startY+spaceY*0, GT_GuiIcon.IMPORT).setTooltipText(trans("007","Import")); + int speed = getSpeed(coverVariable); + this.speed = Math.abs(speed); + this.export = speed >= 0; + this.tickRate = getTickRate(coverVariable); + new GT_GuiIconButton(this, 0, startX + spaceX * 0, startY + spaceY * 0, GT_GuiIcon.EXPORT).setTooltipText(trans("006", "Export")); + new GT_GuiIconButton(this, 1, startX + spaceX * 1, startY + spaceY * 0, GT_GuiIcon.IMPORT).setTooltipText(trans("007", "Import")); - tBox = new GT_GuiIntegerTextBox(this, 2,startX + spaceX*0,startY+spaceY*1 + 2, spaceX*4-3,12); - tBox.setText(String.valueOf(speed)); + tBox = new GT_GuiIntegerTextBox(this, 2, startX + spaceX * 0, startY + spaceY * 1 + 2, spaceX * 4 - 3, 12); + tBox.setText(String.valueOf(this.speed)); tBox.setMaxStringLength(10); - lBox = new GT_GuiIntegerTextBox(this, 3,startX + spaceX*0,startY+spaceY*2 + 2, spaceX*4-3,12); - lBox.setText(String.valueOf(speed*20L)); - lBox.setMaxStringLength(10); + lBox = new GT_GuiIntegerTextBox(this, 3, startX + spaceX * 0, startY + spaceY * 2 + 2, spaceX * 4 - 3, 12); + lBox.setText(String.valueOf(this.tickRate)); + lBox.setMaxStringLength(4); } @Override public void drawExtras(int mouseX, int mouseY, float parTicks) { super.drawExtras(mouseX, mouseY, parTicks); - this.getFontRenderer().drawString(trans("229","Import/Export" ), startX + spaceX*4, 4+startY+spaceY*0, 0xFF555555); - this.getFontRenderer().drawString(trans("049", "L/tick "), startX + spaceX*4, 4+startY+spaceY*1, 0xFF555555); - this.getFontRenderer().drawString(trans("050", "L/sec"), startX + spaceX*4, 4+startY+spaceY*2, 0xFF555555); + this.getFontRenderer().drawString(trans("229", "Import/Export"), startX + spaceX * 4, 4 + startY + spaceY * 0, 0xFF555555); + this.getFontRenderer().drawString(trans("200", " L"), startX + spaceX * 4, 4 + startY + spaceY * 1, 0xFF555555); + this.getFontRenderer().drawString(trans("209", " ticks"), startX + spaceX * 4, 4 + startY + spaceY * 2, 0xFF555555); + if (warn) + this.getFontRenderer().drawString(String.format(trans("210", "Average: %.2f L/sec"), speed * 20d / tickRate), startX + spaceX * 0, 4 + startY + spaceY * 3, 0xffff0000); + else + this.getFontRenderer().drawString(String.format(trans("210", "Average: %.2f L/sec"), speed * 20d / tickRate), startX + spaceX * 0, 4 + startY + spaceY * 3, 0xFF555555); } @Override @@ -243,18 +293,27 @@ public class GT_Cover_FluidRegulator extends GT_CoverBehavior { return; } - if (box.id == 3) - i = i / 20; - - if (i > mTransferRate) - i = mTransferRate; - else if (i <= 0) - i = 0; - - speed = (int) i; - - tBox.setText(String.valueOf(speed)); - lBox.setText(String.valueOf(speed*20)); + warn = false; + if (box.id == 2) { + if (i > (long) mTransferRate * tickRate) { + i = (long) mTransferRate * tickRate; + warn = true; + } else if (i < 0) { + i = 0; + } + speed = (int) i; + } else if (box.id == 3) { + if (i > TICK_RATE_MAX) { + i = tickRate; + } else if (speed > mTransferRate * i) { + i = Math.min(TICK_RATE_MAX, (speed + mTransferRate - 1) / mTransferRate); + warn = true; + } else if (i < TICK_RATE_MIN) { + i = 1; + } + tickRate = (int) i; + } + box.setText(String.valueOf(i)); coverVariable = getNewCoverVariable(2); GT_Values.NW.sendToServer(new GT_Packet_TileEntityCover(side, coverID, coverVariable, tile)); @@ -262,7 +321,10 @@ public class GT_Cover_FluidRegulator extends GT_CoverBehavior { @Override public void resetTextBox(GT_GuiIntegerTextBox box) { - box.setText(String.valueOf(speed)); + if (box.id == 2) + box.setText(String.valueOf(speed)); + else if (box.id == 3) + box.setText(String.valueOf(tickRate)); } private void updateButtons(){ @@ -277,15 +339,12 @@ public class GT_Cover_FluidRegulator extends GT_CoverBehavior { switch (id) { case 0: export = true; - return speed; + return generateNewCoverVariable(speed, tickRate); case 1: export = false; - return -speed; + return generateNewCoverVariable(-speed, tickRate); case 2: - if (export) - return speed; - else - return -speed; + return generateNewCoverVariable(export ? speed : -speed, tickRate); } return coverVariable; } -- cgit