FPSGame/Assets/Weapons/AmmoBelt.cs

97 lines
2.5 KiB
C#

using System;
using System.ComponentModel;
using System.Linq;
using UnityEngine;
public enum AmmoType
{
[Description("1A")]
CrossbowAmmo,
[Description("5.56mm")]
HandgunAmmo,
[Description("9mm")]
MachinegunAmmo,
[Description("11.5mm")]
RevolverAmmo,
}
public class AmmoBelt : MonoBehaviour
{
[Serializable] private class AmmoSlot
{
[field: SerializeField] public AmmoType AmmoType { get; set; }
[field: SerializeField] public int MaxBeltAmmoAmount { get; set; }
[field: SerializeField] public int CurrentBeltAmmoAmount { get; set; }
}
[Header("State")]
[SerializeField] private AmmoSlot[] _ammoSlots;
[SerializeField] private FloatVariable _S_currentBeltAmmoAmount;
[Header("State")]
[SerializeField] private AmmoType _currentWeaponAmmoType;
public AmmoType CurrentWeaponAmmoType
{
get => _currentWeaponAmmoType;
set => _currentWeaponAmmoType = value;
}
private void Awake()
{
InitializeAmmoBelt();
}
private void InitializeAmmoBelt()
{
foreach (AmmoSlot ammoSlot in _ammoSlots)
{
ammoSlot.CurrentBeltAmmoAmount = ammoSlot.MaxBeltAmmoAmount;
}
}
public int GetBeltCurrentAmmoAmount(AmmoType ammoType)
{
return GetAmmoSlot(ammoType).CurrentBeltAmmoAmount;
}
public int GetBeltMaxAmmoAmount(AmmoType ammoType)
{
return GetAmmoSlot(ammoType).MaxBeltAmmoAmount;
}
public void SetBeltCurrentAmmoAmount(AmmoType ammoType, int value)
{
var ammoSlot = GetAmmoSlot(ammoType);
ammoSlot.CurrentBeltAmmoAmount = value;
ammoSlot.CurrentBeltAmmoAmount =
Mathf.Clamp(ammoSlot.CurrentBeltAmmoAmount, 0, ammoSlot.MaxBeltAmmoAmount);
UpdateBeltAmmoUI(ammoSlot.AmmoType);
}
public void ModifyBeltCurrentAmmoAmount(AmmoType ammoType, int value)
{
var ammoSlot = GetAmmoSlot(ammoType);
ammoSlot.CurrentBeltAmmoAmount += value;
ammoSlot.CurrentBeltAmmoAmount =
Mathf.Clamp(ammoSlot.CurrentBeltAmmoAmount, 0, ammoSlot.MaxBeltAmmoAmount);
UpdateBeltAmmoUI(ammoSlot.AmmoType);
}
private AmmoSlot GetAmmoSlot(AmmoType ammoType)
{
return _ammoSlots.FirstOrDefault(ammoSlot => ammoType == ammoSlot.AmmoType);
}
public void UpdateBeltAmmoUI(AmmoType ammoType)
{
if (_currentWeaponAmmoType == ammoType)
{
_S_currentBeltAmmoAmount.Value = GetBeltCurrentAmmoAmount(ammoType);
}
}
}