| | |
| | | { |
| | | 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}" |
| | | ); |