2023-10-19 15:00:19 +08:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using cfg.BuffCfg;
|
2023-12-13 16:20:41 +08:00
|
|
|
|
using Gameplay.Unit.Data;
|
2023-10-19 15:00:19 +08:00
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
namespace Gameplay.Buff
|
|
|
|
|
|
{
|
|
|
|
|
|
public class BuffChangeProp : BaseBuff
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
private List<EPropType> _propList;
|
|
|
|
|
|
private List<float> _changeList;
|
|
|
|
|
|
private int _propCount;
|
|
|
|
|
|
|
|
|
|
|
|
protected override void _OnInit()
|
|
|
|
|
|
{
|
|
|
|
|
|
base._OnInit();
|
|
|
|
|
|
|
|
|
|
|
|
_propList = configData.PorpParams;
|
|
|
|
|
|
_changeList = configData.FloatParams;
|
|
|
|
|
|
|
|
|
|
|
|
if (_propList.Count != _changeList.Count)
|
|
|
|
|
|
{
|
2024-05-20 16:45:52 +08:00
|
|
|
|
DebugUtil.LogError("BuffChangeProp的属性数量和变化值数量不一致: buff id- {0}", configData.ID);
|
2023-10-19 15:00:19 +08:00
|
|
|
|
_propCount = Mathf.Min(_propList.Count, _changeList.Count);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
// 数据一致
|
|
|
|
|
|
_propCount = _propList.Count;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-03-21 16:52:08 +08:00
|
|
|
|
private void _RecalcShootCD()
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.Log("原始射击间隔:{0},射速加成:{1}", owner.fightData.p_shootCd, owner.fightData.p_shootCdScale);
|
|
|
|
|
|
owner.fightData.shootCd = owner.fightData.p_shootCd * (1 + (1 / (1 + owner.fightData.p_shootCdScale) - 1));
|
|
|
|
|
|
owner.fightData.firstShootTime = owner.fightData.p_firstShootTime * (1 + (1 / (1 + owner.fightData.p_shootCdScale) - 1));
|
|
|
|
|
|
DebugUtil.Log("新射击间隔:{0}", owner.fightData.shootCd);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
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;
|
2024-03-21 16:52:08 +08:00
|
|
|
|
_RecalcShootCD();
|
2023-10-19 15:00:19 +08:00
|
|
|
|
_UpdateViewShootCd();
|
|
|
|
|
|
break;
|
|
|
|
|
|
case EPropType.MoveShoot:
|
|
|
|
|
|
// 只有角色才有移动射击
|
|
|
|
|
|
if (owner.gameunitType == EGameUnitType.Character)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (owner is Character.Character character)
|
|
|
|
|
|
character.runtimeData.fightData.moveShootType += (int)changeValue;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
2023-11-06 16:28:35 +08:00
|
|
|
|
case EPropType.MoveSpeedPercent:
|
2023-11-16 17:46:29 +08:00
|
|
|
|
owner.fightData.moveSpeed += creator.fightData.baseMoveSpeed * changeValue;
|
2023-11-06 16:28:35 +08:00
|
|
|
|
break;
|
2023-11-06 16:50:41 +08:00
|
|
|
|
case EPropType.RetretSpeedPercent:
|
2023-11-16 17:46:29 +08:00
|
|
|
|
owner.fightData.retreatSpeed += creator.fightData.baseRetreatSpeed * changeValue;
|
2023-11-06 16:50:41 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case EPropType.AttackValuePercent:
|
2023-11-16 17:46:29 +08:00
|
|
|
|
owner.fightData.attack += (int)(creator.fightData.baseAttack * changeValue);
|
2023-11-06 16:50:41 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case EPropType.DefenseValuePercent:
|
2023-11-16 17:46:29 +08:00
|
|
|
|
owner.fightData.defense += (int)(creator.fightData.baseDefense * changeValue);
|
2023-11-06 16:50:41 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case EPropType.AttackDistancePercent:
|
2024-05-17 14:20:53 +08:00
|
|
|
|
owner.fightData.normalAttackDistance += Mathf.CeilToInt(creator.fightData.baseAttackDistance * changeValue);
|
2023-11-06 16:50:41 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case EPropType.SkillReleaseDistancePercent:
|
|
|
|
|
|
owner.fightData.skillReleaseDistanceScale += changeValue;
|
|
|
|
|
|
break;
|
2023-11-07 13:49:30 +08:00
|
|
|
|
case EPropType.ReloadTimePercent:
|
2023-11-16 17:46:29 +08:00
|
|
|
|
owner.fightData.reloadTime += creator.fightData.baseReloadTime * changeValue;
|
2023-11-07 13:49:30 +08:00
|
|
|
|
_UpdateViewReloadCd();
|
|
|
|
|
|
break;
|
2023-11-16 13:06:13 +08:00
|
|
|
|
case EPropType.MoraleRecoverScale:
|
|
|
|
|
|
owner.fightData.moraleRecoverScale += changeValue;
|
|
|
|
|
|
break;
|
2023-11-16 13:20:03 +08:00
|
|
|
|
case EPropType.DamageScaleForVehicle:
|
2024-07-12 18:27:04 +08:00
|
|
|
|
owner.fightData.scaleForVehicle += changeValue;
|
2023-11-16 13:20:03 +08:00
|
|
|
|
break;
|
2023-11-16 13:48:40 +08:00
|
|
|
|
case EPropType.IgnoreShieldRate:
|
|
|
|
|
|
owner.fightData.ignoreShieldRate += changeValue;
|
|
|
|
|
|
break;
|
2023-11-16 14:15:30 +08:00
|
|
|
|
case EPropType.ignoreDebuffRate:
|
|
|
|
|
|
owner.fightData.ignoreDebuffRate += changeValue;
|
|
|
|
|
|
break;
|
2023-12-13 14:11:09 +08:00
|
|
|
|
case EPropType.MaxBullet:
|
2024-03-20 15:49:53 +08:00
|
|
|
|
{
|
2023-12-13 14:11:09 +08:00
|
|
|
|
var changeCount = Mathf.CeilToInt(changeValue * owner.fightData.baseMaxBulletCount);
|
|
|
|
|
|
owner.fightData.maxBulletCount += changeCount;
|
2024-03-20 15:49:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case EPropType.RetreatTime:
|
|
|
|
|
|
owner.fightData.retreateTime += changeValue;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case EPropType.RetreatTimePercent:
|
|
|
|
|
|
{
|
|
|
|
|
|
var changeCount = owner.fightData.baseRetreateTime * changeValue;
|
|
|
|
|
|
owner.fightData.retreateTime += changeCount;
|
|
|
|
|
|
}
|
2023-12-13 14:11:09 +08:00
|
|
|
|
break;
|
2024-05-20 18:46:39 +08:00
|
|
|
|
case EPropType.LastBulletDamageScale:
|
|
|
|
|
|
owner.fightData.lastBulletDamageScale += changeValue;
|
|
|
|
|
|
break;
|
2024-07-12 18:27:04 +08:00
|
|
|
|
case EPropType.DamageScaleForHuman:
|
|
|
|
|
|
owner.fightData.scaleForHuman += changeValue;
|
|
|
|
|
|
break;
|
2024-07-17 19:11:14 +08:00
|
|
|
|
case EPropType.SkillCDReduceScale:
|
|
|
|
|
|
owner.fightData.skillCdReduceScale += changeValue;
|
|
|
|
|
|
break;
|
2024-07-18 14:52:45 +08:00
|
|
|
|
case EPropType.MoraleDamage:
|
2024-07-18 15:23:29 +08:00
|
|
|
|
owner.fightData.moraleAttack += Mathf.RoundToInt(changeValue);
|
2024-07-18 14:52:45 +08:00
|
|
|
|
break;
|
2023-10-19 15:00:19 +08:00
|
|
|
|
default:
|
|
|
|
|
|
DebugUtil.LogError("暂未处理的属性类型:{0}", propType);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-11-06 16:28:35 +08:00
|
|
|
|
private void _UpdateViewReloadCd()
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (owner.gameunitType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case EGameUnitType.Character:
|
|
|
|
|
|
{
|
|
|
|
|
|
if (owner is Character.Character character)
|
|
|
|
|
|
{
|
|
|
|
|
|
character.cAnim.ResetReloadAnim();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
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;
|
2024-03-21 16:52:08 +08:00
|
|
|
|
_RecalcShootCD();
|
2023-10-19 15:00:19 +08:00
|
|
|
|
_UpdateViewShootCd();
|
|
|
|
|
|
break;
|
|
|
|
|
|
case EPropType.MoveShoot:
|
|
|
|
|
|
// 只有角色才有移动射击
|
|
|
|
|
|
if (owner.gameunitType == EGameUnitType.Character)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (owner is Character.Character character)
|
|
|
|
|
|
character.runtimeData.fightData.moveShootType -= (int)changeValue;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
2023-11-06 16:50:41 +08:00
|
|
|
|
case EPropType.MoveSpeedPercent:
|
2023-11-16 17:46:29 +08:00
|
|
|
|
owner.fightData.moveSpeed -= creator.fightData.baseMoveSpeed * changeValue;
|
2023-11-06 16:50:41 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case EPropType.RetretSpeedPercent:
|
2023-11-16 17:46:29 +08:00
|
|
|
|
owner.fightData.retreatSpeed -= creator.fightData.baseRetreatSpeed * changeValue;
|
2023-11-06 16:50:41 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case EPropType.AttackValuePercent:
|
2023-11-16 17:46:29 +08:00
|
|
|
|
owner.fightData.attack -= (int)(creator.fightData.baseAttack * changeValue);
|
2023-11-06 16:50:41 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case EPropType.DefenseValuePercent:
|
2023-11-16 17:46:29 +08:00
|
|
|
|
owner.fightData.defense -= (int)(creator.fightData.baseDefense * changeValue);
|
2023-11-06 16:50:41 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case EPropType.AttackDistancePercent:
|
2024-05-17 14:20:53 +08:00
|
|
|
|
owner.fightData.normalAttackDistance -= Mathf.CeilToInt(creator.fightData.baseAttackDistance * changeValue);
|
2023-11-06 16:50:41 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case EPropType.SkillReleaseDistancePercent:
|
|
|
|
|
|
owner.fightData.skillReleaseDistanceScale -= changeValue;
|
|
|
|
|
|
break;
|
2023-11-16 13:06:13 +08:00
|
|
|
|
case EPropType.ReloadTimePercent:
|
2023-11-16 17:46:29 +08:00
|
|
|
|
owner.fightData.reloadTime -= creator.fightData.baseReloadTime * changeValue;
|
2023-11-16 13:06:13 +08:00
|
|
|
|
_UpdateViewReloadCd();
|
|
|
|
|
|
break;
|
|
|
|
|
|
case EPropType.MoraleRecoverScale:
|
|
|
|
|
|
owner.fightData.moraleRecoverScale -= changeValue;
|
|
|
|
|
|
break;
|
2023-11-16 13:20:03 +08:00
|
|
|
|
case EPropType.DamageScaleForVehicle:
|
2024-07-12 18:27:04 +08:00
|
|
|
|
owner.fightData.scaleForVehicle -= changeValue;
|
2023-11-16 13:20:03 +08:00
|
|
|
|
break;
|
2023-11-16 13:48:40 +08:00
|
|
|
|
case EPropType.IgnoreShieldRate:
|
|
|
|
|
|
owner.fightData.ignoreShieldRate -= changeValue;
|
|
|
|
|
|
break;
|
2023-11-16 14:15:30 +08:00
|
|
|
|
case EPropType.ignoreDebuffRate:
|
|
|
|
|
|
owner.fightData.ignoreDebuffRate -= changeValue;
|
|
|
|
|
|
break;
|
2023-12-13 14:11:09 +08:00
|
|
|
|
case EPropType.MaxBullet:
|
2024-03-20 15:49:53 +08:00
|
|
|
|
{
|
2023-12-13 14:11:09 +08:00
|
|
|
|
var changeCount = Mathf.CeilToInt(changeValue * owner.fightData.baseMaxBulletCount);
|
|
|
|
|
|
owner.fightData.maxBulletCount -= changeCount;
|
2024-03-20 15:49:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case EPropType.RetreatTime:
|
|
|
|
|
|
owner.fightData.retreateTime -= changeValue;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case EPropType.RetreatTimePercent:
|
|
|
|
|
|
{
|
|
|
|
|
|
var changeCount = owner.fightData.baseRetreateTime * changeValue;
|
|
|
|
|
|
owner.fightData.retreateTime -= changeCount;
|
|
|
|
|
|
}
|
2023-12-13 14:11:09 +08:00
|
|
|
|
break;
|
2024-05-20 18:46:39 +08:00
|
|
|
|
case EPropType.LastBulletDamageScale:
|
|
|
|
|
|
owner.fightData.lastBulletDamageScale -= changeValue;
|
|
|
|
|
|
break;
|
2024-07-12 18:27:04 +08:00
|
|
|
|
case EPropType.DamageScaleForHuman:
|
|
|
|
|
|
owner.fightData.scaleForHuman -= changeValue;
|
|
|
|
|
|
break;
|
2024-07-17 19:11:14 +08:00
|
|
|
|
case EPropType.SkillCDReduceScale:
|
|
|
|
|
|
owner.fightData.skillCdReduceScale -= changeValue;
|
|
|
|
|
|
break;
|
2024-07-18 14:52:45 +08:00
|
|
|
|
case EPropType.MoraleDamage:
|
2024-07-18 15:23:29 +08:00
|
|
|
|
owner.fightData.moraleAttack -= Mathf.RoundToInt(changeValue);
|
2024-07-18 14:52:45 +08:00
|
|
|
|
break;
|
2023-10-19 15:00:19 +08:00
|
|
|
|
default:
|
|
|
|
|
|
DebugUtil.LogError("暂未处理的属性类型:{0}", propType);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|