using com.jbrettob.data.vo.items.mechanics; using com.jbrettob.enemies; using com.jbrettob.traps; using UnityEngine; using com.jbrettob.net.xml; [RequireComponent(typeof(AmmoMechanic))] public class ShootMechanic:AbstractGameMechanic { public Transform projectilePrefab; // private Trap _trap; [SerializeField] private ShootMechanicData _data; private float _cooldown; private float _attackRange; // private float _timer = 0f; private AmmoMechanic _ammoMechanic; private RotateMechanic _rotateMechanic; public void setData(Trap trap, ShootMechanicData data) { setData(trap, data, null); } public void setData(Trap trap, ShootMechanicData data, RotateMechanic rotateMechanic) { _trap = trap; _timer = 0f; _data = data; _cooldown = _timer = _data.cooldown; _attackRange = _data.attackRange; _ammoMechanic = gameObject.GetSafeComponent(); _ammoMechanic.setData(_data.ammoMechanicData, _trap); _rotateMechanic = rotateMechanic; setProjectile(); } private void setProjectile() { switch (_trap.itemProperties.projectileModel) { case Projectile.MODEL.ARROW: projectilePrefab = ResourceManager.getInstance().projectilePrefabs[0]; break; case Projectile.MODEL.BALL: projectilePrefab = ResourceManager.getInstance().projectilePrefabs[1]; break; case Projectile.MODEL.BALL_SPIKES: projectilePrefab = ResourceManager.getInstance().projectilePrefabs[2]; break; default: projectilePrefab = ResourceManager.getInstance().projectilePrefabs[0]; break; } projectilePrefab.CreatePool(); } void Start() { _rotateMechanic = gameObject.GetComponentInChildren(); } void Update() { if (!_trap.isPlaced()) return; if (_ammoMechanic.ammo > 0) { if (_timer <= 0f) { Vector3 fwd = gameObject.transform.TransformDirection(Vector3.forward); if (debug) Debug.DrawRay(gameObject.transform.position + (Vector3.up * .5f), fwd * _attackRange, Color.magenta); if (_rotateMechanic != null && !_rotateMechanic.isReady()) { return; } RaycastHit hit; if (Physics.Raycast(gameObject.transform.position + (Vector3.up * .5f), fwd, out hit, _attackRange)) { Enemy enemy = hit.collider.gameObject.GetComponent(); if (enemy != null) { shootProjectile(); _timer = _cooldown; } } } else { _timer -= Time.deltaTime * TimeScale.TIME; } } } private void shootProjectile() { if (debug) logDebug("shootProjectile() pos: " + gameObject.transform.position); Vector3 spawnPos = gameObject.transform.position; spawnPos.y += .5f; Quaternion rotatePos = (_rotateMechanic != null && _rotateMechanic.trapModelRotate != null) ? _rotateMechanic.trapModelRotate.transform.rotation : gameObject.transform.rotation; Transform to = ObjectPool.Spawn(projectilePrefab, spawnPos, rotatePos) as Transform; _data.projectileData.setLifeTime(_data.attackRange); to.GetComponent().data = _data.projectileData; // TODO: turned off removing ammo for the showcase //_ammoMechanic.ammo--; if (_trap.anim != null && _trap.anim.clip != null) _trap.anim.Play(); if (_trap.audio != null) _trap.audio.Play(); } public override IXmlParsable data { get { return _data; } } public AmmoMechanic ammoMechanic { get { return _ammoMechanic; } } }