private void UpdatePower(IItem item, ItemStorageFridgePublicState publicState, ItemStorageFridgePrivateState privateState, bool isOn)
        {
            if (item.Container is null)
            {
                return;
            }

            var character = item.Container.OwnerAsCharacter;

            if (isOn)
            {
                publicState.IsOn = true; //force the client to refresh if isOn = false and stays false

                (double energyBefore, double totalEnergyMaxBefore) = this.SharedCalculateTotalEnergyCharge(item);
                publicState.LastPowerPourcent = (double)energyBefore / totalEnergyMaxBefore;

                publicState.IsOn = ServerDeductEnergyCharge(
                    character,
                    requiredEnergyAmount: this.EnergyConsumptionPerSecond * ServerUpdateIntervalSeconds,
                    publicState, privateState);

                (double energyAfter, double totalEnergyMaxAfter) = this.SharedCalculateTotalEnergyCharge(item);
                publicState.PowerPourcent = (double)energyAfter / totalEnergyMaxAfter;
            }
            else
            {
                publicState.IsOn = false;
            }
        }
        private bool ServerDeductEnergyCharge(ICharacter character, double requiredEnergyAmount,
                                              ItemStorageFridgePublicState publicState, ItemStorageFridgePrivateState privateState)
        {
            if (requiredEnergyAmount <= 0)
            {
                return(true);
            }

            List <IItem> list = privateState.ItemsEnergyContainer.GetItemsOfProto <IProtoItemPowerBank>().ToList();

            if (list.Count == 0)
            {
                // there are no battery packs equipped
                return(false);
            }

            // deduct energy in reverse order
            for (var index = list.Count - 1; index >= 0; index--)
            {
                var item = list[index];
                var powerBankPrivateState = list[index].GetPrivateState <ItemPowerBankPrivateState>();
                var charge = powerBankPrivateState.EnergyCharge;
                if (charge <= 0)
                {
                    // no charge there
                    continue;
                }

                if (charge >= requiredEnergyAmount)
                {
                    // there are more than enough charge available
                    powerBankPrivateState.EnergyCharge -= requiredEnergyAmount;
                    ServerOnEnergyUsed(item, requiredEnergyAmount);
                    return(true);
                }

                // use all the remaining charge in this item
                requiredEnergyAmount -= charge;
                powerBankPrivateState.EnergyCharge = 0;
                ServerOnEnergyUsed(item, charge);
            }

            return(false);
        }