public string Execute(
            double chargePercent = 100,
            [CurrentCharacterIfNull] ICharacter character = null)
        {
            var chargeFraction = MathHelper.Clamp(chargePercent / 100, min: 0, max: 1);

            using var tempLandClaims = Api.Shared.GetTempList <ILogicObject>();
            LandClaimSystem.SharedGetAreasInBounds(
                new RectangleInt(character.TilePosition, (1, 1)),
                tempLandClaims,
                addGracePadding: false);

            var landClaim = tempLandClaims.AsList().FirstOrDefault();

            if (landClaim is null)
            {
                return("No power grid exist near " + character.Name);
            }

            var landClaimAreasGroup = LandClaimSystem.SharedGetLandClaimAreasGroup(landClaim);
            var powerGrid           = LandClaimAreasGroup.GetPrivateState(landClaimAreasGroup).PowerGrid;
            var powerGridState      = PowerGrid.GetPublicState(powerGrid);

            powerGridState.ElectricityAmount = powerGridState.ElectricityCapacity * chargeFraction;

            return($"Charge amount of the power grid modified to {chargeFraction * 100}%");
        }
        private void RefreshSafeStorageAndPowerGrid()
        {
            var objectPublicState = this.landClaimWorldObject.GetPublicState <ObjectLandClaimPublicState>();
            var area                   = objectPublicState.LandClaimAreaObject;
            var areasGroup             = LandClaimArea.GetPublicState(area).LandClaimAreasGroup;
            var areasGroupPrivateState = LandClaimAreasGroup.GetPrivateState(areasGroup);

            // setup power grid
            var powerGrid = areasGroupPrivateState.PowerGrid;
            var oldViewModelPowerGridState = this.ViewModelPowerGridState;

            this.ViewModelPowerGridState = new ViewModelPowerGridState(PowerGrid.GetPublicState(powerGrid));
            oldViewModelPowerGridState?.Dispose();

            // setup safe storage
            this.DisposeViewModelItemsContainerExchange();

            this.ViewModelItemsContainerExchange = new ViewModelItemsContainerExchange(
                areasGroupPrivateState.ItemsContainer,
                callbackTakeAllItemsSuccess: () => { },
                enableShortcuts: this.IsSafeStorageAvailable)
            {
                IsContainerTitleVisible = false,
            };

            this.ViewModelItemsContainerExchange.Container.SlotsCountChanged
                += this.SafeStorageSlotsChangedHandler;

            this.ViewModelItemsContainerExchange.Container.ItemsReset
                += this.SafeStorageSlotsChangedHandler;
        }
        private void Refresh()
        {
            var oldViewModel = this.ViewModelPowerGridState;

            var powerGrid = this.privateState.PowerGrid;

            this.ViewModelPowerGridState = powerGrid is null
                                               ? null
                                               : new ViewModelPowerGridState(PowerGrid.GetPublicState(powerGrid));

            oldViewModel?.Dispose();
        }