RyanHub – file viewer
filename: common/src/main/java/rearth/oritech/client/ui/EnergyStorageScreen.java
branch: 1.21
back to repo
package rearth.oritech.client.ui;

import io.wispforest.owo.ui.component.Components;
import io.wispforest.owo.ui.component.LabelComponent;
import io.wispforest.owo.ui.container.Containers;
import io.wispforest.owo.ui.container.FlowLayout;
import io.wispforest.owo.ui.core.*;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.text.Text;
import rearth.oritech.api.energy.containers.DynamicEnergyStorage;
import rearth.oritech.block.base.entity.ExpandableEnergyStorageBlockEntity;
import rearth.oritech.block.entity.storage.UnstableContainerBlockEntity;
import rearth.oritech.init.BlockContent;
import rearth.oritech.init.ItemContent;
import rearth.oritech.util.TooltipHelper;

import java.util.Collection;
import java.util.List;

public class EnergyStorageScreen extends UpgradableMachineScreen<UpgradableMachineScreenHandler> {
    
    private LabelComponent inAvgSecond;
    private LabelComponent inLastTick;
    private LabelComponent inSources;
    private LabelComponent inPeak;
    private LabelComponent outAvgSecond;
    private LabelComponent outLastTick;
    private LabelComponent outPeak;
    private boolean showingOutput;
    
    public EnergyStorageScreen(UpgradableMachineScreenHandler handler, PlayerInventory inventory, Text title) {
        super(handler, inventory, title);
    }
    
    @Override
    public void fillOverlay(FlowLayout overlay) {
        super.fillOverlay(overlay);
        
        var panelXPos = 74;
        
        var insertionContainer = Containers.verticalFlow(Sizing.fixed(94), Sizing.content());
        insertionContainer.surface(Surface.PANEL_INSET);
        insertionContainer.padding(Insets.of(2, 2, 4, 8));
        insertionContainer.positioning(Positioning.absolute(panelXPos, 23));
        
        inAvgSecond = Components.label(Text.literal("X RF/t"));
        inAvgSecond.tooltip(Text.translatable("title.oritech.energy.inAvgSecond.tooltip"));
        inLastTick = Components.label(Text.literal("X RF/t"));
        inLastTick.tooltip(Text.translatable("title.oritech.energy.inLastTick.tooltip"));
        inSources = Components.label(Text.literal("X"));
        inSources.tooltip(Text.translatable("title.oritech.energy.inSources.tooltip"));
        inPeak = Components.label(Text.literal("X RF/t"));
        inPeak.tooltip(Text.translatable("title.oritech.energy.inPeak.tooltip"));
        
        insertionContainer.child(inLastTick.margins(Insets.of(2)));
        insertionContainer.child(inAvgSecond.margins(Insets.of(2)));
        insertionContainer.child(inPeak.margins(Insets.of(2)));
        insertionContainer.child(inSources.margins(Insets.of(2)));
        
        var extractionContainer = Containers.verticalFlow(Sizing.fixed(94), Sizing.content());
        extractionContainer.surface(Surface.PANEL_INSET);
        extractionContainer.padding(Insets.of(2, 2, 4, 8));
        extractionContainer.positioning(Positioning.absolute(panelXPos, 23));
        
        outAvgSecond = Components.label(Text.literal("X RF/t"));
        outAvgSecond.tooltip(Text.translatable("title.oritech.energy.outAvgSecond.tooltip"));
        outLastTick = Components.label(Text.literal("X RF/t"));
        outLastTick.tooltip(Text.translatable("title.oritech.energy.outLastTick.tooltip"));
        outPeak = Components.label(Text.literal("X RF/t"));
        outPeak.tooltip(Text.translatable("title.oritech.energy.outPeak.tooltip"));
        
        extractionContainer.child(outLastTick.margins(Insets.of(2)));
        extractionContainer.child(outAvgSecond.margins(Insets.of(2)));
        extractionContainer.child(outPeak.margins(Insets.of(2)));
        
        overlay.child(insertionContainer);
        
        var toggleButton = Components.button(Text.literal("                  ").append(Text.translatable("title.oritech.item_filter.toggle_energy_statistics").withColor(BasicMachineScreen.GRAY_TEXT_COLOR)), buttonComponent -> {
            showingOutput = !showingOutput;
            if (showingOutput) {
                overlay.removeChild(insertionContainer);
                overlay.child(extractionContainer);
            } else {
                overlay.removeChild(extractionContainer);
                overlay.child(insertionContainer);
            }
        });
        toggleButton.horizontalSizing(Sizing.fixed(60));
        toggleButton.renderer(ItemFilterScreen.createToggleRenderer(ignored -> showingOutput));
        toggleButton.textShadow(false);
        overlay.child(toggleButton.positioning(Positioning.absolute(panelXPos, 5)));
        
        if (this.handler.blockEntity instanceof UnstableContainerBlockEntity unstableContainer) {
            var container = (DynamicEnergyStorage) unstableContainer.getEnergyStorageForMultiblock(null);
            var capacity = container.maxInsert;
            var capacityMultiplier = capacity / (UnstableContainerBlockEntity.BASE_CAPACITY * unstableContainer.qualityMultiplier);   // in percent, exponential
            var laserIcon = Components.item(new ItemStack(BlockContent.LASER_ARM_BLOCK.asItem()));
            var laserLabel = Components.label(Text.literal("x" + String.format("%.1f", capacityMultiplier)));
            
            Collection<Text> tooltipText = List.of(Text.translatable("tooltip.oritech.unstable_laser_tooltip"), Text.translatable("tooltip.oritech.unstable_laser_tooltip.2"));
            
            laserIcon.tooltip(tooltipText);
            laserLabel.tooltip(tooltipText);
            
            var laserContainer = Containers.verticalFlow(Sizing.fixed(44), Sizing.fixed(37));
            laserContainer.surface(Surface.PANEL_INSET);
            laserContainer.child(laserIcon.margins(Insets.of(2, 0, 0, 0)));
            laserContainer.child(laserLabel.margins(Insets.of(4, 2, 4, 4)));
            laserContainer.horizontalAlignment(HorizontalAlignment.CENTER);
            
            overlay.child(laserContainer.positioning(Positioning.absolute(27, 5)));
            
            var containedIcon = Components.item(new ItemStack(unstableContainer.capturedBlock.getBlock().asItem()));
            var containedLabel = Components.label(Text.literal("x" + unstableContainer.qualityMultiplier));
            var containedTooltipText = Text.translatable("tooltip.oritech.unstable_contained_tooltip");
            containedIcon.tooltip(containedTooltipText);
            containedLabel.tooltip(containedTooltipText);
            
            var containedContainer = Containers.verticalFlow(Sizing.fixed(44), Sizing.content());
            containedContainer.surface(Surface.PANEL_INSET);
            containedContainer.child(containedIcon.margins(Insets.of(2, 0, 0, 0)));
            containedContainer.child(containedLabel.margins(Insets.of(4, 2, 4, 4)));
            containedContainer.horizontalAlignment(HorizontalAlignment.CENTER);
            
            overlay.child(containedContainer.positioning(Positioning.absolute(27, 11 + 33 + 2)));
        }
        
    }
    
