RyanHub – file viewer
filename: common/src/main/java/rearth/oritech/api/energy/containers/DynamicStatisticEnergyStorage.java
branch: 1.21
back to repo
package rearth.oritech.api.energy.containers;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class DynamicStatisticEnergyStorage extends DynamicEnergyStorage {
    
    private final List<Long> inserted = new ArrayList<>();  // just for this tick
    private final List<Long> extracted = new ArrayList<>();
    private final Long[] historicInsert = new Long[20];
    private final Long[] historicExtract = new Long[20];
    private int currentInsertSources = 0;
    
    public DynamicStatisticEnergyStorage(long capacity, long maxInsert, long maxExtract, Runnable onUpdate) {
        super(capacity, maxInsert, maxExtract, onUpdate);
        
        Arrays.fill(historicInsert, 0L);
        Arrays.fill(historicExtract, 0L);
    }
    
    @Override
    public long insert(long amount, boolean simulate) {
        
        var inserted = super.insert(amount, simulate);
        if (!simulate && inserted > 0) {
            this.inserted.add(inserted);
        }
        
        return inserted;
    }
    
    @Override
    public long extract(long amount, boolean simulate) {
        
        var extracted = super.extract(amount, simulate);
        if (!simulate && extracted > 0) {
            this.extracted.add(extracted);
        }
        
        return extracted;
    }
    
    public void tick(long worldTicks) {
        var index = (int) (worldTicks % 20);
        historicInsert[index] = inserted.stream().mapToLong(Long::longValue).sum();
        historicExtract[index] = extracted.stream().mapToLong(Long::longValue).sum();
        currentInsertSources = inserted.size();
        
        inserted.clear();
        extracted.clear();
    }
    
    public EnergyStatistics getCurrentStatistics(long worldTicks) {
        var index = (int) (worldTicks % 20);
        
        return new EnergyStatistics(
          (float) Arrays.stream(historicInsert).mapToLong(Long::longValue).average().orElse(0),
          (float) Arrays.stream(historicExtract).mapToLong(Long::longValue).average().orElse(0),
          historicInsert[index],
          historicExtract[index],
          currentInsertSources,
          Arrays.stream(historicInsert).mapToLong(Long::longValue).max().orElse(0),
          Arrays.stream(historicExtract).mapToLong(Long::longValue).max().orElse(0)
        );
        
    }
    
    public record EnergyStatistics(
      float avgInsertSecond,
      float avgExtractSecond,
      long insertedLastTickTotal,
      long extractedLastTickTotal,
      int insertionCountLastTick,
      long maxInsertSecond,
      long maxExtractSecond) {
        @Override
        public String toString() {
            return "EnergyStatistics{" +
                     "avgInsertSecond=" + avgInsertSecond +
                     ", avgExtractSecond=" + avgExtractSecond +
                     ", insertedLastTickTotal=" + insertedLastTickTotal +
                     ", extractedLastTickTotal=" + extractedLastTickTotal +
                     ", insertionCountLastTick=" + insertionCountLastTick +
                     ", maxInsertSecond=" + maxInsertSecond +
                     ", maxExtractSecond=" + maxExtractSecond +
                     '}';
        }
    }
    
}