yyl
14 小时以前 d16e7704e8c46b683bbaa05c033eeaf83c2ad162
125 战斗 免疫飘字
3个文件已修改
102 ■■■■ 已修改文件
Main/System/Battle/BattleUtility.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Define/BattleDmgInfo.cs 96 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Define/DamageType.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleUtility.cs
@@ -114,8 +114,8 @@
        string result = string.Empty;
        //  如果是闪避 则只显示闪避两个字
        if (damage.IsType(DamageType.Dodge))
        //  如果是闪避或免疫 则只显示对应文字,不显示数字
        if (damage.IsType(DamageType.Dodge) || damage.IsType(DamageType.Immune))
        {
            result += (char)config.prefix;
        }
Main/System/Battle/Define/BattleDmgInfo.cs
@@ -24,6 +24,7 @@
    public SkillConfig skillConfig { get { return battleHurtParam.skillConfig; } }
    public bool isBlocked = false;
    public bool isImmune = false;
    public bool isLastHit = false;
    public List<BattleDmg> targetDamageList = new List<BattleDmg>();
@@ -48,17 +49,76 @@
    private void HandleDamageType()
    {
        if (hurt == null) return;
        int attackTypes = 0;
        uint originalAttackTypes = hurt.AttackTypes;
        int convertedAttackTypes = 0;
        // 遍历服务器发来的所有伤害类型标记
        foreach (ServerDamageType serverDamageType in System.Enum.GetValues(typeof(ServerDamageType)))
        {
            int nsdt = (int)serverDamageType;
            if ((hurt.AttackTypes & nsdt) == nsdt)
            int serverValue = (int)serverDamageType;
            // 检查服务器类型是否存在
            if ((originalAttackTypes & serverValue) != serverValue)
                continue;
            // 转换映射
            switch (serverDamageType)
            {
                attackTypes += nsdt;
                case ServerDamageType.Damage:
                    convertedAttackTypes |= (int)DamageType.Damage;
                    break;
                case ServerDamageType.Recovery:
                    convertedAttackTypes |= (int)DamageType.Recovery;
                    break;
                case ServerDamageType.Immune:
                    convertedAttackTypes |= (int)DamageType.Immune;
                    break;
                case ServerDamageType.Block:
                    convertedAttackTypes |= (int)DamageType.Block;
                    break;
                case ServerDamageType.Realdamage:
                    convertedAttackTypes |= (int)DamageType.Realdamage;
                    break;
                case ServerDamageType.Crit:
                    convertedAttackTypes |= (int)DamageType.Crit;
                    break;
                case ServerDamageType.Dodge:
                    convertedAttackTypes |= (int)DamageType.Dodge;
                    break;
                case ServerDamageType.DamageReverse:
                    Debug.LogWarning($"[BattleDmgInfo] 服务器伤害类型 DamageReverse({serverValue}) 在客户端没有对应的枚举值");
                    break;
                case ServerDamageType.SuckHpReverse:
                    Debug.LogWarning($"[BattleDmgInfo] 服务器伤害类型 SuckHpReverse({serverValue}) 在客户端没有对应的枚举值");
                    break;
                case ServerDamageType.SelfHarm:
                    Debug.LogWarning($"[BattleDmgInfo] 服务器伤害类型 SelfHarm({serverValue}) 在客户端没有对应的枚举值");
                    break;
                default:
                    Debug.LogError($"[BattleDmgInfo] 未知的服务器伤害类型: {serverDamageType}({serverValue})");
                    break;
            }
        }
        hurt.AttackTypes = (uint)attackTypes;
        // 检查是否包含占位符类型
        if ((convertedAttackTypes & (int)DamageType.TakePlace2) == (int)DamageType.TakePlace2)
        {
            Debug.LogWarning($"[BattleDmgInfo] 转换后的伤害类型包含占位符 TakePlace2(256)");
        }
        hurt.AttackTypes = (uint)convertedAttackTypes;
        Debug.Log($"[BattleDmgInfo] 伤害类型转换: {originalAttackTypes} -> {hurt.AttackTypes}");
    }
    #endregion
@@ -68,7 +128,19 @@
    private void HandleAttackTypeAndDamage()
    {
        isBlocked = HaveBlockDamage();
        isImmune = IsImmune();
        int rawAttackType = hurt == null ? 0 : (int)hurt.AttackTypes;
        // 如果是免疫,直接添加免疫显示,不处理其他伤害
        if (isImmune)
        {
            targetDamageList.Add(new BattleDmg
            {
                damage = 0,
                attackType = (int)DamageType.Immune
            });
            return;
        }
        
        int maxCount = CalculateMaxDamageSegmentCount();
@@ -245,6 +317,11 @@
        return IsType(DamageType.Block);
    }
    public bool IsImmune()
    {
        return IsType(DamageType.Immune);
    }
    public bool IsRealdamage()
    {
        return skillConfig.HurtType / 10 == 1;
@@ -271,13 +348,6 @@
    public HB422_tagMCTurnFightObjDead deadPack;
    public SkillConfig skillConfig;
    public long maxHp;
    //  护盾值的变化应该从护盾2开始变化 也就是说 如果护盾2有值 则从护盾2开始变化 否则从护盾1开始变化
    //  再考虑护盾1 如果护盾1有值 则从护盾1开始变化 否则没有护盾变化
    //  但是其实可以从总血量下手 也就是说
    //  from护盾值 + from血量 = 表现的开始
    //  to护盾值 + to血量 = 表现的结束
    //  这样就不需要区分护盾1和护盾2了 只要在表现上做好就行
    public long fromShieldValue;
    public long toShieldValue;
Main/System/Battle/Define/DamageType.cs
@@ -43,7 +43,7 @@
    Block = 32,         //格挡 (2^5)
    TakePlace1 = 64,    //占位1 (暂无用) (2^6)
    Immune = 64,    //免疫 (2^6)
    Crit = 128,         //暴击 (2^7)