    @Override
    protected void handledScreenTick() {
        super.handledScreenTick();
        
        var entity = this.handler.blockEntity;
        var statistics = (entity instanceof ExpandableEnergyStorageBlockEntity) ? ((ExpandableEnergyStorageBlockEntity) entity).currentStats : ((UnstableContainerBlockEntity) entity).currentStats;
        if (statistics == null) return;
        
        var updateAll = this.handler.worldAccess.getTime() % 4 == 0;
        
        if (updateAll) {
            inAvgSecond.text(Text.translatable("title.oritech.energy.inAvgSecond", TooltipHelper.getEnergyText((long) statistics.avgInsertSecond())));
            inSources.text(Text.translatable("title.oritech.energy.inSources", statistics.insertionCountLastTick()));
            inPeak.text(Text.translatable("title.oritech.energy.inPeak", TooltipHelper.getEnergyText(statistics.maxInsertSecond())));
            outAvgSecond.text(Text.translatable("title.oritech.energy.outAvgSecond", TooltipHelper.getEnergyText((long) statistics.avgExtractSecond())));
            outPeak.text(Text.translatable("title.oritech.energy.outPeak", TooltipHelper.getEnergyText(statistics.maxExtractSecond())));
        }
        
        inLastTick.text(Text.translatable("title.oritech.energy.inLastTick", TooltipHelper.getEnergyText(statistics.insertedLastTickTotal())));
        outLastTick.text(Text.translatable("title.oritech.energy.outLastTick", TooltipHelper.getEnergyText(statistics.extractedLastTickTotal())));
        
        
    }
    
    @Override
    public boolean useHighTitle() {
        return true;
    }
    
    @Override
    public ItemStack getTitleIcon() {
        if (this.handler.blockEntity instanceof UnstableContainerBlockEntity) {
            return new ItemStack(ItemContent.UNSTABLE_CONTAINER);
        }
        return super.getTitleIcon();
    }
}