From abb8c3aeba04981494b21f3b55400bbe9c5a677f Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 18 Feb 2022 13:43:12 +0100 Subject: [PATCH] new chemplant fluid and energy IO --- .../hbm/handler/nei/SILEXRecipeHandler.java | 2 +- .../com/hbm/interfaces/IFluidContainer.java | 3 - .../java/com/hbm/inventory/FluidTank.java | 16 ++- .../TileEntityMachineChemplantNew.java | 118 ++++++++++++++---- .../textures/gui/processing/gui_chemfac.png | Bin 0 -> 15176 bytes 5 files changed, 104 insertions(+), 35 deletions(-) create mode 100755 src/main/resources/assets/hbm/textures/gui/processing/gui_chemfac.png diff --git a/src/main/java/com/hbm/handler/nei/SILEXRecipeHandler.java b/src/main/java/com/hbm/handler/nei/SILEXRecipeHandler.java index cc1dba5b5..dd624fc18 100644 --- a/src/main/java/com/hbm/handler/nei/SILEXRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/SILEXRecipeHandler.java @@ -48,7 +48,7 @@ public class SILEXRecipeHandler extends TemplateRecipeHandler { this.outputs = new ArrayList(); this.chances = new ArrayList(); this.produced = recipe.fluidProduced / recipe.fluidConsumed; - this.crystalStrength = EnumWavelengths.values()[recipe.laserStrength]; + this.crystalStrength = recipe.laserStrength; double weight = 0; diff --git a/src/main/java/com/hbm/interfaces/IFluidContainer.java b/src/main/java/com/hbm/interfaces/IFluidContainer.java index 34e2ed77f..04a0905c6 100644 --- a/src/main/java/com/hbm/interfaces/IFluidContainer.java +++ b/src/main/java/com/hbm/interfaces/IFluidContainer.java @@ -1,8 +1,5 @@ package com.hbm.interfaces; -import java.util.List; - -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; public interface IFluidContainer { diff --git a/src/main/java/com/hbm/inventory/FluidTank.java b/src/main/java/com/hbm/inventory/FluidTank.java index eaad80666..5f0a0b41c 100644 --- a/src/main/java/com/hbm/inventory/FluidTank.java +++ b/src/main/java/com/hbm/inventory/FluidTank.java @@ -90,7 +90,7 @@ public class FluidTank { } //Fills tank from canisters - public void loadTank(int in, int out, ItemStack[] slots) { + public boolean loadTank(int in, int out, ItemStack[] slots) { FluidType inType = Fluids.NONE; if(slots[in] != null) { @@ -101,27 +101,27 @@ public class FluidTank { if(slots[in].getItem() == ModItems.fluid_barrel_infinite && type != Fluids.NONE) { this.fluid = this.maxFluid; - return; + return true; } if(slots[in].getItem() == ModItems.inf_water && this.type == Fluids.WATER) { this.fluid += 50; if(this.fluid > this.maxFluid) this.fluid = this.maxFluid; - return; + return true; } if(slots[in].getItem() == ModItems.inf_water_mk2 && this.type == Fluids.WATER) { this.fluid += 500; if(this.fluid > this.maxFluid) this.fluid = this.maxFluid; - return; + return true; } if(FluidContainerRegistry.getFluidContent(slots[in], type) <= 0) - return; + return false; } else { - return; + return false; } if(slots[in] != null && inType.getName().equals(type.getName()) && fluid + FluidContainerRegistry.getFluidContent(slots[in], type) <= maxFluid) { @@ -141,7 +141,11 @@ public class FluidTank { if(slots[in].stackSize <= 0) slots[in] = null; } + + return true; } + + return false; } //Fills canisters from tank diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantNew.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantNew.java index 51bf6bed4..adc336064 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantNew.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantNew.java @@ -1,7 +1,9 @@ package com.hbm.tileentity.machine; +import java.util.ArrayList; import java.util.List; +import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; import com.hbm.inventory.FluidTank; @@ -13,12 +15,14 @@ import com.hbm.inventory.recipes.ChemplantRecipes; import com.hbm.inventory.recipes.ChemplantRecipes.ChemRecipe; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; +import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.InventoryUtil; import api.hbm.energy.IEnergyUser; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachineChemplantNew extends TileEntityMachineBase implements IEnergyUser, IFluidSource, IFluidAcceptor { @@ -63,6 +67,22 @@ public class TileEntityMachineChemplantNew extends TileEntityMachineBase impleme if(!worldObj.isRemote) { + this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); + + if(!tanks[0].loadTank(17, 19, slots)) tanks[0].unloadTank(17, 19, slots); + if(!tanks[1].loadTank(18, 20, slots)) tanks[1].unloadTank(18, 20, slots); + + tanks[2].unloadTank(9, 11, slots); + tanks[3].unloadTank(10, 12, slots); + + if(worldObj.getTotalWorldTime() % 10 == 0) { + this.fillFluidInit(tanks[2].getTankType()); + this.fillFluidInit(tanks[3].getTankType()); + } + if(worldObj.getTotalWorldTime() % 20 == 0) { + this.updateConnections(); + } + UpgradeManager.eval(slots, 1, 3); int speedLevel = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); @@ -104,6 +124,17 @@ public class TileEntityMachineChemplantNew extends TileEntityMachineBase impleme } } + private void updateConnections() { + + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); + ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); + + this.trySubscribe(worldObj, xCoord + rot.offsetX * 3, yCoord, zCoord + rot.offsetZ * 3, rot); + this.trySubscribe(worldObj, xCoord - rot.offsetX * 2, yCoord, zCoord - rot.offsetZ * 2, rot.getOpposite()); + this.trySubscribe(worldObj, xCoord + rot.offsetX * 3 + dir.offsetX, yCoord, zCoord + rot.offsetZ * 3 + dir.offsetZ, rot); + this.trySubscribe(worldObj, xCoord - rot.offsetX * 2 + dir.offsetX, yCoord, zCoord - rot.offsetZ * 2 + dir.offsetZ, rot.getOpposite()); + } + private boolean canProcess() { if(slots[4] == null || slots[4].getItem() != ModItems.chemistry_template) @@ -195,79 +226,116 @@ public class TileEntityMachineChemplantNew extends TileEntityMachineBase impleme @Override public long getPower() { - // TODO Auto-generated method stub - return 0; + return this.power; + } + + @Override + public void setPower(long power) { + this.power = power; } @Override public long getMaxPower() { - // TODO Auto-generated method stub - return 0; + return this.maxPower; } @Override public void setFillForSync(int fill, int index) { - // TODO Auto-generated method stub - + if(index >= 0 && index < tanks.length) tanks[index].setFill(fill); } @Override public void setFillForTransfer(int fill, FluidType type) { - // TODO Auto-generated method stub + for(FluidTank tank : tanks) { + if(tank.getTankType() == type) { + tank.setFill(fill); + return; + } + } } @Override public void setTypeForSync(FluidType type, int index) { - // TODO Auto-generated method stub - + if(index >= 0 && index < tanks.length) tanks[index].setTankType(type); } @Override public int getFluidFill(FluidType type) { - // TODO Auto-generated method stub + + for(FluidTank tank : tanks) { + if(tank.getTankType() == type) { + return tank.getFill(); + } + } + return 0; } @Override public int getMaxFillForReceive(FluidType type) { - // TODO Auto-generated method stub + + for(FluidTank tank : tanks) { + if(tank.getTankType() == type) { + return tank.getMaxFill(); + } + } + return 0; } @Override public void fillFluidInit(FluidType type) { - // TODO Auto-generated method stub + /* + * #### + * X####X + * X##O#X + * #### + */ + + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); + ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); + + fillFluid(xCoord + rot.offsetX * 3, yCoord, zCoord + rot.offsetZ * 3, this.getTact(), type); + fillFluid(xCoord - rot.offsetX * 2, yCoord, zCoord - rot.offsetZ * 2, this.getTact(), type); + fillFluid(xCoord + rot.offsetX * 3 + dir.offsetX, yCoord, zCoord + rot.offsetZ * 3 + dir.offsetZ, this.getTact(), type); + fillFluid(xCoord - rot.offsetX * 2 + dir.offsetX, yCoord, zCoord - rot.offsetZ * 2 + dir.offsetZ, this.getTact(), type); } @Override public void fillFluid(int x, int y, int z, boolean newTact, FluidType type) { - // TODO Auto-generated method stub - + Library.transmitFluid(x, y, z, newTact, this, worldObj, type); } @Override public boolean getTact() { - // TODO Auto-generated method stub - return false; + return worldObj.getTotalWorldTime() % 20 < 10; } + + List[] lists = new List[] { + new ArrayList(), new ArrayList(), new ArrayList(), new ArrayList() + }; @Override public List getFluidList(FluidType type) { - // TODO Auto-generated method stub - return null; + + for(int i = 0; i < tanks.length; i++) { + if(tanks[i].getTankType() == type) { + return lists[i]; + } + } + + return new ArrayList(); } @Override public void clearFluidList(FluidType type) { - // TODO Auto-generated method stub - - } - - @Override - public void setPower(long power) { - // TODO Auto-generated method stub + for(int i = 0; i < tanks.length; i++) { + if(tanks[i].getTankType() == type) { + lists[i].clear(); + } + } } } diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_chemfac.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_chemfac.png new file mode 100755 index 0000000000000000000000000000000000000000..3ec12aba3973d977e96b49347bda8450cd890b26 GIT binary patch literal 15176 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


CXi8bDC7*ll;vL1Hg0xhq zw3CDOjvfhdUC)Asz1_dg|HW@q-~tv}BkVP^;mC%Wk`bw!zp<&vGoza2##x0j$pIRDEd)%iP-XA*Q$ejvVhfI&qCvLxJ;vSxxw%d-Q-&NtIPZ6 zZQ0Qh7laguX$wA9_aZ@1uHL}!{>$anc7^J?E071DJABNbgkGyx(qh=(dP)lR?{h)- zA?VQZFS@a2L5xc%NxQ)I#F^E|{EyV&@u~XSfUsdA*pZ>`lLRD$?``bnwr8XTGeLG7 zn?(KiB>6~<78Y!xBFFIws0TT`gRili->z~SrWrBm#hXG?UTw>XVW70BU-CE4BgB{8 zcQkdhi05P`cmj<`+<3j7-JWI?R`7q>LJro>o#*6?1xYWzXP9#`xMXV&1RqyvYCpBP2O)H zn6TvkUBVD{XZRWZ{^O??l+v*q?XRY6e-|G{Oq9T1q&FsLWPW6PoFPqR>Mnx-z|eXe z>CVq0Dy-!w5i98Ag_eGNqMts+r%F>$*mD-FxnnTI3HHA^F6&quQk(o{c9CaD8Vy^h zOm4Fx;RdwN)+il?#%T@QBtkCd>O1cH1O5&yfvU^AgAmE}_}}OWEn8*ONWkJ87_5YVMRw6rFv#qg}w61fKu{KBPEW$0fkHgF5fm}=vUYa{K3 z{Xmh=lp0QY?>Y6}Z!{~Su^3TZ1RyKjuMp!IFrQ*FGgo%DA!UNy$ z5Psr>SpyT^1e2+lGJ=u-ulU!BTRYGgx@fn$?C9i`%MWwqSlPx9KCNCm(*4*jEN}0i z;&33ZK>FaHlsv^NqwB*r9O0F8navXnnu&(AFIwKR)m!|Jz|r7?@^?Kek_0~-*|$qkf{HrDK>he=p_{>k0uKG3_D!?^RtmQs%3lT8ybF(=9D} zX<3r35)SZW);FYmXwFPVQpyM9w7k;#%I%FeRFKzJ$NdrU^Apj(kP0AX^J~BJ$zzu& z!@DVN%@Op1h4n>Qb-OFfJuIFA;L?4k8T=z7lMvljMon6lauG+x=tqg7EHrl2XcPi| z*D`UtK;|cYwoF}J-mgAEHMy6@q3{M8U?H(kkL>~?Y!xUKoDQsP^dQbX(V&!sP zt%v~9r;>^IbBCp?^geZMZ!(HZfO6A-xh zEph1Vxn+P?%aAA+Qw$KGH@+EW?bF{1cY}`0hx9(#bU}O^MlTD1h!oN#;-u4zS@rz< zsKt!Q$?M%k`jQtcwC(&^@uq~D_=k7TXrfCk&$X6X2Ok=^F+jM}q5t_v;{9R=ffxB* z3`^lWf4m6b3;^?s*;KZvkEyas1<_91gOtK4%65ttCnE$ec@Y^T!fw^A4;Pa-~ z$T#?4b+ryZNw`>}-#_B@nNv(Nt~`Cu3K6&0z_gW>-Fdp zcTI=0drfz^>+sj2bq!nzU>kbX2j<+V2+?h~Ify}@61+CdurrC1S&RQWq_ zVOJ92H((*Up&_~l?Tgf#|c;}!U>#Txs0(D@OnRoeA_ zaJK5Ff*Nm3QNT}K3(~;PbcfUiA8c+=MZCNMg;+3~Nsl%S3BR0#zYMI;(>7l-2k5Vm zzOj)szB~_~b2MAsV|Wn)j#gR=TYV0t1FmDpgJyj@@p4^yfYETc8fe637>1BxRo-8) z>o4#l$;9WSxjcbkc?pE#+%RXOHpPS8wR1{dKxuNe1l_JzzK_q7)TAchIHZtjOp~Up};ckvXKM<$f}#31JW>DfGo{sP!kk@ z(L1E``zF%2EXEIaUgIE4l$s07VE9q!y(3}+bSP{jba=36MLw4;7Q4f)e0plDYW-)yXz*nj^94YXZIC zJe4NS1cn#77>k}!(=CXv28*I=jmdXS?N#D;1NWzn0#{i_Xn6`)1G$WR@T?Oa0$Z?3 z=pzh35B^x zt=V%E&|MAd8D@A}DAKL7vcF>T7s?KF7BXa57?j&nDvvNeG?72o`vJjw@3ui-700hA|>%)h1Ib|6FzN}$j(tbV