using System.Collections; using System.Collections.Generic; using System.Linq; using BITKit; using BITKit.Entities; using BITKit.Sensors; using UnityEngine; using UnityEngine.Pool; namespace BITFALL.Props { public class Prop_Explosive : MonoBehaviour { [SerializeReference, SubclassSelector] private ISensor rangeSensor; [SerializeReference, SubclassSelector] private IReference[] vfxTags; [SerializeField] private LayerMask physicsLayer; [SerializeField] private float explosionRadius; [SerializeField] private AnimationCurve damageCurve; public virtual void Explosion(GameObject root = null) { var damaged = ListPool.Get(); DI.Get().Spawn(new Location(transform), vfxTags.Select(x => x.Value).ToArray()); foreach (var x in rangeSensor.Get()) { if (x.TryGetComponent(out var entity) is false) continue; if (damaged.TryAdd(entity.Id)) { entity.Invoke(new DamageMessage() { Target = entity, Damage = (int)damageCurve.Evaluate(Vector3.Distance(transform.position, entity.transform.position)) }); } } damaged.Clear(); ListPool.Release(damaged); PhysicsHelper.Explosion(transform.position, explosionRadius, physicsLayer, 1024 * 8); Destroy(gameObject); if (root) { Destroy(root); } } } }