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。
作弊修改建议
[*]修改为作弊模式TriggerAbilitybool 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,确保本次攻击必定暴击。
作弊修改建议
[*]修改为作弊模式TriggerAbilityFTKUI.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]