using com.jbrettob.traps; using UnityEngine; using com.jbrettob; using com.jbrettob.data.vo.items.mechanics; using com.jbrettob.enemies; using System.Collections.Generic; public class DamageOverTimeMechanic:AbstractGameMechanic { private Trap _trap; [SerializeField] private float _timer = 0f; private bool _initialized; [SerializeField] private Enemy _enemy; [SerializeField] private DamageOverTimeMechanicData _data; [SerializeField] private AmmoMechanic _ammoMechanic; public void setData(DamageOverTimeMechanicData data) { setData(data, null); } public void setData(DamageOverTimeMechanicData data, Trap trap) { if (_initialized) return; _trap = trap; _data = data; _timer = 1; _initialized = true; } void Start() { _enemy = gameObject.GetComponent(); if (_enemy != null) { Destroy (this, _data.time); } else { _ammoMechanic = _trap.GetComponent(); } } void Update() { if (_trap != null && !_trap.isPlaced()) return; if (_ammoMechanic != null && _ammoMechanic.ammo <= 0) return; bool attacked = false; if (_enemy == null) { if (_timer <= 0) { for (int i = 0 ; i < getTargetsInRange().Count; i++) { addDot(getTargetsInRange()[i]); attacked = true; } if (attacked && _ammoMechanic != null) { _ammoMechanic.ammo--; } _timer = 1; } else { _timer -= Time.deltaTime * TimeScale.TIME; } } else { if (_timer <= 0) { if (_enemy != null) { _enemy.hit(_data.damage); } _timer = 1; } else { _timer -= Time.deltaTime * TimeScale.TIME; } } } private List getTargetsInRange() { List target = new List(); float distance = +_data.attackRange; float tempDistance; for (int i = 0; i < SpawnManager.getInstance().enemies.Count; i++) { tempDistance = Vector3.Distance(gameObject.transform.position, SpawnManager.getInstance().enemies[i].transform.position); if (tempDistance < distance) { target.Add(SpawnManager.getInstance().enemies[i]); } } return target; } private void addDot(Enemy enemy) { if (_trap.audio != null) _trap.audio.Play(); enemy.hit(_data.damage); } public AmmoMechanic ammoMechanic { get { return _ammoMechanic; } } void OnDrawGizmos() { if (!debug && _enemy != null) return; Gizmos.color = Color.red; Gizmos.DrawWireSphere(transform.position, _data.attackRange); } }