是图南 发表于 2025-5-21 18:40

dnSPY修改技能判断

dnSPY是代码部分右键编辑方法,保存是点编译保存,然后左上角文件点开保存所有。

以黑洞为例子:
黑洞天文学家角色的技能,直接秒杀一只怪物,并获得星物质。定位到Assembly-CSharp\-\CharacterSkills\BlackHole(),​
技能详细逻辑分析
[*]基础条件检查
[*]技能未解锁:若玩家未解锁黑洞技能(m_BlackHole​为false​),直接返回false​。
[*]已有特殊攻击:若玩家当前正在执行其他特殊攻击(m_SpecialAttack​非None​),阻止重复触发,返回false​。

[*]目标类型限制
[*]Boss/Scourge免疫:若目标为敌人(EnemyDummy​),且是Boss或Scourge类型,黑洞无法触发,避免对强力敌人生效。
[*]攻击类型验证
[*]技能目标类型限制:若当前尝试的技能(_attemptedProf​)是友方技能或明确指定了目标类型(如治疗或指向性攻击),黑洞不会触发。这可能是为了限制黑洞仅在特定攻击类型(如范围攻击)下激活。

[*]触发概率计算
[*]作弊模式:若开启作弊(TriggerAbility​),直接触发黑洞。
[*]基础概率:初始概率为 6%​,每点已消耗的专注值(SpentFocus​)增加 2%​。
[*]物品削弱效果:队伍中每拥有一个orbGroupShield​(护盾类道具),触发概率减半。例如:1个护盾概率为 3%​,2个为 1.5%​,依此类推。
[*]随机判定:最终通过随机数决定是否触发。

[*]触发结果
[*]若条件满足,设置玩家的当前特殊攻击为BlackHole​,返回true​,否则返回false​。



作弊修改建议
[*]修改为作弊模式TriggerAbility​bool flag =true || FTKUI.Instance.m_PlayerSlots.m_CheatAttack == SlotControl.AttackCheatType.TriggerAbility;
[*]修改初始概率 0.06f修改为任意值,例如0.6f,修改为100f几乎可以保证100%触发(护盾类道具数量不多的话)float num = 0.06f + (float)_player.m_CharacterStats.SpentFocus * 0.02f;
[*]修改消耗专注点触发的概率 0.02f修改为任意值,例如0.25ffloat num = 0.06f + (float)_player.m_CharacterStats.SpentFocus * 0.02f;
[*]修改护盾类道具的触发概率 num *= 0.5f; 例如修改0.5f为2f,使得每个护盾类道具增加触发概率2倍
                for (int i = 0; i < totalPartyItems; i++)                {                        num *= 0.5f;                }                flag = global::UnityEngine.Random.value < num;建议修改每点已消耗的专注值触发的概率,可以保证游戏性的同时还可控。
Assembly-CSharp\-\CharacterSkills\下的其他技能也一样,修改对应计算参数或者直接修改判定。
精准射击定位到Assembly-CSharp\-\CharacterSkills\CalledShot()​方法详细逻辑分析
[*]基础条件检查
[*]技能未解锁:若玩家未解锁精准射击(m_CalledShot​为false​),直接返回false​。
[*]已消耗专注值:若玩家已消耗任何专注值(SpentFocus > 0​),无法触发。这要求玩家必须保留全部专注值才能使用该技能。
[*]已有特殊攻击:若当前正在执行其他特殊攻击(m_SpecialAttack​非None​),阻止重复触发。

[*]武器类型限制
[*]远程/火器专用:通过GetBestWeaponType​获取当前攻击的最佳武器类型,仅允许ranged​(远程)或firearm​(火器)触发,近战武器无法使用该技能。

[*]攻击类型验证
[*]非指向性攻击限制:若当前尝试的技能(_attemptedProf​)是友方技能或明确指定了目标类型(如单体攻击),精准射击不会触发。这表明技能仅适用于无目标或范围攻击场景。

