private void UpdateMining() { if (WorldRaycaster.IsHit && Input.GetMouseButtonDown(1)) { var playerPosition = WorldModelHelper.FloorPositionToVector3Int(_playerBody.Transform.position); if (WorldRaycaster.LastPosition != playerPosition && WorldRaycaster.LastPosition != playerPosition + Vector3Int.up) { WorldModel.EditVoxel(WorldRaycaster.LastPosition, (byte)InventoryModel.SelectedBlockType); } } if (!_isMining) { //check if we could start mining if (WorldRaycaster.IsHit && Input.GetMouseButton(0)) { //START MINING _isMining = true; UpdateCursorsVisibility(); _miningStartedTime = Time.time; } } else { if (!WorldRaycaster.IsHit || !Input.GetMouseButton(0)) { //STOP MINING _isMining = false; UpdateCursorsVisibility(); _mineBlockCursor.SetMiningProgress(0); _pick.transform.localRotation = Quaternion.identity; return; } var miningLength = Time.time - _miningStartedTime; var hits = Mathf.FloorToInt(miningLength / _playerSettings.MiningInterval); var blockHardness = _minedBlockType.Hardness; var animProgress = _playerSettings.PickMovementCurve.Evaluate((miningLength % _playerSettings.MiningInterval) / _playerSettings.MiningInterval); _pick.transform.localRotation = Quaternion.Euler(new Vector3(-45 * animProgress, 0, 0)); //blockHardness == means indestructible //finish mining (remove block) if (hits >= blockHardness && blockHardness != 0) { WorldModel.EditVoxel(_lastMinePosition, BlockTypeByte.AIR); UpdateCursorsVisibility(); return; } //anim block if (blockHardness > 0) { _mineBlockCursor.SetMiningProgress(hits / (float)blockHardness); } } }