Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using Assets.Scripts.Enemies;
- using Assets.Scripts.Enums;
- using Assets.Scripts.GameSystems.Leveling;
- using Assets.Scripts.Interfaces;
- using Assets.Scripts.Interfaces.Weapons;
- using Assets.Scripts.ScriptableObjects;
- using Assets.Scripts.ScriptableObjects.Stats;
- using Assets.Scripts.Weapons.Components;
- using System;
- using UnityEngine;
- namespace Assets.Scripts.Weapons.Base
- {
- [RequireComponent(typeof(WeaponCooldownTimer))]
- [RequireComponent(typeof(WeaponLevelSystem))]
- internal abstract class BaseWeapon : MonoBehaviour, IWeapon
- {
- public event EventHandler CooldownFinished;
- [SerializeField] protected WeaponType _weaponType;
- [SerializeField] protected WeaponTargetingPriority _targetingPriority;
- [SerializeField] protected WeaponAttackMode _attackMode;
- [SerializeField] protected BaseWeaponProperties _properties;
- [SerializeField] protected WeaponCooldownTimer _weaponCooldownTimer;
- [SerializeField] protected WeaponLevelSystem _levelSystem;
- public string Name => gameObject.name.Replace("(Clone)", string.Empty);
- public Vector3 Position => transform.position;
- public WeaponType Type => _weaponType;
- public WeaponTargetingPriority TargettingPriority => _targetingPriority;
- public WeaponAttackMode AttackMode => _attackMode;
- public IWeaponProperties Properties => _properties;
- public ILevelSystem LevelSystem => _levelSystem;
- protected virtual void Awake()
- {
- GetComponents();
- _weaponCooldownTimer.Duration = Properties.Cooldown;
- }
- protected virtual void OnEnable()
- {
- _weaponCooldownTimer.Completed += WeaponCooldownTimer_OnCompleted;
- _weaponCooldownTimer.StartTimer();
- }
- protected virtual void OnDisable()
- {
- _weaponCooldownTimer.StopTimer();
- _weaponCooldownTimer.Completed -= WeaponCooldownTimer_OnCompleted;
- }
- protected virtual void GetComponents()
- {
- _weaponCooldownTimer ??= GetComponent<WeaponCooldownTimer>();
- _levelSystem ??= GetComponent<WeaponLevelSystem>();
- }
- private void WeaponCooldownTimer_OnCompleted(object sender, EventArgs e)
- {
- CooldownFinished?.Invoke(this, e);
- }
- public abstract void Attack(EnemyCharacter target);
- public abstract void AttackMany(EnemyCharacter[] targets);
- public virtual void AddAttributeDependency(CharacterStats stats)
- {
- _properties.Damage.AddAttribute(stats.Might);
- _properties.Cooldown.AddAttribute(stats.WeaponCooldown);
- _properties.Speed.AddAttribute(stats.ProjectileSpeed);
- _properties.Amount.AddAttribute(stats.Amount);
- _properties.Area.AddAttribute(stats.Area);
- _properties.Duration.AddAttribute(stats.Duration);
- }
- public virtual void RemoveAttributeDependency(CharacterStats stats)
- {
- _properties.Damage.RemoveAttribute(stats.Might);
- _properties.Cooldown.RemoveAttribute(stats.WeaponCooldown);
- _properties.Speed.RemoveAttribute(stats.ProjectileSpeed);
- _properties.Amount.RemoveAttribute(stats.Amount);
- _properties.Area.RemoveAttribute(stats.Area);
- _properties.Duration.RemoveAttribute(stats.Duration);
- }
- public virtual void AddAttributeModifier(WeaponProperties properties)
- {
- _properties.Damage.AddRawBonus(properties.Damage);
- _properties.Cooldown.AddRawBonus(properties.Cooldown);
- _properties.Speed.AddRawBonus(properties.Speed);
- _properties.Amount.AddRawBonus(properties.Amount);
- _properties.Area.AddRawBonus(properties.Area);
- _properties.Pierce.AddRawBonus(properties.Pierce);
- _properties.Duration.AddRawBonus(properties.Duration);
- }
- public ITimer GetCooldownTimer()
- {
- return _weaponCooldownTimer;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement