53 lines
1.5 KiB
C#
53 lines
1.5 KiB
C#
using System;
|
|
using Data;
|
|
using Interfaces;
|
|
using Sirenix.OdinInspector;
|
|
using Sirenix.Serialization;
|
|
using UnityEngine;
|
|
using Attribute = Data.Attribute;
|
|
|
|
namespace Weapons
|
|
{
|
|
public abstract class Weapon : MonoBehaviour, IWeapon
|
|
{
|
|
private float timer;
|
|
|
|
[OdinSerialize, InlineProperty] public WeaponStats weaponStats = new();
|
|
public AudioClip shotSound;
|
|
public Character character;
|
|
|
|
private void Update()
|
|
{
|
|
timer -= Time.deltaTime;
|
|
|
|
if (!(timer <= 0f)) return;
|
|
|
|
Fire();
|
|
timer = 1f / GetFinalAttackSpeed();
|
|
}
|
|
|
|
private float GetFinalAttackSpeed()
|
|
{
|
|
return character.attributes.Get(Attribute.AttackSpeed) * weaponStats.attackSpeed;
|
|
}
|
|
|
|
protected float GetFinalDamage()
|
|
{
|
|
return weaponStats.damage + character.attributes.Get(Attribute.Damage) *
|
|
(weaponStats.damageType == DamageType.Melee ? character.attributes.Get(Attribute.MeleeDamage) : character.attributes.Get(Attribute.RangedDamage));
|
|
}
|
|
|
|
protected float GetFinalRange()
|
|
{
|
|
return weaponStats.range * character.attributes.Get(Attribute.AttackRange);
|
|
}
|
|
|
|
protected void PlayShotSound()
|
|
{
|
|
if (!shotSound) return;
|
|
AudioSource.PlayClipAtPoint(shotSound, transform.position);
|
|
}
|
|
|
|
public abstract void Fire();
|
|
}
|
|
} |