NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/UI/Energy/EnergyManager.cs

369 lines
12 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/****************************************************
文件Assets/Code/Scripts/Gameplay/UI/Energy/EnergyManager.cs
作者yuntao-Hu
时间2024/5
描述:管理体力相关信息
接口:
public int ItemIDBuyEnergyCount()
public int GetItemIDBuyEnergy(int index)
public int GetMaxEnergyPoint()
public uint GetNowEnergy()
public DateTime GetNextEnergyRecoverTime()
public void BuyEnergy(int itemID, uint usageAmount)
public bool isItemCanBuyEnergy(int itemID)
public int GetConvertConsumes(int itemID, int usageAmount = 1)
public int GetConvertRecharges(int itemID, int usageAmount = 1)
*****************************************************/
using cfg.ActorCfg;
using Framework;
using Gameplay;
using Gameplay.Common;
using Gameplay.Net;
using NLDPB;
using PhxhSDK;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
public class EnergyManager : Singlenton<EnergyManager>
{
//private List<int> itemIdBuyEnergy = new List<int>(); //= { ENERGY_ITEM_ID, GLConfig.Inst.data.DiamondItemId };//更新体力补充方式时在此处添加物品ID
//按优先级顺序,将钻石补充方式放在最后
ConvertRatesWrap convertRatesWrap;
#region class
/// <summary>
/// 存储体力转换率
/// </summary>
class ConvertRatesWrap
{
public int energyItemID;
public readonly List<int> itemList;
private Dictionary<int, ConversionRate> convertRates;
public ConvertRatesWrap(int energyItemID)
{
this.energyItemID = energyItemID;
convertRates = new Dictionary<int, ConversionRate>();
itemList = new List<int>();
List<DataItem> consumeItems = CategoryManager.Instance.GetItemsByType(StorageItemType.ConsumableItem, inStorage: false);
foreach (var item in consumeItems)
{
if (item.Param2 == energyItemID)//物品可以转化为体力
{
int itemID = item.ID;
AddRate(itemID, RateConfig(itemID));
itemList.Add(itemID);
}
}
AddRate(GLConfig.Inst.data.DiamondItemId, CategoryManager.Instance.GetItemData(energyItemID).ExchangeParam[2], CategoryManager.Instance.GetItemData(energyItemID).ExchangeParam[0]);
//AddRate(GLConfig.Inst.data.DiamondItemId, RateConfig(GLConfig.Inst.data.DiamondItemId)); //按优先级顺序,将钻石补充方式放在最后
itemList.Add(GLConfig.Inst.data.DiamondItemId);
//itemIdBuyEnergy.Add(GLConfig.Inst.data.DiamondItemId);
//if (EnergyManager.Instance.itemIdBuyEnergy.Count == 0)
// Instance.loadAndInit(energyItemID);
//for (int i = 0; i < EnergyManager.Instance.itemIdBuyEnergy.Count; i++)
//{
// int itemID = EnergyManager.Instance.itemIdBuyEnergy[i];
// AddRate(itemID, RateConfig(itemID));
//}
}
List<int> RateConfig(int itemID)
{
//if (itemID == GLConfig.Inst.data.DiamondItemId)
//{
// return GLConfig.Inst.data.DiamondExchangeEnergy;
//}
//else
//{
DataItem itemData = CategoryManager.Instance.GetItemData(itemID);
if (itemData == null || itemData.Param2 != energyItemID)//param2为转化物品ID
{
DebugUtil.LogError("该道具不具备补充体力功能或并非可使用道具错误物品id " + itemID
+ "\n请检查是否错误的将其加入itemIdBuyEnergy数组或Item配置表中未配置道具转化参数");
return default;
}
return new List<int> { 1, itemData.Param3 };//兑换比例1→Param3
//}
}
void AddRate(int itemID, int consume, int recharge)
{
convertRates.Add(itemID, new ConversionRate(consume, recharge));
}
void AddRate(int itemID, List<int> exchangeRate)
{
if (exchangeRate == null)
{
DebugUtil.LogError("传入转化率list为null\n该物品已加入EnergyManager内itemIDBuyEnergy数组但未配置转化率错误物品id " + itemID);
return;
}
if (exchangeRate.Count >= 2)
convertRates.Add(itemID, new ConversionRate(exchangeRate[0], exchangeRate[1]));
else
DebugUtil.LogError("转化率list传入参数不足\n错误物品id " + itemID);
}
//API
public bool isRateContained(int itemID)
{
return convertRates.ContainsKey(itemID);
}
public int GetConsume(int itemID)
{
if (convertRates.ContainsKey(itemID))
{
return convertRates[itemID].consume;
}
else
{
DebugUtil.LogError("不包含的体力补充方式!请检查!");
return default;
}
}
public int GetRecharge(int itemID)
{
if (convertRates.ContainsKey(itemID))
{
return convertRates[itemID].recharge;
}
else
{
DebugUtil.LogError("不包含的体力补充方式!请检查!");
return default;
}
}
//class
public class ConversionRate
{
public int consume;
public int recharge;
public ConversionRate(int consume, int recharge)
{
this.consume = consume;
this.recharge = recharge;
}
}
}
#endregion
void loadAndInit(int energyID)
{
if (convertRatesWrap == null || energyID != convertRatesWrap.energyItemID)
{
convertRatesWrap = new ConvertRatesWrap(energyID);
}
}
#region API
public int ItemIDBuyEnergyCount(int energyID)
{
if (convertRatesWrap == null || convertRatesWrap.energyItemID != energyID)
{
loadAndInit(energyID);
}
return convertRatesWrap.itemList.Count;
}
/// <summary>
/// 根据索引获取购买体力物品ID
/// </summary>
/// <param name="index">补充体力方式索引</param>
/// <returns></returns>
public int GetItemIDBuyEnergy(int index, int energyID)
{
if (index < ItemIDBuyEnergyCount(energyID))
return convertRatesWrap.itemList[index];
else
{
DebugUtil.LogError("购买体力物品ID超出范围请检查");
return 0;
}
}
/// <summary>
/// 获取最大体力
/// </summary>
/// <returns></returns>
public int GetMaxEnergyPoint()
{
var level = Actor.Instance.Base.GetProp(ActorProp.Level);
var actorCfg = ActorLevelTableHelper.Instance.Get((int)level);
return actorCfg.MaxEnergy;
}
/// <summary>
/// 获取当前体力
/// </summary>
/// <returns></returns>
public uint GetNowEnergy(int energyID = 0)
{
if (energyID == 0)
{
energyID = GLConfig.Inst.data.EnergyPointID;
}
return CategoryManager.Instance.GetItemCount(energyID);
}
/// <summary>
/// 获取下一次体力恢复时间
/// </summary>
/// <returns></returns>
public DateTime GetNextEnergyRecoverTime()
{
DateTime lastDateTime = CommonUtils.GetTimeByTimestamp(Actor.Instance.Logic.GetCount((uint)LogicID.EnergyRecoverTime));
return lastDateTime.AddSeconds(TableManager.Instance.Tables.GlobalConfig.EnergyPointRecoverTime);
}
/// <summary>
/// 检查体力是否足够
/// </summary>
/// <param name="requireEnergy"></param>
/// <returns></returns>
public bool EnergyCheck(int requireEnergy)
{
int nowEnergy = (int)GetNowEnergy();
return nowEnergy >= requireEnergy;
}
/// <summary>
/// 获取最大战斗次数
/// </summary>
/// <param name="oneEnergy">一次战斗所需的体力</param>
/// <returns></returns>
public int GetMaxFightCount(int oneEnergy)
{
int nowEnergy = (int)GetNowEnergy();
return nowEnergy / oneEnergy;
}
/// <summary>
/// 兑换体力
/// </summary>
/// <param name="itemID">消耗物品ID</param>
/// <param name="usageAmount">物品使用份数</param>
public void BuyEnergy(int itemID, uint usageAmount, int energyID)
{
if (isItemCanBuyEnergy(itemID, energyID))
{
if (itemID == GLConfig.Inst.data.DiamondItemId)
{
NetHelper.ConvertResources((uint)itemID, usageAmount, (uint)energyID);
}
else
{
CategoryManager.Instance.UseItem(itemID, (int)usageAmount, energyID);
}//如果不是货币兑换方式,直接使用道具补充逻辑
}
}
/// <summary>
/// 该物品是否有补充体力功能
/// </summary>
/// <param name="itemID"></param>
/// <returns></returns>
public bool isItemCanBuyEnergy(int itemID,int energyID)
{
if (convertRatesWrap == null)
{
convertRatesWrap = new ConvertRatesWrap(energyID);
}
else
{
if (convertRatesWrap.energyItemID != energyID)
{
convertRatesWrap = new ConvertRatesWrap(energyID);
}
}
return convertRatesWrap.isRateContained(itemID);
}
/// <summary>
/// 每份物品补充体力时的物品实际消耗量,参数可设定份数
/// </summary>
/// <param name="itemID"></param>
/// <param name="usageAmount">物品份数</param>
/// <returns></returns>
public int GetConvertConsumes(int itemID, int usageAmount = 1)
{
if (isItemCanBuyEnergy(itemID, convertRatesWrap.energyItemID))
return usageAmount * convertRatesWrap.GetConsume(itemID);
else
{
DebugUtil.LogError("补充体力列表内不包含该物品,不可补充体力!请检查\n错误物品ID: " + itemID);
return 0;
}
}
/// <summary>
/// 每份物品补充体力时的体力补充量,参数可设定份数
/// </summary>
/// <param name="itemID"></param>
/// <param name="usageAmount">物品份数</param>
/// <returns></returns>
public int GetConvertRecharges(int itemID, int usageAmount = 1)
{
if (isItemCanBuyEnergy(itemID, convertRatesWrap.energyItemID))
return usageAmount * convertRatesWrap.GetRecharge(itemID);
else
{
DebugUtil.LogError("补充体力列表内不包含该物品,不可补充体力!请检查\n错误物品ID: " + itemID);
return 0;
}
}
/// <summary>
/// 获取当前选中状态下的最大消耗数目(实际数据需要乘比例转化)
/// </summary>
/// <param name="itemID"></param>
/// <param name="itemLimited"></param>
/// <returns></returns>
public int MaxConsumeAmountWithoutConvert(int itemID, out bool itemLimited)
{
int maxConsumeRate = 0;
int maxConsumeRateByEnergy = 0;
if (!ValueValidator.IsIdValid(itemID))
{
DebugUtil.LogError("补充体力方式对应的物品ID不合规请检查配置\n错误物品ID: " + itemID);
}
int consumePerItem = GetConvertConsumes(itemID);
int rechargePerItem = GetConvertRecharges(itemID);
//道具数目限制
uint AmountInStorage = CategoryManager.Instance.GetItemCount(itemID);
if (consumePerItem != 0)
maxConsumeRate = (int)(AmountInStorage / consumePerItem);
//体力上限限制
uint energyToMax = (uint)CategoryManager.Instance.GetItemMaxCount(convertRatesWrap.energyItemID) - CategoryManager.Instance.GetItemCount(convertRatesWrap.energyItemID);
if (rechargePerItem != 0)
maxConsumeRateByEnergy = (int)(energyToMax / rechargePerItem);
itemLimited = maxConsumeRate <= maxConsumeRateByEnergy;
return Math.Min(maxConsumeRate, maxConsumeRateByEnergy);
}
public int GetMaxEnergyByLevel(int level)
{
var cfg = ActorLevelTableHelper.Instance.Get(level);
if (cfg != null)
{
return cfg.MaxEnergy;
}
return 0;
}
#endregion
}