RyanHub – file viewer
filename: common/src/main/java/rearth/oritech/item/tools/armor/BackstorageExoArmorItem.java
branch: 1.21
back to repo
package rearth.oritech.item.tools.armor;

import net.minecraft.entity.Entity;
import net.minecraft.entity.EquipmentSlot;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ArmorMaterial;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.tooltip.TooltipType;
import net.minecraft.registry.entry.RegistryEntry;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
import net.minecraft.world.World;
import rearth.oritech.Oritech;
import rearth.oritech.api.energy.EnergyApi;
import rearth.oritech.api.energy.containers.SimpleEnergyItemStorage;
import rearth.oritech.item.tools.util.OritechEnergyItem;
import rearth.oritech.util.StackContext;
import rearth.oritech.util.TooltipHelper;

import java.util.List;

import static rearth.oritech.item.tools.harvesting.DrillItem.BAR_STEP_COUNT;

public class BackstorageExoArmorItem extends ExoArmorItem implements OritechEnergyItem {
    
    public BackstorageExoArmorItem(RegistryEntry<ArmorMaterial> material, Type type, Item.Settings settings) {
        super(material, type, settings);
    }
    
    @Override
    public void inventoryTick(ItemStack stack, World world, Entity entity, int slot, boolean selected) {
        if (world.isClient) return;
        
        var tickPeriod = 10;
        if (world.getTime() % tickPeriod != 0) return;
        
        var isPlayer = entity instanceof PlayerEntity;
        var isEquipped = ((PlayerEntity) entity).getEquippedStack(EquipmentSlot.CHEST).equals(stack);
        
        if (isPlayer && isEquipped) {
            distributePower((PlayerEntity) entity, stack, slot);
        }
    }
    
    private void distributePower(PlayerEntity player, ItemStack pack, int slot) {
        
        var packStorage = new SimpleEnergyItemStorage(getEnergyMaxInput(pack), getEnergyMaxOutput(pack), getEnergyCapacity(pack), pack);
        if (packStorage.getAmount() < 10) return;

        for (int i = 0; i < player.getInventory().size(); i++) {
            var stack = player.getInventory().getStack(i);
            if (stack.isEmpty() || stack == pack || slot == i) continue;
            
            final int finalI = i;
            var stackRef = new StackContext(stack, updated -> player.getInventory().setStack(finalI, updated));
            var stackStorage = EnergyApi.ITEM.find(stackRef);
            if (stackStorage == null || stackStorage.getAmount() >= stackStorage.getCapacity()) continue;
            
            EnergyApi.transfer(packStorage, stackStorage, Long.MAX_VALUE, false);
            
            // player.getInventory().setStack(i, stackContext.getStack());
        }
    }
    
    @Override
    public long getEnergyCapacity(ItemStack stack) {
        return Oritech.CONFIG.exoChestplate.energyCapacity();
    }
    
    @Override
    public long getEnergyMaxInput(ItemStack stack) {
        return Oritech.CONFIG.exoChestplate.chargeSpeed();
    }
    
    @Override
    public long getEnergyMaxOutput(ItemStack stack) {
        return Oritech.CONFIG.exoChestplate.energyUsage();
    }
    
    @Override
    public boolean isItemBarVisible(ItemStack stack) {
        return true;
    }
    
    @Override
    public int getItemBarColor(ItemStack stack) {
        return 0xff7007;
    }
    
    public int getItemBarStep(ItemStack stack) {
        return Math.round((getStoredEnergy(stack) * 100f / this.getEnergyCapacity(stack)) * BAR_STEP_COUNT) / 100;
    }
    
    @Override
    public void appendTooltip(ItemStack stack, TooltipContext context, List<Text> tooltip, TooltipType type) {
        super.appendTooltip(stack, context, tooltip, type);
        var text = Text.translatable("tooltip.oritech.energy_indicator", TooltipHelper.getEnergyText(this.getStoredEnergy(stack)), TooltipHelper.getEnergyText(this.getEnergyCapacity(stack)));
        tooltip.add(text.formatted(Formatting.GOLD));
    }
}