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

import net.minecraft.block.entity.BlockEntity;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.world.World;
import rearth.oritech.client.init.ModScreens;
import rearth.oritech.init.BlockContent;
import rearth.oritech.util.MachineAddonController;

import java.util.Objects;

import static rearth.oritech.block.base.entity.UpgradableMachineBlockEntity.AddonUiData;

public class UpgradableMachineScreenHandler extends BasicMachineScreenHandler {
    
    protected final AddonUiData addonUiData;
    protected final World worldAccess;
    protected final float quality;
    
    public UpgradableMachineScreenHandler(int syncId, PlayerInventory inventory, PacketByteBuf buf) {
        this(syncId, inventory, ModScreens.UpgradableData.PACKET_CODEC.decode(buf));
    }
    
    public UpgradableMachineScreenHandler(int syncId, PlayerInventory inventory, ModScreens.UpgradableData data) {
        this(syncId, inventory, Objects.requireNonNull(inventory.player.getWorld().getBlockEntity(data.pos())), data.addonUiData(), data.coreQuality());
    }
    
    // on server, also called from client constructor
    public UpgradableMachineScreenHandler(int syncId, PlayerInventory playerInventory, BlockEntity blockEntity, AddonUiData addonUiData, float coreQuality) {
        super(syncId, playerInventory, blockEntity);
        this.addonUiData = addonUiData;
        
        // sync speed and efficiency to client entity, so the getProgress method works correctly
        if (playerInventory.player.getWorld().isClient() && blockEntity instanceof MachineAddonController upgradableEntity) {
            var baseData = new MachineAddonController.BaseAddonData(addonUiData.speed(), addonUiData.efficiency(), 100, 100, addonUiData.extraChambers());
            upgradableEntity.setBaseAddonData(baseData);
        }
        
        this.worldAccess = playerInventory.player.getWorld();
        this.quality = coreQuality;
    }
    
    @Override
    public boolean showRedstoneAddon() {
        return super.showRedstoneAddon() ||
                 addonUiData.positions().stream().anyMatch(addonPos -> this.worldAccess.getBlockState(addonPos).getBlock().equals(BlockContent.MACHINE_REDSTONE_ADDON));
    }
}