[*]角色状态检查
[*]能力使用限制:CanUseAbility()​检查角色是否处于可行动状态(如未被控制或沉默),否则阻止触发。
[*]武器专注限制:若当前武器标记为m_NoFocus​(无需专注),禁止触发。这可能用于排除某些特殊武器(如魔法道具)的滥用。

[*]触发条件
[*]10%基础概率:通过Random.value < 0.1f​实现10%的随机触发率。
[*]作弊模式:若开启作弊(TriggerAbility​),直接触发。
[*]效果激活:触发后标记m_CriticalStrike​(暴击)和m_SpecialAttack​为CalledShot​,确保本次攻击必定暴击。

作弊修改建议
[*]修改为作弊模式TriggerAbility​​FTKUI.Instance.m_PlayerSlots.m_CheatAttack == SlotControl.AttackCheatType.TriggerAbility​ 替换为true​        if (global::UnityEngine.Random.value < 0.1f || FTKUI.Instance.m_PlayerSlots.m_CheatAttack == SlotControl.AttackCheatType.TriggerAbility)        {                _player.m_CurrentDummy.m_CriticalStrike = true;                _player.m_CurrentDummy.m_SpecialAttack = CharacterDummy.SpecialAttack.CalledShot;                return true;        }
[*]修改基础概率 global::UnityEngine.Random.value < 0.1f​修改为global::UnityEngine.Random.value< 0.1f+0.5f​ 增加50%的基础概率
暴击修改定位到Assembly-CSharp\-\CharacterSkills\CriticalStrike()​方法逻辑流程分析
[*]负面状态免疫
[*]击晕状态禁止暴击:若角色处于Shocked​(击晕/麻痹)状态,直接返回false​,禁止暴击。这是常见的控制效果限制机制。

[*]暴击率差异化计算
[*]敌人暴击率:若目标是敌人(EnemyDummy​),直接读取其预设的暴击概率m_EnemyCombat.m_ChanceToCrit​,体现敌人独立配置的战斗属性。
[*]玩家暴击率:若目标是玩家角色,则:
[*]基础值:从角色属性ChanceToCrit​获取基础暴击率。
[*]专注强化:每消耗1点专注值(SpentFocus​)提升5%暴击率,鼓励资源管理换取爆发输出。


[*]随机暴击判定
[*]生成随机数并与计算后的暴击率(num​)比较:
[*]若随机值小于暴击率,标记m_CriticalStrike​为true​并返回true​,触发暴击。
[*]否则返回false​,不触发。



修改建议
[*]修改专注提升的暴击 修改0.05f为任意暴击率

num += 0.05f * (float)_dummy.m_CharacterOverworld.m_CharacterStats.SpentFocus;


成功率判定修改​Assembly-CSharp\-\SlotControl/ComputeAttackSlotResults()​if (_player)
        {
                for (;;)
                {
                        int num5 = 0;
                        for (int i = 0; i < array.Length; i++)
                        {
                                bool flag6 = _cow.m_CharacterStats.m_SkillRoll.Roll(num3);
                                array2 = flag6;
                                if (flag6)
                                {
                                        num5++;
                                }
                        }
                        float num6 = (float)num5;
                        float num7 = (float)array.Length * 1f;
                        if (num6 > num7)
                        {
                                break;
                        }
                        float num8 = FTKUtil.CalcSkillValue(_cow.m_CharacterStats.GetSkillValue(skillType, true, num3), array.Length, num5);
                        if (num8 > 0.01f)
                        {
                                break;
                        }
                        FTKGameStats.Inst.SendCustomStats("Wink", new Dictionary<string, object>
                        {
                                { "n", array.Length },
                                { "k", num5 },
                                { "p", num8 }
                        });
                }
        }
修改array2=true,永远成功或修改_cow.m_CharacterStats.m_SkillRoll.Roll(num+0.5f),当前概率增加50%.
页: [1]
查看完整版本: dnSPY修改技能判断