using System.Collections.Generic; using System.Linq; public partial class TianziConfig : ConfigBase { //> private static Dictionary> bossIDAllInfoDict = new Dictionary>(); protected override void OnConfigParseCompleted() { if (!bossIDAllInfoDict.ContainsKey(BossID)) { bossIDAllInfoDict[BossID] = new Dictionary(); } bossIDAllInfoDict[BossID][HPNum] = this; } public static bool TryGetAllInfoDictByBossID(int BossID, out Dictionary dict) { return bossIDAllInfoDict.TryGetValue(BossID, out dict); } public static bool TryGetTianziConfigByBossIDAndHPNum(int BossID, int HPNum, out TianziConfig tianziConfig) { tianziConfig = null; if (bossIDAllInfoDict.TryGetValue(BossID, out var hpDict)) { if (hpDict.TryGetValue(HPNum, out tianziConfig)) { return true; } } return false; } public static bool TryGetTianziConfigByBossIDAndMaxHP(int BossID, long MaxHP, out TianziConfig tianziConfig) { tianziConfig = null; if (bossIDAllInfoDict.TryGetValue(BossID, out var hpDict)) { foreach (var item in hpDict.Values) { if (item.MaxHP == MaxHP) { tianziConfig = Get(item.ID); return true; } } } return false; } /// /// 根据传入的伤害计算当前是哪个血条,返回对应的TianziConfig /// /// Boss ID /// 累计伤害值 /// 返回的TianziConfig /// 是否成功找到对应的血条配置 public static bool TryGetTianziConfigByBossIDAndDamage(int BossID, ulong damage, out TianziConfig tianziConfig) { tianziConfig = null; if (!bossIDAllInfoDict.TryGetValue(BossID, out var hpDict)) return false; // 按血条编号排序,从小到大计算累计生命值 var sortedHPNums = hpDict.Keys.ToList(); sortedHPNums.Sort(); ulong accumulatedHP = 0; foreach (int hpNum in sortedHPNums) { if (!hpDict.TryGetValue(hpNum, out var config)) continue; // 累计生命值 accumulatedHP += (ulong)config.MaxHP; // 如果伤害 <= 累计生命值,说明当前血条就是这个 if (damage <= accumulatedHP) { tianziConfig = Get(config.ID); return true; } } // 如果伤害 >= 所有血条的总生命值,返回最后一个血条 if (sortedHPNums.Count > 0) { var lastHPNum = sortedHPNums[sortedHPNums.Count - 1]; if (hpDict.TryGetValue(lastHPNum, out var lastConfig)) { tianziConfig = Get(lastConfig.ID); return true; } } return false; } public static ulong GetCurrentHPDamage(int BossID, ulong totalDamage) { if (!bossIDAllInfoDict.TryGetValue(BossID, out var hpDict)) return 0; var sortedHPNums = hpDict.Keys.ToList(); sortedHPNums.Sort(); ulong accumulatedHP = 0; ulong previousAccumulatedHP = 0; foreach (int hpNum in sortedHPNums) { if (!hpDict.TryGetValue(hpNum, out var config)) continue; // 累计生命值 previousAccumulatedHP = accumulatedHP; accumulatedHP += (ulong)config.MaxHP; // 如果总伤害 <= 累计生命值,说明当前血条就是这个 if (totalDamage <= accumulatedHP) { // 对当前血条造成的伤害 = 总伤害 - 之前血条的总生命值 ulong currentHPDamage = totalDamage - previousAccumulatedHP; return currentHPDamage; } } return totalDamage - accumulatedHP; } }