| | |
| | | if (battleField != null) |
| | | { |
| | | var battleObj = battleField.battleObjMgr.GetBattleObject((int)skill.ObjID); |
| | | if (battleObj != null && battleObj.teamHero != null) |
| | | if (battleObj != null) |
| | | { |
| | | heroName = battleObj.teamHero.name; |
| | | heroName = battleObj.GetName(); |
| | | } |
| | | } |
| | | |
| | |
| | | if (battleField != null) |
| | | { |
| | | var targetObj = battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID); |
| | | if (targetObj != null && targetObj.teamHero != null) |
| | | if (targetObj != null) |
| | | { |
| | | targetName = targetObj.teamHero.name; |
| | | targetName = targetObj.GetName(); |
| | | } |
| | | } |
| | | result += $"{indentStr} [{j}] Target - ObjID:{hurt.ObjID} Name:{targetName} HurtHP:{hurt.HurtHP} AttackTypes:{hurt.AttackTypes}\n"; |
| | |
| | | if (battleField != null) |
| | | { |
| | | var targetExObj = battleField.battleObjMgr.GetBattleObject((int)hurtEx.ObjID); |
| | | if (targetExObj != null && targetExObj.teamHero != null) |
| | | if (targetExObj != null) |
| | | { |
| | | targetExName = targetExObj.teamHero.name; |
| | | targetExName = targetExObj.GetName(); |
| | | } |
| | | } |
| | | result += $"{indentStr} [{k}] ExTarget - ObjID:{hurtEx.ObjID} Name:{targetExName} HurtHP:{hurtEx.HurtHP} AttackTypes:{hurtEx.AttackTypes}\n"; |
| | |
| | | if (battleField != null) |
| | | { |
| | | var targetExObj = battleField.battleObjMgr.GetBattleObject((int)hurtEx.ObjID); |
| | | if (targetExObj != null && targetExObj.teamHero != null) |
| | | if (targetExObj != null) |
| | | { |
| | | targetExName = targetExObj.teamHero.name; |
| | | targetExName = targetExObj.GetName(); |
| | | } |
| | | } |
| | | result += $"{indentStr} [{j}] ExTarget - ObjID:{hurtEx.ObjID} Name:{targetExName} HurtHP:{hurtEx.HurtHP} AttackTypes:{hurtEx.AttackTypes}\n"; |
| | |
| | | if (battleField != null) |
| | | { |
| | | var battleObj = battleField.battleObjMgr.GetBattleObject((int)mainSkill.ObjID); |
| | | if (battleObj != null && battleObj.teamHero != null) |
| | | if (battleObj != null) |
| | | { |
| | | heroName = battleObj.teamHero.name; |
| | | heroName = battleObj.GetName(); |
| | | } |
| | | } |
| | | } |
| | |
| | | if (battleField != null) |
| | | { |
| | | var battleObj = battleField.battleObjMgr.GetBattleObject((int)deadPack.ObjID); |
| | | if (battleObj != null && battleObj.teamHero != null) |
| | | if (battleObj != null) |
| | | { |
| | | heroName = battleObj.teamHero.name; |
| | | heroName = battleObj.GetName(); |
| | | } |
| | | } |
| | | result += $"{indentStr}[{i}] HB422_tagMCTurnFightObjDead - ObjID:{deadPack.ObjID} HeroName:{heroName} UID:{deadPack.packUID}\n"; |
| | |
| | | if (field.Name == "ObjID" && value is uint objId && battleField != null) |
| | | { |
| | | var battleObj = battleField.battleObjMgr.GetBattleObject((int)objId); |
| | | string heroName = battleObj?.teamHero?.name ?? "Unknown"; |
| | | string heroName = battleObj?.GetName() ?? "Unknown"; |
| | | sb.AppendLine(indentStr + $" {field.Name} ({fieldType.Name}): {value} [{heroName}]"); |
| | | } |
| | | // 特殊处理:显示SkillID对应的技能名字 |
| | |
| | | Debug.LogErrorFormat("封包是否为Null:{0};", _package == null); |
| | | if (_package != null) |
| | | { |
| | | Debug.LogErrorFormat("封包编号是:{0};", _package.cmd); |
| | | Debug.LogErrorFormat("封包编号是:{0}; 名是{1}", _package.cmd, _package.GetType().Name); |
| | | } |
| | | } |
| | | } |
| | |
| | | long res = 0; |
| | | foreach (var obj in Team) |
| | | { |
| | | if (obj.teamHero == null) |
| | | if (obj is not HeroBattleObject) |
| | | continue; |
| | | res += obj.teamHero.fightPower; |
| | | res += obj.GetFightPower(); |
| | | } |
| | | return res; |
| | | } |
| | |
| | | |
| | | for (int i = 0; i < myHeroHeads.Count; i++) |
| | | { |
| | | if (i < myTeam.Count) |
| | | if (i < myTeam.Count && myTeam[i] is HeroBattleObject heroBattleObject) |
| | | { |
| | | myHeroHeads[i].SetActive(true); |
| | | var teamHero = myTeam[i].teamHero; |
| | | var teamHero = heroBattleObject.teamHero; |
| | | myHeroHeads[i].Display(teamHero.heroId, teamHero.SkinID, teamHero.level); |
| | | } |
| | | else |
| | |
| | | { |
| | | int teamIndex = enemyHeroHeads.Count - 1 - i; // 建立反向映射 |
| | | |
| | | if (teamIndex < enemyTeam.Count) |
| | | if (teamIndex < enemyTeam.Count && enemyTeam[teamIndex] is HeroBattleObject heroBattleObject) |
| | | { |
| | | enemyHeroHeads[i].SetActive(true); |
| | | var teamHero = enemyTeam[teamIndex].teamHero; // 使用映射后的索引 |
| | | var teamHero = heroBattleObject.teamHero; // 使用映射后的索引 |
| | | enemyHeroHeads[i].Display(teamHero.heroId, teamHero.SkinID, teamHero.level); |
| | | } |
| | | else |
| | |
| | | { |
| | | for (int i = 0; i < battleObjects.Count; i++) |
| | | { |
| | | sun += (ulong)battleObjects[i].teamHero.maxHp; |
| | | sun += (ulong)battleObjects[i].GetMaxHp(); |
| | | } |
| | | } |
| | | return sun; |
| | |
| | | { |
| | | for (int i = 0; i < battleObjects.Count; i++) |
| | | { |
| | | sun += (ulong)battleObjects[i].teamHero.curHp; |
| | | sun += (ulong)battleObjects[i].GetCurHp(); |
| | | } |
| | | } |
| | | return sun; |
| | |
| | | return teamHeroes; |
| | | foreach (var item in teams) |
| | | { |
| | | teamHeroes.Add(item.teamHero); |
| | | if (item is HeroBattleObject heroBattleObject) |
| | | { |
| | | teamHeroes.Add(heroBattleObject.teamHero); |
| | | } |
| | | } |
| | | return teamHeroes; |
| | | |
| | |
| | | if (battleField == null || battleField.guid != guid) |
| | | return; |
| | | |
| | | if (null == teamHero) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | BattleObject battleObject = battleField.battleObjMgr.GetBattleObject(teamHero.ObjID); |
| | | if (battleObject == null) |
| | | return; |
| | |
| | | |
| | | public RectTransform GetTeamNode(BattleCamp battleCamp, BattleObject target) |
| | | { |
| | | int index = target.teamHero.positionNum; |
| | | int index = target.GetPositionNum(); |
| | | return GetTeamNode(battleCamp, index); |
| | | } |
| | | |
| | |
| | | |
| | | public RectTransform GetTeamNode(BattleCamp battleCamp, int index) |
| | | { |
| | | if (index < 0 || index >= battleRootNode.redTeamNodeList.Count) |
| | | if (index == 99) |
| | | { |
| | | return battleCamp == BattleCamp.Red ? battleRootNode.redTeamNodeList[0].transform as RectTransform |
| | | : battleRootNode.blueTeamNodeList[0].transform as RectTransform; |
| | | } |
| | | |
| | | if (index < 0 || index >= battleRootNode.redTeamNodeList.Count ) |
| | | { |
| | | Debug.LogError($"GetTeamNode: Index {index} is out of range for {battleCamp} camp."); |
| | | return null; |
| | |
| | | BattleObject battleObj = battleObjMgr.GetBattleObject((int)vNetData.ObjID); |
| | | if (null != battleObj) |
| | | { |
| | | battleObj.buffMgr.RefreshBuff(vNetData); |
| | | var buffMgr = battleObj.GetBuffMgr(); |
| | | if (buffMgr != null) // 命格不有 buff 管理器 |
| | | { |
| | | buffMgr.RefreshBuff(vNetData); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | BattleObject battleObj = battleObjMgr.GetBattleObject((int)vNetData.ObjID); |
| | | if (null != battleObj) |
| | | { |
| | | battleObj.buffMgr.RemoveBuff(vNetData); |
| | | var buffMgr = battleObj.GetBuffMgr(); |
| | | if (buffMgr != null) // 命格不有 buff 管理器 |
| | | { |
| | | buffMgr.RemoveBuff(vNetData); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | if (config != null) |
| | | { |
| | | int bossId = config.BossID; |
| | | BattleObject bo = battleObjMgr.allBattleObjDict.Values.FirstOrDefault(bo => bo.teamHero.NPCID == bossId); |
| | | BattleObject bo = battleObjMgr.allBattleObjDict.Values.FirstOrDefault(bo => bo.GetNPCID() == bossId); |
| | | return bo; |
| | | } |
| | | return null; |
| | |
| | | // for (int i = 0; i < deadPackList.Count; i++) |
| | | // { |
| | | // BattleObject battleObject = battleField.battleObjMgr.GetBattleObject((int)deadPackList[i].deadPack.ObjID); |
| | | // Debug.LogError($"DeathRecordAction: 初始化死亡动作,死亡对象名字={battleObject?.teamHero.name}, hasDeathTriggerSkill={deadPackList[i].deadTriggerSkill != null}"); |
| | | // Debug.LogError($"DeathRecordAction: 初始化死亡动作,死亡对象名字={battleObject?.GetName()}, hasDeathTriggerSkill={deadPackList[i].deadTriggerSkill != null}"); |
| | | // } |
| | | |
| | | parentSkillAction = _parentSkillAction; |
| | |
| | | foreach (var deadPack in deadPackList) |
| | | { |
| | | BattleObject deadObj = battleField.battleObjMgr.GetBattleObject((int)deadPack.deadPack.ObjID); |
| | | string name = deadObj?.teamHero?.name ?? "Unknown"; |
| | | string name = deadObj?.GetName() ?? "Unknown"; |
| | | deadNames += name + ","; |
| | | } |
| | | deadNames = deadNames.TrimEnd(','); |
| | |
| | | Sequence sequence = DOTween.Sequence(); |
| | | |
| | | // 播放复活特效 |
| | | battleField.battleEffectMgr.PlayEffect(battleObj, BattleConst.RebornEffectID, battleObj.GetRectTransform(), battleObj.Camp, battleObj.teamHero.modelScale); |
| | | battleField.battleEffectMgr.PlayEffect(battleObj, BattleConst.RebornEffectID, battleObj.GetRectTransform(), battleObj.Camp, battleObj.GetModelScale()); |
| | | |
| | | // 渐变 |
| | | battleObj.SetSkeletonAlpha(0f); |
| | |
| | | { |
| | | if (skillBase != null && skillBase.caster != null) |
| | | { |
| | | string casterName = skillBase.caster.teamHero?.name ?? "Unknown"; |
| | | string casterName = skillBase.caster.GetName(); |
| | | int skillId = skillBase.skillConfig?.SkillID ?? 0; |
| | | string skillName = skillBase.skillConfig?.SkillName ?? "Unknown"; |
| | | Debug.LogError($"[SkillRecordAction首次Run] 施法者:{casterName} 技能ID:{skillId} 技能名:{skillName}"); |
| | |
| | | { |
| | | int bossId = lineupConfig.BossID; |
| | | |
| | | BattleObject bo = battleObjMgr.allBattleObjDict.Values.FirstOrDefault(bo => bo.teamHero.NPCID == bossId); |
| | | BattleObject bo = battleObjMgr.allBattleObjDict.Values.FirstOrDefault(bo => bo.GetNPCID() == bossId); |
| | | |
| | | return bo; |
| | | } |
| | |
| | | if (config != null) |
| | | { |
| | | int bossId = config.BossID; |
| | | BattleObject bo = battleObjMgr.allBattleObjDict.Values.FirstOrDefault(bo => bo.teamHero.NPCID == bossId); |
| | | BattleObject bo = battleObjMgr.allBattleObjDict.Values.FirstOrDefault(bo => bo.GetNPCID() == bossId); |
| | | return bo; |
| | | } |
| | | return null; |
| | |
| | | if (config != null) |
| | | { |
| | | int bossId = config.BossID; |
| | | BattleObject bo = battleObjMgr.allBattleObjDict.Values.FirstOrDefault(bo => bo.teamHero.NPCID == bossId); |
| | | BattleObject bo = battleObjMgr.allBattleObjDict.Values.FirstOrDefault(bo => bo.GetNPCID() == bossId); |
| | | return bo; |
| | | } |
| | | return null; |
| | |
| | | |
| | | public Dictionary<int, BattleObject> allBattleObjDict = new Dictionary<int, BattleObject>(); |
| | | |
| | | public MinggeBattleObject redMingge = null; |
| | | |
| | | public MinggeBattleObject blueMingge = null; |
| | | |
| | | protected BattleField battleField; |
| | | |
| | | public void Init(BattleField _battleField, TeamBase _redTeam, TeamBase _blueTeam) |
| | |
| | | BattleObject battleObj = BattleObjectFactory.CreateBattleObject(battleField, posNodeList, teamHero, _Camp); |
| | | battleObj.SetActive(active); |
| | | allBattleObjDict.Add(battleObj.ObjID, battleObj); |
| | | campDict.Add(teamHero.positionNum, battleObj); |
| | | campDict.Add(battleObj.GetPositionNum(), battleObj); |
| | | battleObj.SetSpeedRatio(battleField.speedRatio); |
| | | } |
| | | } |
| | | |
| | | if (teamBase.teamMingge != null) |
| | | { |
| | | BattleObject minggeObj = BattleObjectFactory.CreateMinggeBattleObject(battleField, teamBase, _Camp); |
| | | allBattleObjDict.Add(minggeObj.ObjID, minggeObj); |
| | | campDict.Add(minggeObj.GetPositionNum(), minggeObj); |
| | | minggeObj.SetSpeedRatio(battleField.speedRatio); |
| | | if (_Camp == BattleCamp.Red) |
| | | { |
| | | redMingge = minggeObj as MinggeBattleObject; |
| | | } |
| | | else |
| | | { |
| | | blueMingge = minggeObj as MinggeBattleObject; |
| | | } |
| | | } |
| | | } |
| | |
| | | { |
| | | return battleObj; |
| | | } |
| | | |
| | | if (blueMingge != null && blueMingge.ObjID == objId) |
| | | { |
| | | return blueMingge; |
| | | } |
| | | |
| | | if (redMingge != null && redMingge.ObjID == objId) |
| | | { |
| | | return redMingge; |
| | | } |
| | | |
| | | return null; |
| | | } |
| | | |
| | |
| | | { |
| | | if (battleObj.Camp == BattleCamp.Red) |
| | | { |
| | | redCampDict.Remove(battleObj.teamHero.positionNum); |
| | | redCampDict.Remove(battleObj.GetPositionNum()); |
| | | } |
| | | else |
| | | { |
| | | blueCampDict.Remove(battleObj.teamHero.positionNum); |
| | | blueCampDict.Remove(battleObj.GetPositionNum()); |
| | | } |
| | | allBattleObjDict.Remove((int)objID); |
| | | BattleObjectFactory.DestroyBattleObject((int)objID, battleObj); |
| | |
| | | DestroyTeam(redCampDict); |
| | | DestroyTeam(blueCampDict); |
| | | allBattleObjDict.Clear(); |
| | | redMingge = null; |
| | | blueMingge = null; |
| | | } |
| | | |
| | | public void Run() |
| | |
| | | //暂时没有召唤物 |
| | | // 放在第7格的BOSS后排的。。位置放在正中间 |
| | | // a)前排,1、2、3号为前排,前排全部阵亡后,4、5、6号即是前排也是后排 7其实也是后排 |
| | | List<BattleObject> frontList = new List<BattleObject>(from BO in returnList where BO.teamHero.positionNum < 3 && !BO.IsDead() select BO); |
| | | List<BattleObject> frontList = new List<BattleObject>(from BO in returnList where BO.GetPositionNum() < 3 && !BO.IsDead() select BO); |
| | | if (frontList.Count == 0) |
| | | { |
| | | frontList.AddRange(returnList); |
| | |
| | | returnList = frontList; |
| | | break; |
| | | case SkillTargetRangeType.Back: |
| | | List<BattleObject> backList = new List<BattleObject>(from BO in returnList where BO.teamHero.positionNum >= 3 && !BO.IsDead() select BO); |
| | | List<BattleObject> backList = new List<BattleObject>(from BO in returnList where BO.GetPositionNum() >= 3 && !BO.IsDead() select BO); |
| | | if (backList.Count == 0) |
| | | { |
| | | backList.AddRange(returnList); |
| | |
| | | loweastHpObj = returnList[i]; |
| | | continue; |
| | | } |
| | | if (returnList[i].teamHero.curHp < loweastHpObj.teamHero.curHp) |
| | | if (returnList[i].GetCurHp() < loweastHpObj.GetCurHp()) |
| | | { |
| | | loweastHpObj = returnList[i]; |
| | | } |
| | |
| | | { |
| | | public BattleField battleField; |
| | | |
| | | public BattleObjectBuffMgr buffMgr; |
| | | |
| | | public BattleObjectLayerMgr layerMgr; |
| | | |
| | | public int ObjID { get; set; } |
| | | |
| | | public BattleCamp Camp { get; protected set; } |
| | | |
| | | public TeamHero teamHero { get; protected set; } |
| | | |
| | | public BattleObject(BattleField _battleField) |
| | | { |
| | | battleField = _battleField; |
| | | } |
| | | |
| | | public abstract void Init(TeamHero _teamHero, BattleCamp _camp); |
| | | // ============ 抽象访问方法(子类返回各自的Team类型信息) ============ |
| | | |
| | | public abstract int GetPositionNum(); |
| | | public abstract float GetModelScale(); |
| | | public abstract string GetName(); |
| | | |
| | | // Buff 管理器访问方法(Hero 有 buff,Mingge 返回 null) |
| | | public abstract BattleObjectBuffMgr GetBuffMgr(); |
| | | |
| | | // 状态查询抽象方法 |
| | | protected abstract bool GetIsStunned(); |
| | | protected abstract bool GetIsFrozen(); |
| | | protected abstract bool GetIsStoned(); |
| | | protected abstract bool GetIsSlient(); |
| | | protected abstract bool GetIsDisarmed(); |
| | | protected abstract bool GetIsInvincible(); |
| | | protected abstract bool GetIsDead(); |
| | | public abstract int GetRage(); |
| | | |
| | | // 血量相关抽象方法(Hero 特有,Mingge 返回默认值) |
| | | public abstract long GetCurHp(); |
| | | public abstract long GetMaxHp(); |
| | | public abstract void SetCurHp(long value); |
| | | public abstract void SetIsDead(bool value); |
| | | |
| | | // 其他属性访问方法 |
| | | public abstract int GetNPCID(); |
| | | public abstract long GetFightPower(); |
| | | |
| | | public abstract void Run(); |
| | | |
| | |
| | | // 眩晕 |
| | | public bool IsStunned() |
| | | { |
| | | return teamHero.isStunned; |
| | | return GetIsStunned(); |
| | | } |
| | | |
| | | // 冰冻 |
| | | public bool IsFrozen() |
| | | { |
| | | return teamHero.isFrozen; |
| | | return GetIsFrozen(); |
| | | } |
| | | |
| | | // 石化 |
| | | public bool IsStoned() |
| | | { |
| | | return teamHero.isStoned; |
| | | return GetIsStoned(); |
| | | } |
| | | |
| | | // 被沉默 |
| | | public bool IsSlient() |
| | | { |
| | | return teamHero.isSlient; |
| | | return GetIsSlient(); |
| | | } |
| | | |
| | | // 被缴械 |
| | | public bool IsDisarmed() |
| | | { |
| | | return teamHero.isDisarmed; |
| | | return GetIsDisarmed(); |
| | | } |
| | | |
| | | // 是否无敌 |
| | | public bool IsInvincable() |
| | | { |
| | | return teamHero.isInvinceble; |
| | | return GetIsInvincible(); |
| | | } |
| | | |
| | | // 是否死亡 |
| | | public bool IsDead() |
| | | { |
| | | return teamHero.isDead; |
| | | return GetIsDead(); |
| | | } |
| | | |
| | | // 是否被控住了 |
| | |
| | | } |
| | | |
| | | // 看看怒气是否达到释放要求 |
| | | return teamHero.rage >= 100; |
| | | return GetRage() >= 100; |
| | | } |
| | | |
| | | public virtual bool IsCanNormalAttack() |
| | |
| | | if (hasReflectHp && casterDmgInfo.casterDamageList != null && casterDmgInfo.casterDamageList.Count > 0) |
| | | { |
| | | long totalReflect = casterDmgInfo.casterDamageList.Sum(d => d.damage); |
| | | if (totalReflect > 0 && !buffMgr.isControled[BattleConst.HardControlGroup]) |
| | | var buffMgr = GetBuffMgr(); |
| | | if (totalReflect > 0 && buffMgr != null && !buffMgr.isControled[BattleConst.HardControlGroup]) |
| | | { |
| | | OnPlayHitAnimation(); |
| | | } |
| | |
| | | { |
| | | BattleCastObj caster = battleHurtParam.caster; |
| | | |
| | | // 应用血量变化 |
| | | teamHero.curHp = caster.toHp; |
| | | // 应用血量变化(由子类实现) |
| | | ApplyCasterHpChange(caster.toHp); |
| | | |
| | | // 打印所有角色的名字和当前血量跟总血量 |
| | | // foreach (var obj in battleField.battleObjMgr.allBattleObjDict.Values) |
| | |
| | | /// 播放受击动画(只有 Hero 有实现,Mingge 留空) |
| | | /// </summary> |
| | | protected abstract void OnPlayHitAnimation(); |
| | | |
| | | /// <summary> |
| | | /// 应用施法者血量变化(吸血/反伤) |
| | | /// </summary> |
| | | protected abstract void ApplyCasterHpChange(long newHp); |
| | | } |
| | |
| | | { |
| | | heroBattleObject.Init(realGO, teamHero, _Camp); |
| | | } |
| | | else |
| | | { |
| | | battleObject.Init(teamHero, _Camp); |
| | | } |
| | | // 其他类型(如MinggeBattleObject)不在这里创建,有单独的创建逻辑 |
| | | |
| | | #if UNITY_EDITOR |
| | | BattleDebug.LogError( |
| | | "初始化 未行动" + |
| | | (battleObject.Camp == BattleCamp.Red ? "【红方】" : "【蓝方】 ") + |
| | | $"武将: {battleObject.teamHero.name}\n" + |
| | | $"当前血量: {battleObject.teamHero.curHp} -> 最大血量{battleObject.teamHero.maxHp}\n" |
| | | $"武将: {battleObject.GetName()}\n" + |
| | | $"当前血量: {battleObject.GetCurHp()} -> 最大血量{battleObject.GetMaxHp()}\n" |
| | | ); |
| | | #endif |
| | | |
| | |
| | | battleObj.Destroy(); |
| | | battleObj = null; |
| | | } |
| | | |
| | | public static BattleObject CreateMinggeBattleObject(BattleField battleField, TeamBase teamBase, BattleCamp camp) |
| | | { |
| | | MinggeBattleObject minggeBattleObject = new MinggeBattleObject(battleField); |
| | | minggeBattleObject.Init(teamBase, teamBase.teamMingge, camp); |
| | | minggeBattleObject.ObjID = teamBase.teamMingge.ObjID; |
| | | return minggeBattleObject; |
| | | } |
| | | } |
| | |
| | | public void Init(BattleObject battleObj) |
| | | { |
| | | this.battleObj = battleObj; |
| | | frontCharRendererAdjuster = battleObj.GetGameObject()?.AddMissingComponent<RendererAdjuster>(); |
| | | behindCharRendererAdjuster = battleObj.GetRectTransform()?.Find("Hero/Follower/BattleHeroInfoBar/BehindHero")?.gameObject?.AddMissingComponent<RendererAdjuster>(); |
| | | |
| | | if (battleObj is MinggeBattleObject) |
| | | { |
| | | |
| | | } |
| | | else |
| | | { |
| | | frontCharRendererAdjuster = battleObj.GetGameObject()?.AddMissingComponent<RendererAdjuster>(); |
| | | behindCharRendererAdjuster = battleObj.GetRectTransform()?.Find("Hero/Follower/BattleHeroInfoBar/BehindHero")?.gameObject?.AddMissingComponent<RendererAdjuster>(); |
| | | |
| | | |
| | | frontCharRendererAdjuster.canvasOffset = BattleConst.BattleFrontCharUIOffset; |
| | | behindCharRendererAdjuster.canvasOffset = BattleConst.BattleBehindCharUIOffset; |
| | | frontCharRendererAdjuster.canvasOffset = BattleConst.BattleFrontCharUIOffset; |
| | | behindCharRendererAdjuster.canvasOffset = BattleConst.BattleBehindCharUIOffset; |
| | | } |
| | | |
| | | } |
| | | |
| | | public void SetSortingOrder(int sortingOrder) |
| | |
| | | public GameObject heroGo => _heroGo; |
| | | |
| | | public MotionBase motionBase; |
| | | |
| | | public TeamHero teamHero { get; private set; } |
| | | |
| | | // Buff 管理器(只有 Hero 有 buff 系统) |
| | | public BattleObjectBuffMgr buffMgr; |
| | | |
| | | private RectTransform m_heroRectTrans; |
| | | |
| | |
| | | public void Init(GameObject _heroGo, TeamHero _teamHero, BattleCamp _camp) |
| | | { |
| | | this._heroGo = _heroGo; |
| | | Init(_teamHero, _camp); |
| | | } |
| | | |
| | | public override void Init(TeamHero _teamHero, BattleCamp _camp) |
| | | { |
| | | teamHero = _teamHero; |
| | | Camp = _camp; |
| | | ObjID = _teamHero.ObjID; |
| | | InitInternal(); |
| | | } |
| | | |
| | | |
| | | private void InitInternal() |
| | | { |
| | | motionBase = new MotionBase(); |
| | | motionBase.Init(_heroGo.GetComponentInChildren<SkeletonAnimation>(true)); |
| | | buffMgr = new BattleObjectBuffMgr(); |
| | |
| | | heroInfoBar.SetActive(true); |
| | | } |
| | | SetFront(); |
| | | |
| | | if (battleField.ToString() != BattleConst.StoryBattleField && |
| | | battleField.ToString() != BattleConst.TianziBillboradBattleField) |
| | | { |
| | | var hitArea = heroGo.GetComponent<Image>(); |
| | | if (hitArea == null) |
| | | { |
| | | hitArea = heroGo.AddComponent<Image>(); |
| | | hitArea.color = new Color(0, 0, 0, 0); //让射线检测到 |
| | | } |
| | | |
| | | var btn = heroGo.GetComponent<ButtonEx>(); |
| | | if (btn == null) |
| | | { |
| | | btn = heroGo.AddComponent<ButtonEx>(); |
| | | btn.interval = 0.5f;// 防止频繁连续点击 |
| | | } |
| | | |
| | | btn.AddListener(() => |
| | | { |
| | | // 判断点击的是我方阵营还是敌方阵营,目前左边都是我方阵营 |
| | | bool isMySide = Camp == BattleCamp.Red; |
| | | EventBroadcast.Instance.Broadcast(EventName.BATTLE_CLICK_HERO, new BattleClickHeroData() |
| | | { |
| | | battleName = battleField.ToString(), |
| | | isMySide = isMySide, |
| | | mapID = battleField.MapID, |
| | | funcLineID = battleField.FuncLineID, |
| | | npcID = teamHero.NPCID, |
| | | posNum = teamHero.positionNum, |
| | | heroID = teamHero.heroId, |
| | | teams = battleField?.battleObjMgr.GetBattleObjList(isMySide ? BattleCamp.Red : BattleCamp.Blue), |
| | | }); |
| | | }); |
| | | } |
| | | } |
| | | |
| | | public override void Run() |
| | |
| | | motionBase.ResetForReborn(false); |
| | | isReborning = false; |
| | | } |
| | | |
| | | // ============ 实现抽象访问方法 ============ |
| | | |
| | | public override BattleObjectBuffMgr GetBuffMgr() => buffMgr; |
| | | |
| | | public override int GetPositionNum() => teamHero.positionNum; |
| | | public override float GetModelScale() => teamHero.modelScale; |
| | | public override string GetName() => teamHero.name; |
| | | |
| | | protected override bool GetIsStunned() => teamHero.isStunned; |
| | | protected override bool GetIsFrozen() => teamHero.isFrozen; |
| | | protected override bool GetIsStoned() => teamHero.isStoned; |
| | | protected override bool GetIsSlient() => teamHero.isSlient; |
| | | protected override bool GetIsDisarmed() => teamHero.isDisarmed; |
| | | protected override bool GetIsInvincible() => teamHero.isInvinceble; |
| | | protected override bool GetIsDead() => teamHero.isDead; |
| | | public override int GetRage() => teamHero.rage; |
| | | |
| | | protected override void ApplyCasterHpChange(long newHp) |
| | | { |
| | | teamHero.curHp = newHp; |
| | | } |
| | | |
| | | public override long GetCurHp() => teamHero.curHp; |
| | | public override long GetMaxHp() => teamHero.maxHp; |
| | | public override void SetCurHp(long value) { teamHero.curHp = value; } |
| | | public override void SetIsDead(bool value) { teamHero.isDead = value; } |
| | | |
| | | public override int GetNPCID() => teamHero.NPCID; |
| | | public override long GetFightPower() => teamHero.fightPower; |
| | | |
| | | // 伤害还要看 是否闪避 暴击 and so on 需要有一个DamageType 服务器应该会给 |
| | | protected override BattleDmgInfo PopDamage(BattleHurtParam battleHurtParam) |
| | |
| | | /// </summary> |
| | | public class MinggeBattleObject : BattleObject |
| | | { |
| | | public TeamMingge teamMingge { get; private set; } |
| | | |
| | | public MinggeBattleObject(BattleField _battleField) : base(_battleField) |
| | | { |
| | | } |
| | | |
| | | public override void Init(TeamHero _teamHero, BattleCamp _camp) |
| | | public virtual void Init(TeamBase teamBase, TeamMingge _teamMingge, BattleCamp _camp) |
| | | { |
| | | teamHero = _teamHero; |
| | | teamMingge = _teamMingge; |
| | | Camp = _camp; |
| | | ObjID = teamMingge.ObjID; |
| | | |
| | | // 命格只需要 buff 管理器用于技能效果 |
| | | buffMgr = new BattleObjectBuffMgr(); |
| | | buffMgr.Init(this); |
| | | // 命格不需要 buff 管理器(命格释放技能但自身不会有 buff) |
| | | |
| | | layerMgr = new BattleObjectLayerMgr(); |
| | | layerMgr.Init(this); |
| | |
| | | |
| | | public override void Destroy() |
| | | { |
| | | if (buffMgr != null) |
| | | { |
| | | buffMgr.Release(); |
| | | } |
| | | // 命格没有需要清理的资源 |
| | | } |
| | | |
| | | // ============ 实现抽象访问方法 ============ |
| | | |
| | | public override BattleObjectBuffMgr GetBuffMgr() => null; // 命格不有 buff 系统 |
| | | |
| | | public override int GetPositionNum() => teamMingge.positionNum; |
| | | public override float GetModelScale() => teamMingge.modelScale; |
| | | public override string GetName() => teamMingge.name; |
| | | |
| | | protected override bool GetIsStunned() => teamMingge.isStunned; |
| | | protected override bool GetIsFrozen() => teamMingge.isFrozen; |
| | | protected override bool GetIsStoned() => teamMingge.isStoned; |
| | | protected override bool GetIsSlient() => teamMingge.isSlient; |
| | | protected override bool GetIsDisarmed() => teamMingge.isDisarmed; |
| | | protected override bool GetIsInvincible() => teamMingge.isInvinceble; |
| | | protected override bool GetIsDead() => teamMingge.isDead; |
| | | public override int GetRage() => teamMingge.rage; |
| | | |
| | | protected override void ApplyCasterHpChange(long newHp) |
| | | { |
| | | // 命格没有血量,忽略 |
| | | } |
| | | |
| | | public override long GetCurHp() => 0; |
| | | public override long GetMaxHp() => 0; |
| | | public override void SetCurHp(long value) { } |
| | | public override void SetIsDead(bool value) { } |
| | | |
| | | public override int GetNPCID() => 0; |
| | | public override long GetFightPower() => 0; |
| | | |
| | | // ============ 动画相关方法实现(命格没有动画) ============ |
| | | |
| | |
| | | |
| | | public override Spine.TrackEntry PlaySkillAnimation(SkillConfig skillConfig, SkillBase skillBase, bool isCounter, Action onComplete) |
| | | { |
| | | // 命格没有技能动画,直接完成 |
| | | // 命格没有技能动画,立即触发所有帧事件 |
| | | int loopCount = skillConfig.LoopCount + 1; //默认会有一次 |
| | | int frameCount = skillConfig.ActiveFrames.Length; |
| | | |
| | | // 1. 技能开始 |
| | | skillBase.OnSkillStart(); |
| | | |
| | | // 2. 前摇结束 |
| | | skillBase.OnStartSkillFrameEnd(); |
| | | |
| | | // 3. 循环执行中摇 |
| | | int triggerCount = 0; |
| | | for (int currentLoop = 0; currentLoop < loopCount; currentLoop++) |
| | | { |
| | | // 每个 loop 开始时调用 OnMiddleFrameStart |
| | | skillBase.OnMiddleFrameStart(currentLoop); |
| | | |
| | | // 触发该 loop 的所有 ActiveFrame |
| | | for (int i = 0; i < frameCount; i++) |
| | | { |
| | | skillBase.OnMiddleFrameEnd(currentLoop, triggerCount++); |
| | | } |
| | | } |
| | | |
| | | // 4. 后摇开始 |
| | | skillBase.OnFinalFrameStart(); |
| | | |
| | | // 5. 完成回调 |
| | | onComplete?.Invoke(); |
| | | |
| | | // 6. 后摇结束 |
| | | skillBase.OnFinalFrameEnd(); |
| | | |
| | | return null; |
| | | } |
| | | |
| | |
| | | { |
| | | uint objId = targetList[0].ObjID; |
| | | BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)objId); |
| | | return target.teamHero.positionNum; |
| | | return target.GetPositionNum(); |
| | | } |
| | | break; |
| | | case 1: |
| | |
| | | BattleObject battleObject = caster.battleField.battleObjMgr.GetBattleObject((int)targetList[0].ObjID); |
| | | if (battleObject != null) |
| | | { |
| | | returnIndex = battleObject.teamHero.positionNum; |
| | | returnIndex = battleObject.GetPositionNum(); |
| | | } |
| | | else |
| | | { |
| | |
| | | { |
| | | uint objId = targetList[0].ObjID; |
| | | BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)objId); |
| | | returnIndex = target.teamHero.positionNum; |
| | | returnIndex = target.GetPositionNum(); |
| | | } |
| | | else |
| | | { |
| | | // 看看对面前排是否都活着 |
| | | List<BattleObject> front = new List<BattleObject>(from bo in targetObjList where !bo.IsDead() && bo.teamHero.positionNum < 3 select bo); |
| | | List<BattleObject> front = new List<BattleObject>(from bo in targetObjList where !bo.IsDead() && bo.GetPositionNum() < 3 select bo); |
| | | if (front.Count > 0) |
| | | { |
| | | returnIndex = 1; |
| | |
| | | { |
| | | uint objId = targetList[0].ObjID; |
| | | BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)objId); |
| | | returnIndex = target.teamHero.positionNum; |
| | | returnIndex = target.GetPositionNum(); |
| | | } |
| | | else |
| | | { |
| | | // 看看对面后排是否都活着 |
| | | List<BattleObject> back = new List<BattleObject>(from bo in targetObjList where !bo.IsDead() && bo.teamHero.positionNum >= 3 select bo); |
| | | List<BattleObject> back = new List<BattleObject>(from bo in targetObjList where !bo.IsDead() && bo.GetPositionNum() >= 3 select bo); |
| | | if (back.Count > 0) |
| | | { |
| | | returnIndex = 4; |
| | |
| | | } |
| | | else |
| | | { |
| | | returnIndex = Mathf.Min(returnIndex, target.teamHero.positionNum); |
| | | returnIndex = Mathf.Min(returnIndex, target.GetPositionNum()); |
| | | } |
| | | } |
| | | break; |
| | | // 5 自己,默认只选自己 |
| | | case 5: |
| | | returnIndex = caster.teamHero.positionNum; |
| | | returnIndex = caster.GetPositionNum(); |
| | | break; |
| | | case 6: |
| | | // 跟随主技能的目标 |
| | |
| | | } |
| | | battleField.recordPlayer.EnableForceFinish(false); |
| | | } |
| | | catch (System.Exception ex) |
| | | catch (System.Exception) |
| | | { |
| | | battleField.recordPlayer.EnableForceFinish(false); |
| | | } |
| | |
| | | BattleHurtObj hurter = new BattleHurtObj(); |
| | | hurter.hurtObj = target; |
| | | hurter.damageList = damageList; |
| | | hurter.fromHp = target.teamHero.curHp; |
| | | hurter.fromShieldValue = target.buffMgr.GetShieldValue(); |
| | | hurter.fromHp = target.GetCurHp(); |
| | | var buffMgr = target.GetBuffMgr(); |
| | | hurter.fromShieldValue = buffMgr != null ? buffMgr.GetShieldValue() : 0; // 命格没有护盾 |
| | | |
| | | // 判断是否是最后一击 |
| | | bool isLastHit = hitIndex >= skillConfig.DamageDivide.Length - 1; |
| | |
| | | else |
| | | { |
| | | // 非最后一击:客户端计算中间血量 |
| | | long maxHp = target.teamHero.maxHp; |
| | | long maxHp = target.GetMaxHp(); |
| | | |
| | | if (isHealing) |
| | | { |
| | |
| | | if (hurter.fromShieldValue >= currentHitDamage) |
| | | { |
| | | hurter.toHp = hurter.fromHp; |
| | | target.teamHero.curHp = hurter.toHp; // 保持一致性 |
| | | target.SetCurHp(hurter.toHp); // 保持一致性 |
| | | } |
| | | else |
| | | { |
| | | long remainingDamage = currentHitDamage - hurter.fromShieldValue; |
| | | hurter.toHp = Math.Max(0, hurter.fromHp - remainingDamage); |
| | | target.teamHero.curHp = hurter.toHp; // 保持一致性 |
| | | target.SetCurHp(hurter.toHp); // 保持一致性 |
| | | } |
| | | } |
| | | } |
| | |
| | | caster.reflectHpList = reflectHpList; |
| | | |
| | | // 获取施法者当前状态 |
| | | long casterFromHp = skillBase.caster.teamHero.curHp; |
| | | long casterMaxHp = skillBase.caster.teamHero.maxHp; |
| | | long casterFromShield = skillBase.caster.buffMgr.GetShieldValue(); |
| | | long casterFromHp = skillBase.caster.GetCurHp(); |
| | | long casterMaxHp = skillBase.caster.GetMaxHp(); |
| | | var buffMgr = skillBase.caster.GetBuffMgr(); |
| | | long casterFromShield = buffMgr != null ? buffMgr.GetShieldValue() : 0; // 命格没有护盾 |
| | | |
| | | caster.fromHp = casterFromHp; |
| | | caster.fromShieldValue = casterFromShield; |
| | |
| | | |
| | | caster.toHp = casterToHp; |
| | | caster.toShieldValue = casterToShield; |
| | | skillBase.caster.teamHero.curHp = caster.toHp; // 保持一致性 |
| | | skillBase.caster.SetCurHp(caster.toHp); // 保持一致性 |
| | | |
| | | return caster; |
| | | } |
| | |
| | | |
| | | BattleDebug.LogError( |
| | | $"{logColor}========== 血量一致性验证 [{context}] {resultStr} ==========</color>\n" + |
| | | $"目标: {hurter.hurtObj.teamHero.name} (ObjID:{hurter.hurtObj.ObjID})\n" + |
| | | $"目标: {hurter.hurtObj.GetName()} (ObjID:{hurter.hurtObj.ObjID})\n" + |
| | | $"击数: 第{hurtParam.hitIndex + 1}击 (最后一击)\n" + |
| | | $"服务器最终血量: {serverFinalHp}\n" + |
| | | $"客户端计算血量: {clientFinalHp}\n" + |
| | |
| | | $"初始血量: {hurter.fromHp}\n" + |
| | | $"本次伤害/治疗: {(hurter.damageList != null ? hurter.damageList.Sum() : 0)}\n" + |
| | | $"最终血量: {clientFinalHp}\n" + |
| | | $"最大血量: {hurter.hurtObj.teamHero.maxHp}\n" + |
| | | $"最大血量: {hurter.hurtObj.GetMaxHp()}\n" + |
| | | $"\n" + |
| | | $"---- 护盾变化过程 ----\n" + |
| | | $"初始护盾: {hurter.fromShieldValue}\n" + |
| | |
| | | if (!isConsistent) |
| | | { |
| | | Debug.LogWarning( |
| | | $"[血量验证失败] 目标:{hurter.hurtObj.teamHero.name} " + |
| | | $"[血量验证失败] 目标:{hurter.hurtObj.GetName()} " + |
| | | $"服务器:{serverFinalHp} vs 客户端:{clientFinalHp} " + |
| | | $"差异:{clientFinalHp - serverFinalHp}" |
| | | ); |
| | |
| | | // 应用吸血 |
| | | if (totalSuckHp > 0) |
| | | { |
| | | expectedHp = Math.Min(caster.casterObj.teamHero.maxHp, expectedHp + totalSuckHp); |
| | | expectedHp = Math.Min(caster.casterObj.GetMaxHp(), expectedHp + totalSuckHp); |
| | | } |
| | | |
| | | // 应用反伤 |
| | |
| | | |
| | | BattleDebug.LogError( |
| | | $"{logColor}========== 施法者血量验证 [{context}] {resultStr} ==========</color>\n" + |
| | | $"施法者: {caster.casterObj.teamHero.name} (ObjID:{caster.casterObj.ObjID})\n" + |
| | | $"施法者: {caster.casterObj.GetName()} (ObjID:{caster.casterObj.ObjID})\n" + |
| | | $"击数: 第{hurtParam.hitIndex + 1}击 (最后一击)\n" + |
| | | $"预期最终血量: {expectedHp}\n" + |
| | | $"实际最终血量: {clientFinalHp}\n" + |
| | |
| | | $"吸血总量: {totalSuckHp}\n" + |
| | | $"反伤总量: {totalReflectHp}\n" + |
| | | $"最终血量: {clientFinalHp}\n" + |
| | | $"最大血量: {caster.casterObj.teamHero.maxHp}\n" + |
| | | $"最大血量: {caster.casterObj.GetMaxHp()}\n" + |
| | | $"\n" + |
| | | $"---- 护盾变化过程 ----\n" + |
| | | $"初始护盾: {caster.fromShieldValue}\n" + |
| | |
| | | if (!isConsistent) |
| | | { |
| | | Debug.LogWarning( |
| | | $"[施法者血量计算错误] {caster.casterObj.teamHero.name} " + |
| | | $"[施法者血量计算错误] {caster.casterObj.GetName()} " + |
| | | $"预期:{expectedHp} vs 实际:{clientFinalHp} " + |
| | | $"差异:{clientFinalHp - expectedHp}" |
| | | ); |
| | |
| | | |
| | | if (bossBattleObject != null) |
| | | { |
| | | if (bossBattleObject.buffMgr != null) |
| | | var buffMgr = bossBattleObject.GetBuffMgr(); |
| | | if (buffMgr != null) |
| | | { |
| | | bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged; |
| | | buffMgr.onBuffChanged -= OnBuffChanged; |
| | | } |
| | | bossBattleObject = null; |
| | | } |
| | |
| | | |
| | | if (bossBattleObject != null) |
| | | { |
| | | if (bossBattleObject.buffMgr != null) |
| | | var buffMgr = bossBattleObject.GetBuffMgr(); |
| | | if (buffMgr != null) |
| | | { |
| | | bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged; |
| | | buffMgr.onBuffChanged -= OnBuffChanged; |
| | | } |
| | | bossBattleObject = null; |
| | | } |
| | |
| | | |
| | | DisplaySkillWordsList(lineupConfig); |
| | | |
| | | if (null != bossBattleObject) |
| | | if (null != bossBattleObject && bossBattleObject is HeroBattleObject heroBattleObject) |
| | | { |
| | | TeamHero teamHero = bossBattleObject.teamHero; |
| | | TeamHero teamHero = heroBattleObject.teamHero; |
| | | bossHeadCell.SetTeamHero(teamHero); |
| | | txtBossName.text = teamHero.name; |
| | | NPCConfig npcConfig = NPCConfig.Get(teamHero.NPCID); |
| | | bossLifeBar.SetBaseInfo(Mathf.Max(1, npcConfig.LifeBarCount), (ulong)teamHero.curHp, (ulong)teamHero.maxHp); |
| | | bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged; |
| | | bossBattleObject.buffMgr.onBuffChanged += OnBuffChanged; |
| | | var buffMgr = bossBattleObject.GetBuffMgr(); |
| | | if (buffMgr != null) |
| | | { |
| | | buffMgr.onBuffChanged -= OnBuffChanged; |
| | | buffMgr.onBuffChanged += OnBuffChanged; |
| | | } |
| | | } |
| | | else |
| | | { |
| | |
| | | var buffList = new List<HB428_tagSCBuffRefresh>(); |
| | | if (null != bossBattleObject) |
| | | { |
| | | buffList = bossBattleObject.buffMgr.GetBuffIconList(); |
| | | var buffMgr = bossBattleObject.GetBuffMgr(); |
| | | buffList = buffMgr != null ? buffMgr.GetBuffIconList() : new List<HB428_tagSCBuffRefresh>(); |
| | | } |
| | | RefreshBuff(buffList); |
| | | } |
| | | |
| | | private void RefreshHP() |
| | | { |
| | | if (null != bossBattleObject) |
| | | if (null != bossBattleObject && bossBattleObject is HeroBattleObject heroBattleObject) |
| | | { |
| | | TeamHero teamHero = bossBattleObject.teamHero; |
| | | TeamHero teamHero = heroBattleObject.teamHero; |
| | | bossLifeBar.Show((ulong)teamHero.curHp, (ulong)teamHero.maxHp); |
| | | } |
| | | } |
| | |
| | | return; |
| | | |
| | | // ★★★ 完全使用 StoryBossBattleWin 的逻辑 ★★★ |
| | | if (info.battleHurtParam.hurter.hurtObj != null && bossBattleObject.teamHero.ObjID == info.battleHurtParam.hurter.hurtObj.teamHero.ObjID) |
| | | if (info.battleHurtParam.hurter.hurtObj != null && bossBattleObject.ObjID == info.battleHurtParam.hurter.hurtObj.ObjID) |
| | | { |
| | | bossLifeBar.Show((ulong)info.battleHurtParam.hurter.toHp, (ulong)bossBattleObject.teamHero.maxHp); |
| | | bossLifeBar.Show((ulong)info.battleHurtParam.hurter.toHp, (ulong)bossBattleObject.GetMaxHp()); |
| | | } |
| | | else if (info.battleHurtParam.caster.casterObj != null && bossBattleObject.teamHero.ObjID == info.battleHurtParam.caster.casterObj.teamHero.ObjID) |
| | | else if (info.battleHurtParam.caster.casterObj != null && bossBattleObject.ObjID == info.battleHurtParam.caster.casterObj.ObjID) |
| | | { |
| | | bossLifeBar.Show((ulong)info.battleHurtParam.caster.toHp, (ulong)bossBattleObject.teamHero.maxHp); |
| | | bossLifeBar.Show((ulong)info.battleHurtParam.caster.toHp, (ulong)bossBattleObject.GetMaxHp()); |
| | | } |
| | | } |
| | | |
| | |
| | | return teamHeroes; |
| | | foreach (var item in teams) |
| | | { |
| | | teamHeroes.Add(item.teamHero); |
| | | if (item is HeroBattleObject heroBattleObject) |
| | | { |
| | | teamHeroes.Add(heroBattleObject.teamHero); |
| | | } |
| | | } |
| | | return teamHeroes; |
| | | |
| | |
| | | else |
| | | { |
| | | BattleEffectPlayer effect = battleObject.battleField.battleEffectMgr |
| | | .PlayEffect(battleObject, skillConfig.BuffEffect, battleObject.GetRectTransform(), battleObject.Camp, battleObject.teamHero.modelScale); |
| | | .PlayEffect(battleObject, skillConfig.BuffEffect, battleObject.GetRectTransform(), battleObject.Camp, battleObject.GetModelScale()); |
| | | |
| | | effect.BindBone(battleObject, effect.effectConfig.nodeName); |
| | | |
| | |
| | | if (hurtObj == null) |
| | | return 0; |
| | | |
| | | if (hurtObj.teamHero == null) |
| | | if (hurtObj is not HeroBattleObject) |
| | | return 0; |
| | | |
| | | return hurtObj.teamHero.maxHp; |
| | | return hurtObj.GetMaxHp(); |
| | | } |
| | | set |
| | | { |
| | | if (hurtObj != null) |
| | | if (hurtObj is HeroBattleObject heroBattleObject) |
| | | { |
| | | if (hurtObj.teamHero != null) |
| | | hurtObj.teamHero.maxHp = value; |
| | | heroBattleObject.teamHero.maxHp = value; |
| | | } |
| | | } |
| | | } |
| | |
| | | if (null == casterObj) |
| | | return 0; |
| | | |
| | | if (null == casterObj.teamHero) |
| | | if (casterObj is not HeroBattleObject) |
| | | return 0; |
| | | |
| | | return casterObj.teamHero.maxHp; |
| | | return casterObj.GetMaxHp(); |
| | | } |
| | | set |
| | | { |
| | | if (casterObj != null) |
| | | if (casterObj is HeroBattleObject heroBattleObject) |
| | | { |
| | | if (casterObj.teamHero != null) |
| | | casterObj.teamHero.maxHp = value; |
| | | heroBattleObject.teamHero.maxHp = value; |
| | | } |
| | | } |
| | | } |
| | |
| | | BattleObject battleObject = battleField.battleObjMgr.GetBattleObject((int)hitList[i].ObjID); |
| | | if (battleObject != null) |
| | | { |
| | | battleObject.OnReborn(hurt, hurt.ObjID == caster.teamHero.ObjID, ownRecordAction); |
| | | battleObject.OnReborn(hurt, hurt.ObjID == caster.ObjID, ownRecordAction); |
| | | rebornTargets.Add(battleObject); |
| | | } |
| | | } |
| | |
| | | if (battleObject != null) |
| | | { |
| | | battleField.OnObjReborn(tagUseSkillAttack.HurtList[i].ObjID); |
| | | battleObject.teamHero.curHp = GeneralDefine.GetFactValue(hurt.CurHP, hurt.CurHPEx); |
| | | |
| | | // Debug.LogError("OnReborn " + teamHero.curHp); |
| | | battleObject.teamHero.isDead = false; |
| | | // 如果是 HeroBattleObject,更新其 curHp 和 isDead |
| | | if (battleObject is HeroBattleObject heroBattleObject) |
| | | { |
| | | heroBattleObject.SetCurHp(GeneralDefine.GetFactValue(hurt.CurHP, hurt.CurHPEx)); |
| | | heroBattleObject.SetIsDead(false); |
| | | } |
| | | } |
| | | } |
| | | }); |
| | |
| | | var Hurt = tagUseSkillAttack.HurtList[i]; |
| | | BattleObject battleObject = caster.battleField.battleObjMgr.GetBattleObject((int)Hurt.ObjID); |
| | | |
| | | string targetName = battleObject != null ? battleObject.teamHero.name : "Unknown"; |
| | | string targetName = battleObject != null ? battleObject.GetName() : "Unknown"; |
| | | long hurtHp = GeneralDefine.GetFactValue(Hurt.HurtHP, Hurt.HurtHPEx); |
| | | long curHp = GeneralDefine.GetFactValue(Hurt.CurHP, Hurt.CurHPEx); |
| | | |
| | |
| | | var HurtEx = tagUseSkillAttack.HurtListEx[i]; |
| | | BattleObject battleObject = caster.battleField.battleObjMgr.GetBattleObject((int)HurtEx.ObjID); |
| | | |
| | | string targetName = battleObject != null ? battleObject.teamHero.name : "Unknown"; |
| | | string targetName = battleObject != null ? battleObject.GetName() : "Unknown"; |
| | | long hurtHp = GeneralDefine.GetFactValue(HurtEx.HurtHP, HurtEx.HurtHPEx); |
| | | long curHp = GeneralDefine.GetFactValue(HurtEx.CurHP, HurtEx.CurHPEx); |
| | | |
| | |
| | | { |
| | | // 广播技能释放事件 |
| | | string guid = battleField.guid; |
| | | TeamHero teamHero = caster.teamHero; |
| | | // 获取释放者数据:Hero 传递 teamHero,Mingge 传递 null(因为事件监听器只处理 Hero 数据) |
| | | TeamHero teamHero = null; |
| | | if (caster is HeroBattleObject heroBattleObject) |
| | | { |
| | | teamHero = heroBattleObject.teamHero; |
| | | } |
| | | // 命格释放技能时 teamHero 为 null,监听器会正确处理(已有 null 检查) |
| | | EventBroadcast.Instance.Broadcast<string, SkillConfig, TeamHero>(EventName.BATTLE_CAST_SKILL, guid, skillConfig, teamHero); |
| | | |
| | | if (skillConfig.SkinllSFX1 != 0) |
| | |
| | | else |
| | | { |
| | | // ShadowIllutionCreate(true); |
| | | MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum), Vector2.zero, () => |
| | | MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.GetPositionNum()), Vector2.zero, () => |
| | | { |
| | | // ShadowIllutionCreate(false); |
| | | OnAttackFinish(); |
| | |
| | | |
| | | ExecuteMoveAndCastSequence(targetTrans, () => |
| | | { |
| | | RectTransform rectTransform = battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum); |
| | | RectTransform rectTransform = battleField.GetTeamNode(caster.Camp, caster.GetPositionNum()); |
| | | // ShadowIllutionCreate(true); |
| | | MoveToTarget(rectTransform, Vector2.zero, () => |
| | | { |
| | |
| | | else |
| | | { |
| | | // ShadowIllutionCreate(true); |
| | | MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum), Vector2.zero, () => |
| | | MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.GetPositionNum()), Vector2.zero, () => |
| | | { |
| | | // ShadowIllutionCreate(false); |
| | | OnAttackFinish(); |
| | |
| | | // 命中目标回调:处理所有被命中的目标(包括主目标、弹射目标、溅射目标) |
| | | protected virtual void OnHitTargets(int _hitIndex, List<HB427_tagSCUseSkill.tagSCUseSkillHurt> hitList) |
| | | { |
| | | // Debug.LogError($"Skill {skillConfig.SkillID} hit targets _hitIndex: {_hitIndex} hit {string.Join(", ", hitList.Select(h => h.ObjID + ":" + battleField.battleObjMgr.GetBattleObject((int)h.ObjID)?.teamHero.name))}"); |
| | | // Debug.LogError($"Skill {skillConfig.SkillID} hit targets _hitIndex: {_hitIndex} hit {string.Join(", ", hitList.Select(h => h.ObjID + ":" + battleField.battleObjMgr.GetBattleObject((int)h.ObjID)?.GetName()))}"); |
| | | |
| | | // 造成伤害前先处理血量刷新包 |
| | | HandleRefreshHP(); |
| | |
| | | Hint(battleObject, hintConfig); |
| | | battleField.battleEffectMgr.PlayEffect(battleObject, |
| | | BattleConst.BreakArmorEffectID, battleObject.GetRectTransform(), battleObject.Camp, |
| | | battleObject.teamHero.modelScale); |
| | | battleObject.GetModelScale()); |
| | | } |
| | | } |
| | | else if ((hurt.AttackTypes & (int)DamageType.Parry) == (int)DamageType.Parry) |
| | |
| | | Hint(battleObject, hintConfig); |
| | | battleField.battleEffectMgr.PlayEffect(battleObject, |
| | | BattleConst.ParryEffectID, battleObject.GetRectTransform(), battleObject.Camp, |
| | | battleObject.teamHero.modelScale); |
| | | battleObject.GetModelScale()); |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | BattleDebug.LogError( |
| | | (hurtParam.caster.casterObj.Camp == BattleCamp.Red ? "【红方行动】" : "【蓝方行动】 ") + |
| | | $"攻击者: {hurtParam.caster.casterObj.teamHero.name} (ObjID:{hurtParam.caster.casterObj.ObjID})\n" + |
| | | $"目标: {hurtParam.hurter.hurtObj.teamHero.name} (ObjID:{hurtParam.hurter.hurtObj.ObjID})\n" + |
| | | $"攻击者: {hurtParam.caster.casterObj.GetName()} (ObjID:{hurtParam.caster.casterObj.ObjID})\n" + |
| | | $"目标: {hurtParam.hurter.hurtObj.GetName()} (ObjID:{hurtParam.hurter.hurtObj.ObjID})\n" + |
| | | $"技能: {hurtParam.skillConfig.SkillName} (ID:{hurtParam.skillConfig.SkillID})\n" + |
| | | $"击数: 第{hurtParam.hitIndex + 1}击 / 共{hurtParam.skillConfig.DamageDivide.Length}击" + (isLastHit ? " [最后一击]" : " [中间击]") + "\n" + |
| | | $"\n" + |
| | |
| | | BattleObject battleObj = battleField.battleObjMgr.GetBattleObject((int)buffRefresh.ObjID); |
| | | if (battleObj != null) |
| | | { |
| | | battleObj.buffMgr.RefreshBuff(buffRefresh, true); |
| | | var buffMgr = battleObj.GetBuffMgr(); |
| | | if (buffMgr != null) // 命格不有 buff 管理器 |
| | | { |
| | | buffMgr.RefreshBuff(buffRefresh, true); |
| | | } |
| | | } |
| | | } |
| | | else if (pack is HB429_tagSCBuffDel buffDel) |
| | |
| | | BattleObject battleObj = battleField.battleObjMgr.GetBattleObject((int)buffDel.ObjID); |
| | | if (battleObj != null) |
| | | { |
| | | battleObj.buffMgr.RemoveBuff(buffDel, false); |
| | | var buffMgr = battleObj.GetBuffMgr(); |
| | | if (buffMgr != null) // 命格不有 buff 管理器 |
| | | { |
| | | buffMgr.RemoveBuff(buffDel, false); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | case 5: |
| | | case 6: |
| | | case 14: |
| | | case 15: |
| | | case 15: |
| | | skill = new MountBuffSkill(_caster, skillConfig, vNetData, packList, battleField); |
| | | break; |
| | | |
| | |
| | | continue; |
| | | } |
| | | |
| | | minimumIndex = Mathf.Min(target.teamHero.positionNum, minimumIndex); |
| | | minimumIndex = Mathf.Min(target.GetPositionNum(), minimumIndex); |
| | | |
| | | if (target.Camp == battleCamp && target.teamHero.positionNum < 3) |
| | | if (target.Camp == battleCamp && target.GetPositionNum() < 3) |
| | | { |
| | | targetIndex = 1; |
| | | break; |
| | |
| | | private void ShotToIndex(BattleCamp camp, int targetIndex, int bulletIndex) |
| | | { |
| | | RectTransform targetTransform = caster.battleField.GetTeamNode(camp, targetIndex); |
| | | BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.BulletEffectId, caster.GetRectTransform(), caster.Camp, caster.teamHero.modelScale); |
| | | BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.BulletEffectId, caster.GetRectTransform(), caster.Camp, caster.GetModelScale()); |
| | | |
| | | RectTransform effectTrans = effectPlayer.transform as RectTransform; |
| | | |
| | |
| | | continue; |
| | | } |
| | | |
| | | PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale()); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale()); |
| | | } |
| | | |
| | | // 表现子弹飞行到目标位置 |
| | |
| | | continue; |
| | | } |
| | | |
| | | if (target.Camp == battleCamp && target.teamHero.positionNum > 3) |
| | | if (target.Camp == battleCamp && target.GetPositionNum() > 3) |
| | | { |
| | | targetIndex = 4; |
| | | break; |
| | | } |
| | | |
| | | maxinumIndex = Mathf.Max(target.teamHero.positionNum, maxinumIndex); |
| | | maxinumIndex = Mathf.Max(target.GetPositionNum(), maxinumIndex); |
| | | } |
| | | |
| | | if (targetIndex == int.MaxValue) |
| | |
| | | continue; |
| | | } |
| | | |
| | | minimumIndex = Mathf.Min(target.teamHero.positionNum, minimumIndex); |
| | | minimumIndex = Mathf.Min(target.GetPositionNum(), minimumIndex); |
| | | } |
| | | |
| | | if (minimumIndex != int.MaxValue) |
| | |
| | | private void SelfShoting(int index) |
| | | { |
| | | // 默认只选自己,自己为主目标 |
| | | ShotToIndex(caster.Camp, caster.teamHero.positionNum, index); |
| | | ShotToIndex(caster.Camp, caster.GetPositionNum(), index); |
| | | } |
| | | |
| | | // 散射 |
| | |
| | | |
| | | private void ScatterShot(BattleObject target, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, int bulletIndex, int order) |
| | | { |
| | | BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.BulletEffectId, caster.GetRectTransform(), caster.Camp, caster.teamHero.modelScale); |
| | | BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.BulletEffectId, caster.GetRectTransform(), caster.Camp, caster.GetModelScale()); |
| | | |
| | | bool shotToSelf = target.ObjID == caster.ObjID; |
| | | |
| | |
| | | continue; |
| | | } |
| | | |
| | | PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffect2, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale()); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffect2, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale()); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale()); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale()); |
| | | } |
| | | |
| | | // 表现子弹飞行到目标位置 |
| | |
| | | |
| | | protected void ShotToTarget(BattleObject target, int bulletIndex) |
| | | { |
| | | BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.BulletEffectId, caster.GetRectTransform(), caster.Camp, caster.teamHero.modelScale); |
| | | BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.BulletEffectId, caster.GetRectTransform(), caster.Camp, caster.GetModelScale()); |
| | | |
| | | bool shotToSelf = target.ObjID == caster.ObjID; |
| | | |
| | |
| | | BattleObject targetObj = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID); |
| | | if (targetObj != null) |
| | | { |
| | | PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffect2, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale()); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffect2, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale()); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale()); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale()); |
| | | } |
| | | else |
| | | { |
| | |
| | | continue; |
| | | } |
| | | |
| | | PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffect2, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale()); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffect2, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale()); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale()); |
| | | PlayExplosionEffect(skillConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale()); |
| | | } |
| | | |
| | | // 表现子弹飞行到目标位置 |
| | |
| | | Debug.LogError($"DotSkillEffect 找不到目标,GUID={hurtInfo.ObjID}"); |
| | | continue; |
| | | } |
| | | target.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.TriggerEffect, target.GetRectTransform(), caster.Camp, target.teamHero.modelScale); |
| | | target.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.TriggerEffect, target.GetRectTransform(), caster.Camp, target.GetModelScale()); |
| | | } |
| | | |
| | | onHit?.Invoke(0, tagUseSkillAttack.HurtList.ToList()); |
| | |
| | | |
| | | if (skillConfig.ExplosionEffect3 > 0) |
| | | { |
| | | caster.battleField.battleEffectMgr.PlayEffect(target, skillConfig.ExplosionEffect3, target.GetTransform(), caster.Camp, target.teamHero.modelScale); |
| | | caster.battleField.battleEffectMgr.PlayEffect(target, skillConfig.ExplosionEffect3, target.GetTransform(), caster.Camp, target.GetModelScale()); |
| | | } |
| | | if (skillConfig.ExplosionEffect4 > 0) |
| | | { |
| | | caster.battleField.battleEffectMgr.PlayEffect(target, skillConfig.ExplosionEffect4, target.GetTransform(), caster.Camp, target.teamHero.modelScale); |
| | | caster.battleField.battleEffectMgr.PlayEffect(target, skillConfig.ExplosionEffect4, target.GetTransform(), caster.Camp, target.GetModelScale()); |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | if (skillConfig.ExplosionEffect3 > 0) |
| | | { |
| | | caster.battleField.battleEffectMgr.PlayEffect(target, skillConfig.ExplosionEffect3, target.GetTransform(), caster.Camp, target.teamHero.modelScale); |
| | | caster.battleField.battleEffectMgr.PlayEffect(target, skillConfig.ExplosionEffect3, target.GetTransform(), caster.Camp, target.GetModelScale()); |
| | | } |
| | | if (skillConfig.ExplosionEffect4 > 0) |
| | | { |
| | | caster.battleField.battleEffectMgr.PlayEffect(target, skillConfig.ExplosionEffect4, target.GetTransform(), caster.Camp, target.teamHero.modelScale); |
| | | caster.battleField.battleEffectMgr.PlayEffect(target, skillConfig.ExplosionEffect4, target.GetTransform(), caster.Camp, target.GetModelScale()); |
| | | } |
| | | } |
| | | |
| | |
| | | onHit = _onHit; |
| | | if (skillConfig.EffectId > 0) |
| | | { |
| | | caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.EffectId, caster.GetRectTransform(), caster.Camp, caster.teamHero.modelScale); |
| | | caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.EffectId, caster.GetRectTransform(), caster.Camp, caster.GetModelScale()); |
| | | } |
| | | if (skillConfig.EffectId2 > 0) |
| | | { |
| | | caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.EffectId2, caster.GetRectTransform(), caster.Camp, caster.teamHero.modelScale); |
| | | caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.EffectId2, caster.GetRectTransform(), caster.Camp, caster.GetModelScale()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | public virtual void Run() |
| | | { |
| | |
| | | if (skillConfig.MStartEffectId <= 0) |
| | | return; |
| | | // 中摇固定特效 |
| | | caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.MStartEffectId, caster.GetTransform(), caster.Camp, caster.teamHero.modelScale); |
| | | caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.MStartEffectId, caster.GetTransform(), caster.Camp, caster.GetModelScale()); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | |
| | | if (null != bossBattleObject) |
| | | { |
| | | bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged; |
| | | var buffMgr = bossBattleObject.GetBuffMgr(); |
| | | if (buffMgr != null) |
| | | { |
| | | buffMgr.onBuffChanged -= OnBuffChanged; |
| | | } |
| | | bossBattleObject = null; |
| | | } |
| | | |
| | |
| | | |
| | | if (null != bossBattleObject) |
| | | { |
| | | bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged; |
| | | var buffMgr = bossBattleObject.GetBuffMgr(); |
| | | if (buffMgr != null) |
| | | { |
| | | buffMgr.onBuffChanged -= OnBuffChanged; |
| | | } |
| | | bossBattleObject = null; |
| | | } |
| | | |
| | |
| | | |
| | | DisplaySkillWordsList(lineupConfig); |
| | | |
| | | if (null != bossBattleObject) |
| | | if (null != bossBattleObject && bossBattleObject is HeroBattleObject heroBattleObject) |
| | | { |
| | | TeamHero teamHero = bossBattleObject.teamHero; |
| | | TeamHero teamHero = heroBattleObject.teamHero; |
| | | bossHeadCell.SetTeamHero(teamHero); |
| | | txtBossName.text = teamHero.name; |
| | | NPCConfig npcConfig = NPCConfig.Get(teamHero.NPCID); |
| | | bossLifeBar.SetBaseInfo(Mathf.Max(1, npcConfig.LifeBarCount), (ulong)teamHero.curHp, (ulong)teamHero.maxHp); |
| | | bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged; |
| | | bossBattleObject.buffMgr.onBuffChanged += OnBuffChanged; |
| | | var buffMgr = bossBattleObject.GetBuffMgr(); |
| | | if (buffMgr != null) |
| | | { |
| | | buffMgr.onBuffChanged -= OnBuffChanged; |
| | | buffMgr.onBuffChanged += OnBuffChanged; |
| | | } |
| | | } |
| | | else |
| | | { |
| | |
| | | var buffList = new List<HB428_tagSCBuffRefresh>(); |
| | | if (null != bossBattleObject) |
| | | { |
| | | buffList = bossBattleObject.buffMgr.GetBuffIconList(); |
| | | var buffMgr = bossBattleObject.GetBuffMgr(); |
| | | if (buffMgr != null) // 命格不有 buff |
| | | { |
| | | buffList = buffMgr.GetBuffIconList(); |
| | | } |
| | | } |
| | | RefreshBuff(buffList); |
| | | } |
| | | |
| | | private void RefreshHP() |
| | | { |
| | | if (null != bossBattleObject) |
| | | if (null != bossBattleObject && bossBattleObject is HeroBattleObject heroBattleObject) |
| | | { |
| | | TeamHero teamHero = bossBattleObject.teamHero; |
| | | TeamHero teamHero = heroBattleObject.teamHero; |
| | | bossLifeBar.Show((ulong)teamHero.curHp, (ulong)teamHero.maxHp); |
| | | } |
| | | } |
| | |
| | | if (null == bossBattleObject) |
| | | return; |
| | | |
| | | if (null == bossBattleObject.teamHero) |
| | | if (null == bossBattleObject || bossBattleObject is not HeroBattleObject) |
| | | return; |
| | | |
| | | if (info.battleHurtParam.hurter.hurtObj != null && info.battleHurtParam.hurter.hurtObj.teamHero != null && bossBattleObject.teamHero.ObjID == info.battleHurtParam.hurter.hurtObj.teamHero.ObjID) |
| | | if (info.battleHurtParam.hurter.hurtObj != null && info.battleHurtParam.hurter.hurtObj is HeroBattleObject && bossBattleObject.ObjID == info.battleHurtParam.hurter.hurtObj.ObjID) |
| | | { |
| | | bossLifeBar.Show((ulong)info.battleHurtParam.hurter.toHp, (ulong)bossBattleObject.teamHero.maxHp); |
| | | bossLifeBar.Show((ulong)info.battleHurtParam.hurter.toHp, (ulong)bossBattleObject.GetMaxHp()); |
| | | } |
| | | else if (info.battleHurtParam.caster.casterObj != null && info.battleHurtParam.caster.casterObj.teamHero != null && bossBattleObject.teamHero.ObjID == info.battleHurtParam.caster.casterObj.teamHero.ObjID) |
| | | else if (info.battleHurtParam.caster.casterObj != null && info.battleHurtParam.caster.casterObj is HeroBattleObject && bossBattleObject.ObjID == info.battleHurtParam.caster.casterObj.ObjID) |
| | | { |
| | | bossLifeBar.Show((ulong)info.battleHurtParam.caster.toHp, (ulong)bossBattleObject.teamHero.maxHp); |
| | | bossLifeBar.Show((ulong)info.battleHurtParam.caster.toHp, (ulong)bossBattleObject.GetMaxHp()); |
| | | } |
| | | } |
| | | |
| | |
| | | return teamHeroes; |
| | | foreach (var item in teams) |
| | | { |
| | | teamHeroes.Add(item.teamHero); |
| | | if (item is HeroBattleObject heroBattleObject) |
| | | { |
| | | teamHeroes.Add(heroBattleObject.teamHero); |
| | | } |
| | | } |
| | | return teamHeroes; |
| | | |
| | |
| | | |
| | | if (bossBattleObject != null) |
| | | { |
| | | if (bossBattleObject.buffMgr != null) |
| | | var buffMgr = bossBattleObject.GetBuffMgr(); |
| | | if (buffMgr != null) |
| | | { |
| | | bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged; |
| | | buffMgr.onBuffChanged -= OnBuffChanged; |
| | | } |
| | | bossBattleObject = null; |
| | | } |
| | |
| | | |
| | | if (bossBattleObject != null) |
| | | { |
| | | if (bossBattleObject.buffMgr != null) |
| | | var buffMgr = bossBattleObject.GetBuffMgr(); |
| | | if (buffMgr != null) |
| | | { |
| | | bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged; |
| | | buffMgr.onBuffChanged -= OnBuffChanged; |
| | | } |
| | | bossBattleObject = null; |
| | | } |
| | |
| | | |
| | | tianziDamageBar.Init(); |
| | | |
| | | if (null != bossBattleObject) |
| | | if (null != bossBattleObject && bossBattleObject is HeroBattleObject heroBattleObject) |
| | | { |
| | | TeamHero teamHero = bossBattleObject.teamHero; |
| | | TeamHero teamHero = heroBattleObject.teamHero; |
| | | bossHeadCell.SetTeamHero(teamHero); |
| | | txtBossName.text = teamHero.name; |
| | | NPCConfig npcConfig = NPCConfig.Get(teamHero.NPCID); |
| | | bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged; |
| | | bossBattleObject.buffMgr.onBuffChanged += OnBuffChanged; |
| | | var buffMgr = bossBattleObject.GetBuffMgr(); |
| | | if (buffMgr != null) |
| | | { |
| | | buffMgr.onBuffChanged -= OnBuffChanged; |
| | | buffMgr.onBuffChanged += OnBuffChanged; |
| | | } |
| | | } |
| | | else |
| | | { |
| | |
| | | var buffList = new List<HB428_tagSCBuffRefresh>(); |
| | | if (null != bossBattleObject) |
| | | { |
| | | buffList = bossBattleObject.buffMgr.GetBuffIconList(); |
| | | var buffMgr = bossBattleObject.GetBuffMgr(); |
| | | buffList = buffMgr != null ? buffMgr.GetBuffIconList() : new List<HB428_tagSCBuffRefresh>(); |
| | | } |
| | | RefreshBuff(buffList); |
| | | } |
| | |
| | | return teamHeroes; |
| | | foreach (var item in teams) |
| | | { |
| | | teamHeroes.Add(item.teamHero); |
| | | if (item is HeroBattleObject heroObj) |
| | | teamHeroes.Add(heroObj.teamHero); |
| | | } |
| | | return teamHeroes; |
| | | |
| | |
| | | public void SetBattleObject(BattleObject _battleObject) |
| | | { |
| | | battleObject = _battleObject; |
| | | heroInfoContainer.SetHeroInfo(battleObject.teamHero); |
| | | if (battleObject is HeroBattleObject heroBattleObject) |
| | | { |
| | | heroInfoContainer.SetHeroInfo(heroBattleObject.teamHero); |
| | | } |
| | | CleanupTips(); |
| | | RefreshBuff(battleObject.buffMgr.GetBuffIconList()); |
| | | |
| | | var buffMgr = battleObject.GetBuffMgr(); |
| | | if (buffMgr != null) // 命格不有 buff |
| | | { |
| | | RefreshBuff(buffMgr.GetBuffIconList()); |
| | | } |
| | | |
| | | if (!battleObject.IsTianziBoss()) |
| | | { |
| | | UpdateHP(battleObject.teamHero.curHp, battleObject.teamHero.curHp, battleObject.teamHero.maxHp, false); |
| | | UpdateHP(battleObject.GetCurHp(), battleObject.GetCurHp(), battleObject.GetMaxHp(), false); |
| | | } |
| | | |
| | | UpdateXP(battleObject.teamHero.rage, battleObject.teamHero.rage, 100, false); |
| | | UpdateXP(battleObject.GetRage(), battleObject.GetRage(), 100, false); |
| | | |
| | | long shieldValue = battleObject.buffMgr.GetShieldValue(); |
| | | long curHp = battleObject.teamHero.curHp; |
| | | long maxHp = battleObject.teamHero.maxHp; |
| | | long shieldValue = buffMgr != null ? buffMgr.GetShieldValue() : 0; // 命格没有护盾 |
| | | long curHp = battleObject.GetCurHp(); |
| | | long maxHp = battleObject.GetMaxHp(); |
| | | |
| | | // 记录设置前的护盾值 |
| | | float oldShield1Value = sliderShield1.value; |
| | |
| | | } |
| | | |
| | | // check shield buff |
| | | long shieldValue = battleObject.buffMgr.GetShieldValue(); |
| | | long curHp = battleObject.teamHero.curHp; |
| | | long maxHp = battleObject.teamHero.maxHp; |
| | | var buffMgr = battleObject.GetBuffMgr(); |
| | | long shieldValue = buffMgr != null ? buffMgr.GetShieldValue() : 0; // 命格没有护盾 |
| | | long curHp = battleObject.GetCurHp(); |
| | | long maxHp = battleObject.GetMaxHp(); |
| | | |
| | | // 记录设置前的护盾值 |
| | | float oldShield1Value = sliderShield1.value; |
| | |
| | | |
| | | if (bossBattleObject != null) |
| | | { |
| | | if (bossBattleObject.buffMgr != null) |
| | | var buffMgr = bossBattleObject.GetBuffMgr(); |
| | | if (buffMgr != null) |
| | | { |
| | | bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged; |
| | | buffMgr.onBuffChanged -= OnBuffChanged; |
| | | } |
| | | bossBattleObject = null; |
| | | } |
| | |
| | | |
| | | if (bossBattleObject != null) |
| | | { |
| | | if (bossBattleObject.buffMgr != null) |
| | | var buffMgr = bossBattleObject.GetBuffMgr(); |
| | | if (buffMgr != null) |
| | | { |
| | | bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged; |
| | | buffMgr.onBuffChanged -= OnBuffChanged; |
| | | } |
| | | bossBattleObject = null; |
| | | } |
| | |
| | | |
| | | DisplaySkillWordsList(lineupConfig); |
| | | |
| | | if (null != bossBattleObject) |
| | | if (null != bossBattleObject && bossBattleObject is HeroBattleObject heroBattleObject) |
| | | { |
| | | TeamHero teamHero = bossBattleObject.teamHero; |
| | | TeamHero teamHero = heroBattleObject.teamHero; |
| | | bossHeadCell.SetTeamHero(teamHero); |
| | | //txtBossName.text = teamHero.name; |
| | | NPCConfig npcConfig = NPCConfig.Get(teamHero.NPCID); |
| | | //bossLifeBar.SetBaseInfo(Mathf.Max(1, npcConfig.LifeBarCount), (ulong)teamHero.curHp, (ulong)teamHero.maxHp); |
| | | bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged; |
| | | bossBattleObject.buffMgr.onBuffChanged += OnBuffChanged; |
| | | var buffMgr = bossBattleObject.GetBuffMgr(); |
| | | if (buffMgr != null) |
| | | { |
| | | buffMgr.onBuffChanged -= OnBuffChanged; |
| | | buffMgr.onBuffChanged += OnBuffChanged; |
| | | } |
| | | } |
| | | else |
| | | { |
| | |
| | | var buffList = new List<HB428_tagSCBuffRefresh>(); |
| | | if (null != bossBattleObject) |
| | | { |
| | | buffList = bossBattleObject.buffMgr.GetBuffIconList(); |
| | | var buffMgr = bossBattleObject.GetBuffMgr(); |
| | | buffList = buffMgr != null ? buffMgr.GetBuffIconList() : new List<HB428_tagSCBuffRefresh>(); |
| | | } |
| | | RefreshBuff(buffList); |
| | | } |
| | | |
| | | private void RefreshHP() |
| | | { |
| | | if (null != bossBattleObject) |
| | | if (null != bossBattleObject && bossBattleObject is HeroBattleObject heroBattleObject) |
| | | { |
| | | TeamHero teamHero = bossBattleObject.teamHero; |
| | | TeamHero teamHero = heroBattleObject.teamHero; |
| | | //bossLifeBar.Show((ulong)teamHero.curHp, (ulong)teamHero.maxHp); |
| | | } |
| | | } |
| | |
| | | return; |
| | | |
| | | // ★★★ 完全使用 StoryBossBattleWin 的逻辑 ★★★ |
| | | if (info.battleHurtParam.hurter.hurtObj != null && bossBattleObject.teamHero.ObjID == info.battleHurtParam.hurter.hurtObj.teamHero.ObjID) |
| | | if (info.battleHurtParam.hurter.hurtObj != null && bossBattleObject.ObjID == info.battleHurtParam.hurter.hurtObj.ObjID) |
| | | { |
| | | //bossLifeBar.Show((ulong)info.battleHurtParam.hurter.toHp, (ulong)bossBattleObject.teamHero.maxHp); |
| | | } |
| | | else if (info.battleHurtParam.caster.casterObj != null && bossBattleObject.teamHero.ObjID == info.battleHurtParam.caster.casterObj.teamHero.ObjID) |
| | | else if (info.battleHurtParam.caster.casterObj != null && bossBattleObject.ObjID == info.battleHurtParam.caster.casterObj.ObjID) |
| | | { |
| | | //bossLifeBar.Show((ulong)info.battleHurtParam.caster.toHp, (ulong)bossBattleObject.teamHero.maxHp); |
| | | } |
| | |
| | | return teamHeroes; |
| | | foreach (var item in teams) |
| | | { |
| | | teamHeroes.Add(item.teamHero); |
| | | if (item is HeroBattleObject heroBattleObject) |
| | | { |
| | | teamHeroes.Add(heroBattleObject.teamHero); |
| | | } |
| | | } |
| | | return teamHeroes; |
| | | |
| | |
| | | } |
| | | for (int i = 0; i < teams.Count; i++) |
| | | { |
| | | if (teams[i].teamHero == null) |
| | | if (!(teams[i] is HeroBattleObject heroObj) || heroObj.teamHero == null) |
| | | { |
| | | continue; |
| | | } |
| | | if (teams[i].teamHero.heroId == heroID) |
| | | if (heroObj.teamHero.heroId == heroID) |
| | | { |
| | | return true; |
| | | } |
| | |
| | | case BattleConst.TianziBillboradBattleField: |
| | | case BattleConst.WarlordPavilionBattleField: |
| | | BattleObject bossBattleObject = battleField.FindBoss(); |
| | | if (bossBattleObject == null || bossBattleObject.teamHero == null) |
| | | if (bossBattleObject == null || bossBattleObject is not HeroBattleObject) |
| | | return detailName; |
| | | detailName = bossBattleObject.teamHero.name; |
| | | detailName = bossBattleObject.GetName(); |
| | | break; |
| | | // 敌方名字是对方玩家名字 |
| | | case BattleConst.ArenaBattleField: |
| | |
| | | |
| | | public TeamHero[] serverHeroes { get; private set; } = new TeamHero[TeamConst.MaxTeamHeroCount]; |
| | | |
| | | public TeamMingge teamMingge { get; private set; } |
| | | |
| | | public TeamBase(int _teamType) |
| | | { |
| | | teamType = _teamType; |
| | |
| | | |
| | | for (int i = 0; i < lineUp.ObjCnt; i++) |
| | | { |
| | | if (i < tempHeroes.Length) |
| | | { |
| | | // if (i < tempHeroes.Length) |
| | | // { |
| | | var fightObj = lineUp.ObjList[i]; |
| | | TeamHero hero = new TeamHero(fightObj, this); |
| | | tempHeroes[hero.positionNum] = hero; |
| | | serverHeroes[hero.positionNum] = hero; |
| | | } |
| | | else |
| | | { |
| | | Debug.LogError("TeamBase: Too many heroes in lineup, exceeding MaxTeamHeroCount."); |
| | | } |
| | | |
| | | // 在本阵容中的站位,从1开始到7为武将 99为命格 101及以上为灵兽 |
| | | if (fightObj.PosNum == 99) |
| | | { |
| | | teamMingge = new TeamMingge(fightObj, this); |
| | | } |
| | | else if (fightObj.PosNum >= 101) |
| | | { |
| | | |
| | | } |
| | | else if (fightObj.PosNum >= 1 && fightObj.PosNum <= 7) |
| | | { |
| | | TeamHero hero = new TeamHero(fightObj, this); |
| | | tempHeroes[hero.positionNum] = hero; |
| | | serverHeroes[hero.positionNum] = hero; |
| | | } |
| | | // } |
| | | // else |
| | | // { |
| | | // Debug.LogError("TeamBase: Too many heroes in lineup, exceeding MaxTeamHeroCount."); |
| | | // } |
| | | } |
| | | |
| | | // 刷新服务器数据 |
| | |
| | | if (tempHeroes[index2] != null) tempHeroes[index2].positionNum = index2; |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| New file |
| | |
| | | |
| | | |
| | | public class TeamMingge |
| | | { |
| | | private HB424_tagSCTurnFightInit.tagSCTurnFightObj fightObj; |
| | | |
| | | public TeamBase teamBase { get; private set; } |
| | | |
| | | // 基本属性 |
| | | public int ObjID { get; set; } |
| | | public int positionNum { get; set; } |
| | | public string name { get; set; } |
| | | public float modelScale { get; set; } |
| | | |
| | | // 命格的状态(命格不受控制,不会死亡) |
| | | public bool isStunned => false; |
| | | public bool isFrozen => false; |
| | | public bool isStoned => false; |
| | | public bool isSlient => false; |
| | | public bool isDisarmed => false; |
| | | public bool isInvinceble => false; |
| | | public bool isDead => false; |
| | | public int rage => 100; // 命格总是有怒气可以释放技能 |
| | | |
| | | public TeamMingge(HB424_tagSCTurnFightInit.tagSCTurnFightObj fightObj, TeamBase _teamBase) |
| | | { |
| | | this.fightObj = fightObj; |
| | | this.teamBase = _teamBase; |
| | | |
| | | this.ObjID = (int)fightObj.ObjID; |
| | | this.positionNum = 99; // 命格固定位置 |
| | | this.name = "命格"; |
| | | this.modelScale = 1f; |
| | | } |
| | | } |
| New file |
| | |
| | | fileFormatVersion: 2 |
| | | guid: 6ad2b68d518148a4e88d41f300995f81 |
| | | MonoImporter: |
| | | externalObjects: {} |
| | | serializedVersion: 2 |
| | | defaultReferences: [] |
| | | executionOrder: 0 |
| | | icon: {instanceID: 0} |
| | | userData: |
| | | assetBundleName: |
| | | assetBundleVariant: |