aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPrometheus0000 <prometheus0000000@gmail.com>2021-03-05 14:15:26 -0500
committerGitHub <noreply@github.com>2021-03-05 14:15:26 -0500
commit450d4c0df507f1927bd7a0929c736238d7d8e90e (patch)
tree003f7ea3c61e4471c44ad10af9e78f908a55da2b /src
parent617f0c768c5bb7f2b16806e36ea80303dca261b2 (diff)
parent29db17e34d9a1b604771b41623c8e46f2716c9c6 (diff)
downloadGT5-Unofficial-450d4c0df507f1927bd7a0929c736238d7d8e90e.tar.gz
GT5-Unofficial-450d4c0df507f1927bd7a0929c736238d7d8e90e.tar.bz2
GT5-Unofficial-450d4c0df507f1927bd7a0929c736238d7d8e90e.zip
Merge pull request #25 from GTNewHorizons/experimental
update
Diffstat (limited to 'src')
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_FluidRegulator.java247
-rw-r--r--src/main/java/gregtech/common/render/GT_Renderer_Block.java13
2 files changed, 163 insertions, 97 deletions
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
+ * <pre>
+ * 1111 1111 1111 1111 1111 1111 1111 1111
+ * |- interval-| |- flow rate 2 compl. -|
+ * ^ export?
+ * </pre>
+ * Concat export and flow rate 2 compl. together to get actual flow rate.
+ * A positive actual flow rate is export, and vice versa.
+ * <p>
+ * 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;
}
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) {