using System.Threading.Tasks; using NaughtyAttributes; using UnityEngine; using Weapons; namespace Util { public class MineEffectorTypingObject : MonoBehaviour { [BoxGroup("Effect Type ")] public string type; [BoxGroup("Effect Type ")] public OreItemType typeAxe = OreItemType.DEFULT; [BoxGroup("Effect Type ")] [SerializeField] private MeshCollider objectMeshCollider; [BoxGroup("Effect Type ")] [SerializeField] private MeshFilter objectMesh; [BoxGroup("Effect Type ")] [SerializeField] private bool hasParticleEffector = false; [BoxGroup("Effect Type ")] [ShowIf(nameof(hasParticleEffector))] [SerializeField] private EffectorParticle weapon; [BoxGroup("Effect Type ")] public Effect baseEffect; public EffectorParticle Get => weapon; public void CreateEffectByRayHit(RaycastHit hit) { if (baseEffect == null || baseEffect.effect == null) return; var hitPoint = hit.point; var offset = hit.normal * 0.09f; var effectPosition = hitPoint + offset; PlayEffectAtPosition(TryGetEffectByName(type), effectPosition); } public void PlayEffectByIndex(int effect) => PlayEffect(TryGetEffect(effect),TryGetTarget()); public void PlayEffectByIndexAtPosition(int effect, Vector3 position) => PlayEffectAtPosition(TryGetEffect(effect),position); public void PlayEffectByIndexAtTransform(int effect, Transform targetExtern) => PlayEffectAtTransform(TryGetEffect(effect), targetExtern); public void PlayEffectByIndexAtPositionAndRotation(int effect, Vector3 position, Quaternion rotation) => PlayEffectAtPositionAndRotation(TryGetEffect(effect),position, rotation); public Effect TryGetEffectByName(string effectName) { var index = -1; if (hasParticleEffector) index = weapon.effectsTyping.IndexOf(effectName); return index == -1 ? TryGetEffect(index, true) : TryGetEffect(index, false); } private Effect TryGetEffect(int index, bool isBaseEffect = false) { if (hasParticleEffector && !isBaseEffect) return Get.effects[index]; return baseEffect; } private Transform TryGetTarget() { return this.transform; } private static async void PlayEffect(Effect effect, Transform selfTransform) { if (effect == null || effect.effect == null) return; var spawnedEffect = selfTransform != null ? Instantiate(effect.effect, selfTransform.position, selfTransform.rotation) : Instantiate(effect.effect); await AwaitToEffectRunTime(effect, spawnedEffect); } private static async void PlayEffectAtPosition(Effect effect, Vector3 position) { if (effect == null || effect.effect == null) return; GameObject spawnedEffect = Instantiate(effect.effect, position, Quaternion.identity); await AwaitToEffectRunTime(effect, spawnedEffect); } private static async void PlayEffectAtPositionAndRotation(Effect effect, Vector3 position, Quaternion rotation) { if (effect == null || effect.effect == null) return; GameObject spawnedEffect = Instantiate(effect.effect, position, rotation); await AwaitToEffectRunTime(effect, spawnedEffect); } private static async void PlayEffectAtTransform(Effect effect, Transform target) { if (effect == null || effect.effect == null) return; GameObject spawnedEffect = Instantiate(effect.effect, target.position, target.rotation); await AwaitToEffectRunTime(effect, spawnedEffect); } private static async Task AwaitToEffectRunTime(Effect effect, GameObject spawnedEffect) { if (effect.autoDestroy) { await Task.Delay((int)(effect.liveTime * 1000)); ObjectDestroyer(spawnedEffect); } } private static void ObjectDestroyer(GameObject spawnedEffect) { if (spawnedEffect.gameObject != null) Destroy(spawnedEffect); } } }