using System.Collections.Generic; using cfg.BuffCfg; using CodeStage.AntiCheat.ObscuredTypes; using Gameplay.Common; using UnityEngine; namespace Gameplay.Buff { public class BuffChangeProp : BaseBuff { private List _propList; private List _changeList; private int _propCount; protected override void _OnInit() { base._OnInit(); _propList = configData.PorpParams; _changeList = configData.FloatParams; if (_propList.Count != _changeList.Count) { DebugUtil.LogError("BuffChangeProp的属性数量和变化值数量不一致:{0}", configData.ID); _propCount = Mathf.Min(_propList.Count, _changeList.Count); } else { // 数据一致 _propCount = _propList.Count; } } protected override void _OnAdd() { base._OnAdd(); for (int i = 0; i < _propCount; i++) { var propType = _propList[i]; var changeValue = _changeList[i]; switch (propType) { case EPropType.MoveSpeed: owner.fightData.moveSpeed += changeValue; break; case EPropType.BeDamageScale: owner.fightData.beDamageScale += changeValue; break; case EPropType.FinalDamageScale: owner.fightData.finalDamageScale += changeValue; break; case EPropType.MoraleDamageScale: owner.fightData.moraleDamageScale += changeValue; break; case EPropType.BeMoraleDamageScale: owner.fightData.moraleBeDamageScale += changeValue; break; case EPropType.AttackValue: owner.fightData.attack += (int)changeValue; break; case EPropType.DefenseValue: owner.fightData.defense += (int)changeValue; break; case EPropType.ShootRate: // 射击间隔 * ( 1+ (1/(1+射速加成) -1) ) owner.fightData.p_shootCdScale += changeValue; owner.fightData.shootCd = owner.fightData.p_shootCd * (1 + (1 / (1 + owner.fightData.p_shootCdScale) - 1)); _UpdateViewShootCd(); break; case EPropType.MoveShoot: // 只有角色才有移动射击 if (owner.gameunitType == EGameUnitType.Character) { if (owner is Character.Character character) character.runtimeData.fightData.moveShootType += (int)changeValue; } break; case EPropType.MoveSpeedPercent: owner.fightData.moveSpeed += creator.fightData.baseMoveSpeed * changeValue; break; case EPropType.RetretSpeedPercent: owner.fightData.retreatSpeed += creator.fightData.baseRetreatSpeed * changeValue; break; case EPropType.AttackValuePercent: owner.fightData.attack += (int)(creator.fightData.baseAttack * changeValue); break; case EPropType.DefenseValuePercent: owner.fightData.defense += (int)(creator.fightData.baseDefense * changeValue); break; case EPropType.AttackDistancePercent: owner.fightData.attackDistance += Mathf.CeilToInt(creator.fightData.baseAttackDistance * changeValue); break; case EPropType.SkillReleaseDistancePercent: owner.fightData.skillReleaseDistanceScale += changeValue; break; case EPropType.ReloadTimePercent: owner.fightData.reloadTime += creator.fightData.baseReloadTime * changeValue; _UpdateViewReloadCd(); break; case EPropType.MoraleRecoverScale: owner.fightData.moraleRecoverScale += changeValue; break; case EPropType.DamageScaleForVehicle: owner.fightData.damageScaleForVehicle += changeValue; break; case EPropType.IgnoreShieldRate: owner.fightData.ignoreShieldRate += changeValue; break; case EPropType.ignoreDebuffRate: owner.fightData.ignoreDebuffRate += changeValue; break; default: DebugUtil.LogError("暂未处理的属性类型:{0}", propType); break; } } } private void _UpdateViewReloadCd() { switch (owner.gameunitType) { case EGameUnitType.Character: { if (owner is Character.Character character) { character.cAnim.ResetReloadAnim(); } } break; } } private void _UpdateViewShootCd() { switch (owner.gameunitType) { case EGameUnitType.Character: { if (owner is Character.Character character) { character.cAnim.ResetShootAnim(); } } break; } } protected override void _OnRemove() { base._OnRemove(); for (int i = 0; i < _propCount; i++) { var propType = _propList[i]; var changeValue = _changeList[i]; switch (propType) { case EPropType.MoveSpeed: owner.fightData.moveSpeed -= changeValue; break; case EPropType.BeDamageScale: owner.fightData.beDamageScale -= changeValue; break; case EPropType.FinalDamageScale: owner.fightData.finalDamageScale -= changeValue; break; case EPropType.MoraleDamageScale: owner.fightData.moraleDamageScale -= changeValue; break; case EPropType.BeMoraleDamageScale: owner.fightData.moraleBeDamageScale -= changeValue; break; case EPropType.AttackValue: owner.fightData.attack -= (int)changeValue; break; case EPropType.DefenseValue: owner.fightData.defense -= (int)changeValue; break; case EPropType.ShootRate: // 射击间隔 * ( 1+ (1/(1+射速加成) -1) ) owner.fightData.p_shootCdScale -= changeValue; owner.fightData.shootCd = owner.fightData.p_shootCd * (1 + (1 / (1 + owner.fightData.p_shootCdScale) - 1)); _UpdateViewShootCd(); break; case EPropType.MoveShoot: // 只有角色才有移动射击 if (owner.gameunitType == EGameUnitType.Character) { if (owner is Character.Character character) character.runtimeData.fightData.moveShootType -= (int)changeValue; } break; case EPropType.MoveSpeedPercent: owner.fightData.moveSpeed -= creator.fightData.baseMoveSpeed * changeValue; break; case EPropType.RetretSpeedPercent: owner.fightData.retreatSpeed -= creator.fightData.baseRetreatSpeed * changeValue; break; case EPropType.AttackValuePercent: owner.fightData.attack -= (int)(creator.fightData.baseAttack * changeValue); break; case EPropType.DefenseValuePercent: owner.fightData.defense -= (int)(creator.fightData.baseDefense * changeValue); break; case EPropType.AttackDistancePercent: owner.fightData.attackDistance -= Mathf.CeilToInt(creator.fightData.baseAttackDistance * changeValue); break; case EPropType.SkillReleaseDistancePercent: owner.fightData.skillReleaseDistanceScale -= changeValue; break; case EPropType.ReloadTimePercent: owner.fightData.reloadTime -= creator.fightData.baseReloadTime * changeValue; _UpdateViewReloadCd(); break; case EPropType.MoraleRecoverScale: owner.fightData.moraleRecoverScale -= changeValue; break; case EPropType.DamageScaleForVehicle: owner.fightData.damageScaleForVehicle -= changeValue; break; case EPropType.IgnoreShieldRate: owner.fightData.ignoreShieldRate -= changeValue; break; case EPropType.ignoreDebuffRate: owner.fightData.ignoreDebuffRate -= changeValue; break; default: DebugUtil.LogError("暂未处理的属性类型:{0}", propType); break; } } } } }