diff --git a/assets/script/game/hero/HeroViewComp.ts b/assets/script/game/hero/HeroViewComp.ts index 8592c61c..2210af53 100644 --- a/assets/script/game/hero/HeroViewComp.ts +++ b/assets/script/game/hero/HeroViewComp.ts @@ -402,45 +402,45 @@ export class HeroViewComp extends CCComp { // ==================== BUFF 辅助方法 ==================== /** - * 移除特定属性的某个buff实例 - * @param attrIndex 属性索引 - * @param value buff效果值 - * @param isTemporary 是否为临时buff(true=临时,false=持久) - * @return 是否移除成功 + * 清空buff + * @param attrIndex 属性索引,如果为空则清理所有buff(包括临时和持久) + * @param isBuff true时清理value>0的增益buff,false时清理value<0的减益buff */ - removeBuff(attrIndex: number, value: number, isTemporary: boolean = true): boolean { - const buffDict = isTemporary ? this.BUFFS_TEMP : this.BUFFS; - - if (!buffDict[attrIndex] || buffDict[attrIndex].length === 0) { - return false; - } - - const buffs = buffDict[attrIndex]; - const index = buffs.findIndex(buff => buff.value === value); - - if (index > -1) { - buffs.splice(index, 1); - // 如果该属性所有buff都被移除,删除该属性键 - if (buffs.length === 0) { - delete buffDict[attrIndex]; + clearBuffs(attrIndex?: number, isBuff: boolean = true): void { + if (attrIndex === undefined) { + // 清理所有buff,根据isBuff过滤 + for (const attrIndex in this.BUFFS_TEMP) { + this.clearBuffsForAttr(parseInt(attrIndex), isBuff); } - // 重新计算属性 - this.recalculateSingleAttr(attrIndex); - return true; + + } else { + // 清理指定属性的buff,根据isBuff过滤 + this.clearBuffsForAttr(attrIndex, isBuff); } - return false; } /** - * 清空某个属性的所有buff + * 清理指定属性的buff,根据增益/减益类型过滤 * @param attrIndex 属性索引 - * @param clearTemporaryOnly 是否仅清空临时buff(true=仅临时,false=全部) + * @param isBuff true清理增益buff,false清理减益buff */ - clearBuffs(attrIndex: number, clearTemporaryOnly: boolean = false): void { - if (!clearTemporaryOnly) { - delete this.BUFFS[attrIndex]; + private clearBuffsForAttr(attrIndex: number, isBuff: boolean): void { + const buffContainer = this.BUFFS_TEMP; + + if (!buffContainer[attrIndex]) return; + + // 过滤buff数组,保留不符合清理条件的buff + buffContainer[attrIndex] = buffContainer[attrIndex].filter(buff => { + const shouldClear = isBuff ? buff.value > 0 : buff.value < 0; + return !shouldClear; + }); + + // 如果数组为空,删除该属性条目 + if (buffContainer[attrIndex].length === 0) { + delete buffContainer[attrIndex]; } - delete this.BUFFS_TEMP[attrIndex]; + + // 重新计算该属性 this.recalculateSingleAttr(attrIndex); }