2828import dev .technici4n .moderndynamics .network .NetworkManager ;
2929import dev .technici4n .moderndynamics .network .NetworkNode ;
3030import dev .technici4n .moderndynamics .network .NodeHost ;
31- import dev .technici4n .moderndynamics .network .TickHelper ;
3231import dev .technici4n .moderndynamics .network .shared .TransferLimits ;
3332import dev .technici4n .moderndynamics .pipe .PipeBlockEntity ;
3433import dev .technici4n .moderndynamics .util .TransferUtil ;
@@ -55,9 +54,10 @@ public class FluidHost extends NodeHost {
5554 private FluidVariant variant = FluidVariant .blank ();
5655 private long amount = 0 ;
5756 // Rate limiting
58- private long lastRateUpdate = 0 ;
59- private final TransferLimits insertLimit = new TransferLimits (); // inserted INTO the neighbor inventories
60- private final TransferLimits extractLimit = new TransferLimits (); // extracted FROM the neighbor inventories
57+ // inserted INTO the neighbor inventories
58+ private final TransferLimits <FluidVariant > insertLimit = new TransferLimits <>(this ::getNetworkToOutsideLimit );
59+ // extracted FROM the neighbor inventories
60+ private final TransferLimits <FluidVariant > extractLimit = new TransferLimits <>(this ::getOutsideToNetworkLimit );
6161 // Caps
6262 private final Storage <FluidVariant >[] caps = new Storage [6 ];
6363
@@ -234,19 +234,9 @@ public void readClientNbt(CompoundTag tag) {
234234 amount = tag .getLong ("amount" );
235235 }
236236
237- private void updateRateLimits () {
238- long currentTick = TickHelper .getTickCounter ();
239-
240- if (currentTick > lastRateUpdate ) {
241- lastRateUpdate = currentTick ;
242- extractLimit .reset ();
243- insertLimit .reset ();
244- }
245- }
246-
247- private long getNetworkToOutsideLimit (Direction side , FluidVariant variant ) {
237+ private long getNetworkToOutsideLimit (Direction side , @ Nullable FluidVariant variant ) {
248238 if (getAttachment (side ) instanceof FluidAttachedIo io ) {
249- if (! io .matchesFilter (variant ) || !io .isEnabledViaRedstone (pipe )) {
239+ if (( variant != null && ! io .matchesFilter (variant ) ) || !io .isEnabledViaRedstone (pipe )) {
250240 return 0 ;
251241 }
252242 if (io .getType () == IoAttachmentType .EXTRACTOR )
@@ -258,9 +248,9 @@ private long getNetworkToOutsideLimit(Direction side, FluidVariant variant) {
258248 return Constants .Fluids .BASE_IO ;
259249 }
260250
261- private long getOutsideToNetworkLimit (Direction side , FluidVariant variant ) {
251+ private long getOutsideToNetworkLimit (Direction side , @ Nullable FluidVariant variant ) {
262252 if (getAttachment (side ) instanceof FluidAttachedIo io ) {
263- if (! io .matchesFilter (variant ) || !io .isEnabledViaRedstone (pipe )) {
253+ if (( variant != null && ! io .matchesFilter (variant ) ) || !io .isEnabledViaRedstone (pipe )) {
264254 return 0 ;
265255 }
266256 if (io .getType () == IoAttachmentType .ATTRACTOR )
@@ -293,9 +283,7 @@ private class ExternalFluidStorage implements Storage<FluidVariant> {
293283
294284 @ Override
295285 public long insert (FluidVariant resource , long maxAmount , TransactionContext transaction ) {
296- updateRateLimits ();
297- maxAmount = Math .min (maxAmount ,
298- getNetworkToOutsideLimit (Direction .from3DDataValue (directionId ), resource ) - insertLimit .used [directionId ]);
286+ maxAmount = insertLimit .limit (directionId , maxAmount , resource );
299287 if (maxAmount <= 0 )
300288 return 0 ;
301289
@@ -306,9 +294,7 @@ public long insert(FluidVariant resource, long maxAmount, TransactionContext tra
306294
307295 @ Override
308296 public long extract (FluidVariant resource , long maxAmount , TransactionContext transaction ) {
309- updateRateLimits ();
310- maxAmount = Math .min (maxAmount ,
311- getOutsideToNetworkLimit (Direction .from3DDataValue (directionId ), resource ) - extractLimit .used [directionId ]);
297+ maxAmount = extractLimit .limit (directionId , maxAmount , resource );
312298 if (maxAmount <= 0 )
313299 return 0 ;
314300
@@ -331,9 +317,7 @@ private View(StorageView<FluidVariant> view) {
331317
332318 @ Override
333319 public long extract (FluidVariant resource , long maxAmount , TransactionContext transaction ) {
334- updateRateLimits ();
335- maxAmount = Math .min (maxAmount ,
336- getOutsideToNetworkLimit (Direction .from3DDataValue (directionId ), resource ) - extractLimit .used [directionId ]);
320+ maxAmount = extractLimit .limit (directionId , maxAmount , resource );
337321 if (maxAmount <= 0 )
338322 return 0 ;
339323
@@ -380,11 +364,9 @@ private NetworkFluidStorage(int directionId) {
380364 public long insert (FluidVariant resource , long maxAmount , TransactionContext transaction ) {
381365 StoragePreconditions .notBlankNotNegative (resource , maxAmount );
382366
383- updateRateLimits ();
384367 // extractLimit because the network is receiving from an adjacent inventory,
385368 // as if it was extracting from it
386- maxAmount = Math .min (maxAmount ,
387- getOutsideToNetworkLimit (Direction .from3DDataValue (directionId ), resource ) - extractLimit .used [directionId ]);
369+ maxAmount = extractLimit .limit (directionId , maxAmount , resource );
388370 if (maxAmount <= 0 )
389371 return 0 ;
390372
@@ -398,11 +380,9 @@ public long insert(FluidVariant resource, long maxAmount, TransactionContext tra
398380 public long extract (FluidVariant resource , long maxAmount , TransactionContext transaction ) {
399381 StoragePreconditions .notBlankNotNegative (resource , maxAmount );
400382
401- updateRateLimits ();
402383 // insertLimit because the network is being extracted from an adjacent inventory,
403384 // as if it was inserting into it
404- maxAmount = Math .min (maxAmount ,
405- getNetworkToOutsideLimit (Direction .from3DDataValue (directionId ), resource ) - insertLimit .used [directionId ]);
385+ maxAmount = insertLimit .limit (directionId , maxAmount , resource );
406386 if (maxAmount <= 0 )
407387 return 0 ;
408388
0 commit comments