using System.Collections.Generic; using cfg.BuffCfg; using Gameplay.Unit.Data; 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的属性数量和变化值数量不一致: buff id- {0}", configData.ID); _propCount = Mathf.Min(_propList.Count, _changeList.Count); } else { // 数据一致 _propCount = _propList.Count; } } private void _RecalcShootCD() { DebugUtil.Log("原始射击间隔:{0},射速加成:{1}", owner.fightData.baseShootCd, owner.fightData.p_shootCdScale); owner.fightData.shootCd = owner.fightData.baseShootCd * (1 + (1 / (1 + owner.fightData.p_shootCdScale) - 1)); DebugUtil.Log("新射击间隔:{0}", owner.fightData.shootCd); } 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; _RecalcShootCD(); _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: creator.fightData.baseAttackDistanceScale += changeValue; _UpdateBaseAttackDistance(); break; case EPropType.AttackDistance: creator.fightData.baseAttackDistanceFixed += Mathf.RoundToInt(changeValue); _UpdateBaseAttackDistance(); 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.scaleForVehicle += changeValue; break; case EPropType.IgnoreShieldRate: owner.fightData.ignoreShieldRate += changeValue; break; case EPropType.ignoreDebuffRate: owner.fightData.ignoreDebuffRate += changeValue; break; case EPropType.MaxBullet: { var changeCount = Mathf.CeilToInt(changeValue * owner.fightData.baseMaxBulletCount); owner.fightData.maxBulletCount += changeCount; } break; case EPropType.RetreatTime: owner.fightData.retreateTime += changeValue; break; case EPropType.RetreatTimePercent: { var changeCount = owner.fightData.baseRetreateTime * changeValue; owner.fightData.retreateTime += changeCount; } break; case EPropType.LastBulletDamageScale: owner.fightData.lastBulletDamageScale += changeValue; break; case EPropType.DamageScaleForHuman: owner.fightData.scaleForHuman += changeValue; break; case EPropType.SkillCDReduceScale: owner.fightData.skillCdReduceScale += changeValue; break; case EPropType.MoraleDamage: owner.fightData.moraleAttack += Mathf.RoundToInt(changeValue); break; default: DebugUtil.LogError("暂未处理的属性类型:{0}", propType); break; } } } private void _UpdateBaseAttackDistance() { owner.fightData.normalAttackDistance = Mathf.CeilToInt( creator.fightData.baseAttackDistance * creator.fightData.baseAttackDistanceScale + creator.fightData.baseAttackDistanceFixed); } 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; _RecalcShootCD(); _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.baseAttackDistanceScale -= changeValue; _UpdateBaseAttackDistance(); break; case EPropType.AttackDistance: owner.fightData.baseAttackDistanceFixed -= Mathf.RoundToInt(changeValue); _UpdateBaseAttackDistance(); 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.scaleForVehicle -= changeValue; break; case EPropType.IgnoreShieldRate: owner.fightData.ignoreShieldRate -= changeValue; break; case EPropType.ignoreDebuffRate: owner.fightData.ignoreDebuffRate -= changeValue; break; case EPropType.MaxBullet: { var changeCount = Mathf.CeilToInt(changeValue * owner.fightData.baseMaxBulletCount); owner.fightData.maxBulletCount -= changeCount; } break; case EPropType.RetreatTime: owner.fightData.retreateTime -= changeValue; break; case EPropType.RetreatTimePercent: { var changeCount = owner.fightData.baseRetreateTime * changeValue; owner.fightData.retreateTime -= changeCount; } break; case EPropType.LastBulletDamageScale: owner.fightData.lastBulletDamageScale -= changeValue; break; case EPropType.DamageScaleForHuman: owner.fightData.scaleForHuman -= changeValue; break; case EPropType.SkillCDReduceScale: owner.fightData.skillCdReduceScale -= changeValue; break; case EPropType.MoraleDamage: owner.fightData.moraleAttack -= Mathf.RoundToInt(changeValue); break; default: DebugUtil.LogError("暂未处理的属性类型:{0}", propType); break; } } } } }