using UnityEngine; /// /// Mining behavior for pickaxes and similar tools. /// Supports both legacy MineableBlock and new chunk-based MineableChunk. /// [CreateAssetMenu(menuName = "Items/Behaviors/Mining Behavior")] public class MiningBehavior : ItemBehavior { [Header("Mining Settings")] [SerializeField] private int damage = 50; private void OnEnable() { // Set default mining values if (string.IsNullOrEmpty(behaviorName)) behaviorName = "Mine"; if (string.IsNullOrEmpty(animTrigger)) animTrigger = "Attack"; canRepeat = true; } public override bool CanUse(GameObject user, GameObject target) { // Can always swing, but only deals damage if hitting a mineable block return true; } public override void Use(GameObject user, GameObject target) { if (target == null) return; // Try chunk-based mining first (new system) if (target.TryGetComponent(out var chunk)) { // Get the specific block index from PlayerNetworkController var playerController = user.GetComponent(); if (playerController != null) { var chunkTarget = playerController.GetCurrentChunkTarget(); if (chunkTarget.hasHit && chunkTarget.chunk == chunk) { // Damage the specific block within the chunk chunk.DamageBlockServerRpc(chunkTarget.blockIndex, (byte)Mathf.Min(255, damage)); return; } } return; } // Fallback to legacy IDamageable interface if (target.TryGetComponent(out var damageable)) { damageable.TakeDamage(new DamageInfo(damage, DamageType.Mining, user)); } } public override string GetBlockedReason(GameObject user, GameObject target) { if (target == null) return "No target"; // Check for chunk if (target.TryGetComponent(out _)) return null; // Chunks are always mineable // Check for legacy damageable if (!target.TryGetComponent(out _)) return "Cannot mine this object"; return null; } }