using System.Collections; using System.Collections.Generic; using System.Linq; using BITFALL.Entities; using BITKit; using BITKit.Entities; using BITKit.Sensors; using UnityEngine; using UnityEngine.Pool; namespace BITFALL.Props { public struct ExplosionDamageMessage : IDamageType,IPlayerExplosionDamage { } 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(entity.TryGetComponent(out var stunObject)) { stunObject.Stun(Vector3.Distance(transform.position, entity.transform.position), 0.5f); } if (damaged.TryAdd(entity.Id)) { DamageService.Singleton.Execute(new DamageMessage() { Target = entity, Damage = (int)damageCurve.Evaluate(Vector3.Distance(transform.position, entity.transform.position)), DamageType = new ExplosionDamageMessage() }); // 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); } } } }