public override void SharedUpdate(double deltaTime)
        {
            if ((this.ItemCrowbarTool is not null &&
                 this.ItemCrowbarTool != this.CharacterPublicState.SelectedItem) ||
                !this.CheckIsAllowed())
            {
                // selected hotbar item changed or the action is not allowed anymore
                this.AbortAction();
                return;
            }

            if (!DeconstructionSystem.SharedCheckCanInteract(
                    this.Character,
                    this.WorldObject,
                    writeToLog: true))
            {
                this.AbortAction();
                return;
            }

            this.currentStageTimeRemainsSeconds -= deltaTime;
            if (this.currentStageTimeRemainsSeconds <= 0)
            {
                this.SharedOnStageCompleted();
            }

            this.UpdateProgress();
        }
        private void SharedOnStageCompleted()
        {
            if (Api.IsServer &&
                this.ItemCrowbarTool is not null)
            {
                // notify tool was used
                ServerItemUseObserver.NotifyItemUsed(this.Character, this.ItemCrowbarTool);

                // reduce tool durability
                ItemDurabilitySystem.ServerModifyDurability(this.ItemCrowbarTool, delta: -1);
            }

            this.currentStageDurationSeconds     = this.CalculateStageDurationSeconds(this.Character, isFirstStage: false);
            this.currentStageTimeRemainsSeconds += this.currentStageDurationSeconds;

            var oldStructurePoints = this.ObjectPublicState.StructurePointsCurrent;
            var newStructurePoints = Math.Max(
                0,
                oldStructurePoints - this.stageStructureRemoveValue);

            this.protoStructure.SharedOnDeconstructionStage(
                this.WorldObject,
                this.Character,
                oldStructurePoints,
                newStructurePoints);

            if (Api.IsClient || // client will simply always deconstruct until finished
                newStructurePoints > 0)
            {
                // deconstruction progressed
                if (Api.IsServer)
                {
                    Logger.Important(
                        $"Deconstruction progressed: {this.WorldObject} structure points: {newStructurePoints}/{this.structurePointsMax}; by {this.Character}");
                }

                this.UpdateProgress();

                if (Api.IsServer &&
                    this.ItemCrowbarTool is not null &&
                    this.ItemCrowbarTool.IsDestroyed)
                {
                    // tool was destroyed (durability 0)
                    this.AbortAction();
                    return;
                }

                return;
            }

            // deconstruction is completed
            if (Api.IsServer)
            {
                if (!(this.protoStructure is ProtoObjectConstructionSite))
                {
                    this.CharacterPrivateState.Skills.ServerAddSkillExperience <SkillBuilding>(
                        SkillBuilding.ExperienceAddWhenDeconstructionFinished);
                }

                Logger.Important(
                    $"Deconstruction completed: {this.WorldObject} structure points: {newStructurePoints}/{this.structurePointsMax}; by {this.Character}");
                this.ObjectPublicState.StructurePointsCurrent = newStructurePoints;
            }

            this.SetCompleted(isCancelled: false);
            DeconstructionSystem.SharedActionCompleted(this.Character, this);
        }
 protected override void AbortAction()
 {
     DeconstructionSystem.SharedAbortAction(
         this.Character,
         this.WorldObject);
 }