using System.Collections.Generic; using cfg.BuffCfg; 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; default: DebugUtil.LogError("暂未处理的属性类型:{0}", propType); 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; default: DebugUtil.LogError("暂未处理的属性类型:{0}", propType); break; } } } } }