From a944c28dd44712be602d830a0f4480ce7ad58eb7 Mon Sep 17 00:00:00 2001 From: Toshayo Date: Fri, 26 Dec 2025 00:29:06 +0100 Subject: [PATCH] Added fluid valve with counter --- src/main/java/com/hbm/blocks/ModBlocks.java | 5 +- .../hbm/blocks/network/FluidCounterValve.java | 68 ++++++++ .../java/com/hbm/tileentity/TileMappings.java | 1 + .../network/TileEntityFluidCounterValve.java | 157 ++++++++++++++++++ src/main/resources/assets/hbm/lang/en_US.lang | 2 + .../blocks/fluid_counter_valve_off.png | Bin 0 -> 4474 bytes .../blocks/fluid_counter_valve_on.png | Bin 0 -> 4489 bytes 7 files changed, 232 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/hbm/blocks/network/FluidCounterValve.java create mode 100644 src/main/java/com/hbm/tileentity/network/TileEntityFluidCounterValve.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/fluid_counter_valve_off.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/fluid_counter_valve_on.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index a4c4381be..ed97a6af0 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -743,7 +743,7 @@ public class ModBlocks { public static Block machine_microwave; public static Block machine_battery_socket; - + @Deprecated public static Block machine_battery_potato; @Deprecated public static Block machine_battery; @Deprecated public static Block machine_lithium_battery; @@ -787,6 +787,7 @@ public class ModBlocks { public static Block pipe_anchor; public static Block fluid_valve; public static Block fluid_switch; + public static Block fluid_counter_valve; public static Block fluid_pump; public static Block machine_drain; public static Block radio_torch_sender; @@ -1920,6 +1921,7 @@ public class ModBlocks { fluid_duct_gauge = new FluidDuctGauge().setBlockName("fluid_duct_gauge").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); fluid_valve = new FluidValve(Material.iron).setBlockName("fluid_valve").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); fluid_switch = new FluidSwitch(Material.iron).setBlockName("fluid_switch").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); + fluid_counter_valve = new FluidCounterValve(Material.iron).setBlockName("fluid_counter_valve").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); fluid_pump = new FluidPump(Material.iron).setBlockName("fluid_pump").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_drain = new MachineDrain(Material.iron).setBlockName("machine_drain").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":concrete"); radio_torch_sender = new RadioTorchSender().setBlockName("radio_torch_sender").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); @@ -3205,6 +3207,7 @@ public class ModBlocks { register(pipe_anchor); register(fluid_duct_gauge); register(fluid_valve); + register(fluid_counter_valve); register(fluid_switch); register(fluid_pump); register(machine_drain); diff --git a/src/main/java/com/hbm/blocks/network/FluidCounterValve.java b/src/main/java/com/hbm/blocks/network/FluidCounterValve.java new file mode 100644 index 000000000..f0a202fbd --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/FluidCounterValve.java @@ -0,0 +1,68 @@ +package com.hbm.blocks.network; + +import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.ITooltipProvider; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.network.TileEntityFluidCounterValve; +import com.hbm.util.i18n.I18nUtil; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; + +import java.util.ArrayList; +import java.util.List; + +public class FluidCounterValve extends FluidDuctBase implements ILookOverlay, ITooltipProvider { + + @SideOnly(Side.CLIENT) + private IIcon iconOn; + + public FluidCounterValve(Material mat) { + super(mat); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + this.iconOn = iconRegister.registerIcon(RefStrings.MODID + ":fluid_counter_valve_on"); + this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":fluid_counter_valve_off"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int metadata) { + return metadata == 1 ? iconOn : blockIcon; + } + + @Override + public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { + return new TileEntityFluidCounterValve(); + } + + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityFluidCounterValve)) + return; + + TileEntityFluidCounterValve duct = (TileEntityFluidCounterValve) te; + + List text = new ArrayList<>(); + text.add("&[" + duct.getType().getColor() + "&]" + duct.getType().getLocalizedName()); + text.add("Counter: " + duct.getCounter()); + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + this.addStandardInfo(stack, player, list, ext); + } +} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index a4cbb8014..cf5ce3cac 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -443,6 +443,7 @@ public class TileMappings { put(TileEntityPipeExhaust.class, "tileentity_pipe_exhaust"); put(TileEntityPipeExhaustPaintable.class, "tileentity_pipe_exhaust_paintable"); put(TileEntityFluidValve.class, "tileentity_pipe_valve"); + put(TileEntityFluidCounterValve.class, "tileentity_pipe_counter_valve"); put(TileEntityFluidPump.class, "tileentity_pipe_pump"); put(TileEntityPipeAnchor.class, "tileentity_pioe_anchor"); diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityFluidCounterValve.java b/src/main/java/com/hbm/tileentity/network/TileEntityFluidCounterValve.java new file mode 100644 index 000000000..285b49ce0 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/network/TileEntityFluidCounterValve.java @@ -0,0 +1,157 @@ +package com.hbm.tileentity.network; + +import api.hbm.redstoneoverradio.IRORInteractive; +import api.hbm.redstoneoverradio.IRORValueProvider; +import com.hbm.handler.CompatHandler; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.uninos.UniNodespace; +import cpw.mods.fml.common.Optional; +import io.netty.buffer.ByteBuf; +import li.cil.oc.api.machine.Arguments; +import li.cil.oc.api.machine.Callback; +import li.cil.oc.api.machine.Context; +import li.cil.oc.api.network.SimpleComponent; +import net.minecraft.block.Block; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +@Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) +public class TileEntityFluidCounterValve extends TileEntityPipeBaseNT implements SimpleComponent, CompatHandler.OCComponent, IRORValueProvider, IRORInteractive { + private long counter; + + @Override + public void updateEntity() { + super.updateEntity(); + + if(!worldObj.isRemote) { + if(node != null && node.net != null && getType() != Fluids.NONE) { + counter += node.net.fluidTracker; + } + + networkPackNT(25); + } + } + + @Override + public boolean shouldCreateNode() { + return this.getBlockMetadata() == 1; + } + + public void updateState() { + this.blockMetadata = -1; // delete cache + + if(this.getBlockMetadata() == 0 && this.node != null) { + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, this.getType().getNetworkProvider()); + this.node = null; + } + } + + @Override + public boolean shouldRefresh(Block oldBlock, Block newBlock, int oldMeta, int newMeta, World world, int x, int y, int z) { + return oldBlock != newBlock; + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + counter = nbt.getLong("counter"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setLong("counter", counter); + } + + @Override + public void serialize(ByteBuf buf) { + buf.writeLong(counter); + } + + @Override + public void deserialize(ByteBuf buf) { + this.counter = Math.max(buf.readLong(), 0); + } + + private void setState(int state) { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, state, 2); + worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:block.reactorStart", 1.0F, 1.0F); + updateState(); + } + + public long getCounter() { + return counter; + } + + @Optional.Method(modid = "OpenComputers") + public String getComponentName() { + return "ntm_fluid_counter_valve"; + } + + @Callback(direct = true) + @Optional.Method(modid = "OpenComputers") + public Object[] getFluid(Context context, Arguments args) { + return new Object[] {getType().getName()}; + } + + @Callback(direct = true) + @Optional.Method(modid = "OpenComputers") + public Object[] getCounter(Context context, Arguments args) { + return new Object[] {counter}; + } + + @Callback(direct = true) + @Optional.Method(modid = "OpenComputers") + public Object[] resetCounter(Context context, Arguments args) { + counter = 0; + markDirty(); + return new Object[] {}; + } + + @Callback(direct = true) + @Optional.Method(modid = "OpenComputers") + public Object[] getState(Context context, Arguments args) { + return new Object[] {getBlockMetadata() == 1 ? 1 : 0}; + } + + @Callback(direct = true) + @Optional.Method(modid = "OpenComputers") + public Object[] setState(Context context, Arguments args) { + final int state = args.checkInteger(0); + if(state != 0 && state != 1) { + throw new IllegalArgumentException(); + } + setState(state); + return new Object[] {}; + } + + @Override + public String provideRORValue(String name) { + if((PREFIX_VALUE + "value").equals(name)) + return String.valueOf(counter); + if((PREFIX_VALUE + "state").equals(name)) + return String.valueOf(getBlockMetadata() == 1 ? 1 : 0); + return null; + } + + @Override + public String[] getFunctionInfo() { + return new String[] { + PREFIX_VALUE + "value", + PREFIX_VALUE + "state", + PREFIX_FUNCTION + "reset", + PREFIX_FUNCTION + "setState" + NAME_SEPARATOR + "state", + }; + } + + @Override + public String runRORFunction(String name, String[] params) { + if(name.equals(PREFIX_FUNCTION + "reset")) { + counter = 0; + markDirty(); + } else if(name.equals(PREFIX_FUNCTION + "setState")) { + setState(IRORInteractive.parseInt(params[0], 0, 1)); + } + return null; + } +} diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 567bd333d..ba4501b3e 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5529,6 +5529,8 @@ tile.fluid_duct_neo.name=Universal Fluid Duct tile.fluid_duct_paintable.name=Paintable Coated Universal Fluid Duct tile.fluid_duct_solid.name=Coated Universal Fluid Duct (Deprecated) tile.fluid_pump.name=Flow Control Pump +tile.fluid_counter_valve.name=Fluid Valve with Counter +tile.fluid_counter_valve.desc=Beware of loops in your fluid network... tile.fluid_switch.name=Redstone Fluid Valve tile.fluid_valve.name=Fluid Valve tile.foam_layer.name=Foam layer diff --git a/src/main/resources/assets/hbm/textures/blocks/fluid_counter_valve_off.png b/src/main/resources/assets/hbm/textures/blocks/fluid_counter_valve_off.png new file mode 100644 index 0000000000000000000000000000000000000000..77c0aa43272211bc25dccddb91684c995a4c196d GIT binary patch literal 4474 zcmeHKYfuzd7H-4ah@yt3QAvcJ=^5tP#qgXF#&uvAAR@%A?diS)E%RcgfdOB{ zNJ$_XQDfAo=%R@gkQfaHqX{G`>Mo+YWHB2Hf|3erYFBZIYgN#=w}*EnRa;bT{xMZO z-F?q@zI)Dh&pp-m4MS>jfFMMGAV`2NMPr2b=lILd2mXf+KB3^PwJbB6Gg2j}!)Z6O z7Jzc44uAqTYeo?FH&#Q!EblPCb3;|JUS6x$ZM)f|+jzY{c#fs(^v+7}q-Be?-WaU0 z`LyqEwit7dAL?xjI2-7d97p@a(u;^I#_Woc`0(@x zUYApKUuDH_-Iv{WCE;d6>{Tx8$$z9ZJzw2jt`(yJ$`*jfUc^#t~bXqkoVCKy|)|c zU#~~~elBl*CbddvyuDs`So>!1i}(7@t(|qR+t+WaptGS-dFamRy{StsSZrDTpJ8uO z{#g0;_9!}ahjHNehiiYR`?UIg)RWKS>eH^~`ukO0C^YYp-}kxS{+`v*6S3{Yj)uV6 zptL<)!tLb7$QN4*g`Y+Zv{&xcT?v%9lzn zH-qC) zIsS>u0~edc0^`r!SgxYI!%}yQS4# zbMnUep6*W7CmYx13=Vl|o1MEt=?4p8&AC}vTiN;*ByG0}DaLLBLbufciw;3z;@l33 zE&v>A0(q=Wjomxjf}t#<##YMogx-+^^4XL!C&(yE&7{i;XcdFS#R_8FBqXo`jzZm5 zi_Jy4)tHBugwOo22tz#(u0V}t>kVj<-3d^sP%0#Ft(z^DV6g%;#>tpTqh{F%1$(aR5*#9MSE-Go+_=pZ&QlC?Xn>1$vJQ^5+fbg9 zGTDnbHHJYuIvStVq1TVm+gu|mKs`im${`X936a$*n&{!;w8fBQB%ojQaAm?RDl!6> zy~s%eZ85NM;S(tsdd%NZoC4rl08G{o_DZ?<)X38X^CQ#{YE{?L%fTx1wLKgDK6beEj1^`z@%V=CmD^?*lTMTiNxT&x-gy#kyrScyERm=Hz}hrllj36p`sQhc340*?pGg-mh+ zinBX2?RJYA<3mDu&oQ$eZYPG~C=JB{NJ>a#q*y{qWSJ5PNkl^xA_*}`Ou*Y2)?E6( z(ER2>V}_SJg>}LCOFcuwJ1PSd4!;e*T3F9kLQ&7AASrq{1s7Ee7*Cv#YuH5RQ?@(+ zyT?emj*hdxQVM2DPRNvE6HbXuDqJd|r8s3Wn{cyP60M}6g;LOy*<^1mnjk zV1r*lCGfCRbV^UdgO-o!cgY&$d*m2`ym7ALYdG?>BW0BfL7oZXFE3=@{<(0_m(%IB zzIXiRz2GglP|(4jrXzHkgiPh1kM0!PzKnlPTU(PWsGjq5MAhPcq-JH}@_V!Qzm~DN zYH5~J(3~h(H{(dktEjQ6X>rI}Yx;M{5rXd8ygB}$^lE!YM|*5i;gJvI&B$LQ zUaj5-4^ry#4L;rPAm!ICz15~T&}uIE;#_dA=Dd489yI4LS^v}dq4|TqHS#IP zm$kE#x^cSq0FmH)^;q8LpKMxrY97Mwo6$QIiy5|$pU zYqDJ&n#X~e>ABngq)j)>ehRFT$KJXt>nRurB~Rwf|MuaP!3DH`+n(LCzFf2GQ506* z_0zkR@|LRn`hY`kecTgRNdDbd9A$d`Tg(6e literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/fluid_counter_valve_on.png b/src/main/resources/assets/hbm/textures/blocks/fluid_counter_valve_on.png new file mode 100644 index 0000000000000000000000000000000000000000..14f414cc7cef849796d5ab6e75f21dddb4c87cab GIT binary patch literal 4489 zcmeHKYfuzd7H;t|EMPQ>XmF8sH0laHGu`u^%qYkVFob~#5FhL#_H^HY)_Kw0z<@Dg zlnqA1E`}J48WR=b`XDHkh$t(RM2$f)VVAJ6WI=XCO^g^T(UgLFdw2+yRHdxi{9~$m zy8GPkeD|F1o_nhACTmjM#DLHM1VJX6%;4#Yx&UFV85;+f3`8PV{U5Q%j1qtxqP8y)n|Rx#WHQDY^gLhKbhQB zD7o?BOR>Sz9~dtlQ`}@4gZ(NRirmp(*Z$#D)wi;kuHZ>~?zS!d(RTUrfx6Si=jLoM zT?-jowL9Hg78QcsIkREIM|oi_O(Ea8ljonG`OlCQB%^9 zv*YTagBuQ_{(S{Cfl04RQm(Ewzi-+yeb()+lWU&3eMRK|MnKDA{> zan;sCQ+7{HF5{!G##KhlI+Z1j?&*M43-QF#A@+ zxg!M&73V6$A5MCuxpiTpCEwgR?o#hnO*j>mIX$yAtouP*);sf~dY-BI;&R`rv1Pq; z>)KoQ#6>+)d9tpwmKr)((Tse8PR%JtvG=V=d-L@jY<)d;>BO}QhqH@YL}*NP!WBgH zTD`aA=$C8Tue4~7ty`0R_rVxb4O<#ceIEvk&db2!T5d_yQEsP%q}?_k@j5-Q>JUV~ z*y|yw)qqEBAcJuk#J5kJ5~B=l5HC|&WEM{h$YkR4S&*8alt$&RrnIzp@uC2|R|g54 zfG1I})8XQDUW3@jtAo#iSt>?-5Pr2myxd|%W85r26%vI+hMBxf4k2C?fa+P=u1hh- z4p6{1gE*7tJvym0H#b+3E0?(03@NVFYNawlN)Q-CU|gPyC%u@9n~r^jL$qIYovDnLD?UeY7QB{HegDIM;?@unO|G7!+udT?oQ zk4jSj=gwv+V9Eh5e$H?Tni}%=WU~%mIy5B(4&a1P4$g{?m@>|6u?~3%5@aw=kIxH= zJp#!y_Qzt4h)o#rr87Jb=sv_d0zH_!4-8Qji_Yk#vW4)>MuS+GUq`zshSvEWm2wrZ zsR6)jYB`N5aHSp70;K{|+2l&CQl%zsHuW$nvy0|S`xRbHL770$t(k_l5`A@N}!@46^_GrD4@b*fTDzG0H(FmTFgeP zNQKg_R@<~n9~DjMV%@Bhgv-e|$qXR%xH5bLg5bJntJxqXB(ldAtAph2(7_;1WL(+a z#{+4M6QuH_peC+XsZ?5(Qj2TkxSY^D1}z0F2P;wF#AOnBe>TFh=wLEXSW>7{NZ|8; zx#(h8K=N)j&Fyv=#6n1@;5jsGf!m2DdD2Mo0FufGr4A=_gffjFbTTR^0Z2}OOILPt{lDR5*CpnY*duKpn^ zlXPVO*gXcybUYCjyUF*Z)nf zfXBxv;DTR4x$v-by}RIBc+i?)dp^#HTtoIF$flEpZP4-?Py7lFK?0`=*BIoToim_O z#G5T9(T$*Iri~4(cJxW$XQ7n*`wTLirn}tS8#5d`15_l z_+{t^$nkg+S(4hgEPj2&`S_BWf@c>vN+o|P??5U%tyzAv=jxdq+k304*JUVAg)iM% zR2mV4tlQ>yY0RwMD?cB90^z>#>&bi6+88^jDt&tV#?9C6oj$+2T)(E_g%AEsb5lB7 z!}!*Qw;g@+@6-o|zHzbE`N@y#%dMefZ$9_Zv8|udeo^msBbwr|^;bM?->l#}6Q)%K z*0eG5VrpM0;y=4+PiBOB`pN@-*V+oJEkrZ7ue1~#pSHSX$DiqwU(R|c`ePk8^K91S zB`a5iYy-15X1;7a*uPBe)`e9M&Cfz@}{&rte6`VlT+dme?ZK?iZ y#;t#~_a@dcZ8Lso$?&@*se3P7^50LJ?~m_@WfJGPN}`~qh}o26tX#74)&Bv>9BxJc literal 0 HcmV?d00001