Merge origin/card0614 into card0614
合并远程药水限时强化系统与本地驻场光环配置,保留双方 BuffSet 新增条目(7111-7113 战前强攻 + 7010-7019 玩家计时性强化)。
This commit is contained in:
@@ -15,12 +15,15 @@ export class ActiveBuff {
|
||||
source_ap_snapshot: number;
|
||||
/** 周期效果累计时间(秒) */
|
||||
tick_acc: number = 0;
|
||||
/** 修饰数值覆写(来自药水卡 buff_value),优先于 BuffList 配置值;undefined 表示用配置值 */
|
||||
value_override?: number;
|
||||
|
||||
constructor(cfg_id: number, dur: number, src_uuid: number, src_ap: number) {
|
||||
constructor(cfg_id: number, dur: number, src_uuid: number, src_ap: number, value_override?: number) {
|
||||
this.config_id = cfg_id;
|
||||
this.remaining = dur;
|
||||
this.source_uuid = src_uuid;
|
||||
this.source_ap_snapshot = src_ap;
|
||||
this.value_override = value_override;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,19 +4,23 @@
|
||||
* 设计说明:
|
||||
* - 非 ECS 组件,是普通 class 单例(参考 smc 的单例暴露模式)。
|
||||
* - 对外提供 applyBuff / dispel / getStack / hasControl 四组核心能力。
|
||||
* - 控制类 buff 采用"双写"策略:既写入 BuffComp(新框架),也同步调用
|
||||
* HeroAttrsComp.toFrost/toStun(旧框架),保证过渡期表现一致。
|
||||
* - 控制类 buff(冰冻/眩晕)统一写入 BuffComp,由 BuffSystem 计时到期;
|
||||
* 旧字段 frost_end_time/stun_end_time 已随 HeroBuffSystem 一并下线。
|
||||
*/
|
||||
|
||||
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
||||
import { BuffCategory, BuffConfig, BuffList } from "../common/config/BuffSet";
|
||||
import { FightSet } from "../common/config/GameSet";
|
||||
import { HeroAttrsComp } from "./HeroAttrsComp";
|
||||
import { BuffCategory, BuffList } from "../common/config/BuffSet";
|
||||
import { BuffComp, ActiveBuff } from "./BuffComp";
|
||||
import { mLogger } from "../common/Logger";
|
||||
|
||||
/** applyBuff 的覆盖参数(预留按需覆写持续时间) */
|
||||
/** Buff 模块调试日志开关 */
|
||||
const DEBUG = false;
|
||||
|
||||
/** applyBuff 的覆盖参数(预留按需覆写持续时间 / 修饰数值) */
|
||||
export interface BuffApplyOverrides {
|
||||
duration?: number;
|
||||
/** 覆写计时 buff 的修饰数值(modifiers.value / tick.damage_or_heal),由药水卡 buff_value 自定义档位 */
|
||||
value?: number;
|
||||
}
|
||||
|
||||
class BuffManagerImpl {
|
||||
@@ -26,9 +30,7 @@ class BuffManagerImpl {
|
||||
* 叠层规则:
|
||||
* - max_stack === 0:无限叠加,始终 push 新层
|
||||
* - existing.length < max_stack:push 新层
|
||||
* - 已满:替换最老层(数组末尾)
|
||||
*
|
||||
* 控制类(is_control)额外双写旧字段(frost/stun)。
|
||||
* - 已满:移除最老层(数组首部)后追加新层,保持 FIFO 刷新语义
|
||||
*
|
||||
* @param target 目标实体
|
||||
* @param buffId BuffList 配置 id
|
||||
@@ -38,7 +40,11 @@ class BuffManagerImpl {
|
||||
*/
|
||||
applyBuff(target: ecs.Entity, buffId: number, sourceUuid: number = 0, sourceAp: number = 0, overrides?: BuffApplyOverrides): void {
|
||||
const cfg = BuffList[buffId];
|
||||
if (!cfg) return;
|
||||
if (!cfg) {
|
||||
mLogger.warn(true, "BuffManager", `applyBuff: buffId=${buffId} 配置不存在,跳过`);
|
||||
return;
|
||||
}
|
||||
mLogger.log(DEBUG, "BuffManager", `applyBuff: buff=${cfg.name}(${buffId}) target_eid=${target.eid} duration=${overrides?.duration ?? cfg.duration} value_override=${overrides?.value} source_ap=${sourceAp}`);
|
||||
|
||||
const buffComp = this.ensureBuffComp(target);
|
||||
const duration = overrides?.duration ?? cfg.duration;
|
||||
@@ -49,21 +55,15 @@ class BuffManagerImpl {
|
||||
buffComp.buffs.set(buffId, layers);
|
||||
}
|
||||
|
||||
const newLayer = new ActiveBuff(buffId, duration, sourceUuid, sourceAp);
|
||||
const newLayer = new ActiveBuff(buffId, duration, sourceUuid, sourceAp, overrides?.value);
|
||||
|
||||
if (cfg.max_stack === 0 || layers.length < cfg.max_stack) {
|
||||
layers.push(newLayer);
|
||||
} else {
|
||||
// 已满,移除最老层(数组首部)后追加新层,保持 FIFO 刷新语义
|
||||
layers.shift();
|
||||
layers.push(newLayer);
|
||||
}
|
||||
|
||||
// 控制类双写旧字段
|
||||
if (cfg.is_control) {
|
||||
this.applyControlEffect(target, cfg, duration);
|
||||
}
|
||||
|
||||
buffComp.dirty_buffs = true;
|
||||
}
|
||||
|
||||
@@ -80,8 +80,6 @@ class BuffManagerImpl {
|
||||
const buffComp = target.get(BuffComp);
|
||||
|
||||
let removedKinds = 0;
|
||||
const controlKindsCleared: ('frost' | 'stun')[] = [];
|
||||
|
||||
buffComp.buffs.forEach((layers, buffId) => {
|
||||
const cfg = BuffList[buffId];
|
||||
if (!cfg) return;
|
||||
@@ -90,18 +88,8 @@ class BuffManagerImpl {
|
||||
|
||||
if (layers.length > 0) removedKinds++;
|
||||
buffComp.buffs.delete(buffId);
|
||||
|
||||
// 记录被驱散的控制类型,用于后续重算
|
||||
if (cfg.is_control && cfg.control_kind && cfg.control_kind !== 'none') {
|
||||
controlKindsCleared.push(cfg.control_kind);
|
||||
}
|
||||
});
|
||||
|
||||
// 控制类驱散后重算旧字段
|
||||
if (controlKindsCleared.length > 0) {
|
||||
this.recomputeControlState(target, controlKindsCleared);
|
||||
}
|
||||
|
||||
buffComp.dirty_buffs = true;
|
||||
return removedKinds;
|
||||
}
|
||||
@@ -118,23 +106,15 @@ class BuffManagerImpl {
|
||||
|
||||
/**
|
||||
* 判断目标是否处于指定类型的控制状态下。
|
||||
* 同时检查新框架 BuffComp 和旧字段,兼容过渡期。
|
||||
* 唯一判定来源:BuffComp 中是否存在对应 control_kind 的活跃控制 buff。
|
||||
*/
|
||||
hasControl(target: ecs.Entity, kind: 'frost' | 'stun'): boolean {
|
||||
// 新框架:检查 BuffComp 中是否有对应控制类 buff
|
||||
if (target.has(BuffComp)) {
|
||||
const buffComp = target.get(BuffComp);
|
||||
for (const [buffId, layers] of buffComp.buffs) {
|
||||
if (layers.length === 0) continue;
|
||||
const cfg = BuffList[buffId];
|
||||
if (cfg?.is_control && cfg.control_kind === kind) return true;
|
||||
}
|
||||
}
|
||||
// 旧字段兜底
|
||||
if (target.has(HeroAttrsComp)) {
|
||||
const attrs = target.get(HeroAttrsComp);
|
||||
if (kind === 'frost') return attrs.isFrost();
|
||||
if (kind === 'stun') return attrs.isStun();
|
||||
if (!target.has(BuffComp)) return false;
|
||||
const buffComp = target.get(BuffComp);
|
||||
for (const [buffId, layers] of buffComp.buffs) {
|
||||
if (layers.length === 0) continue;
|
||||
const cfg = BuffList[buffId];
|
||||
if (cfg?.is_control && cfg.control_kind === kind) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -150,59 +130,6 @@ class BuffManagerImpl {
|
||||
}
|
||||
return target.get(BuffComp);
|
||||
}
|
||||
|
||||
/**
|
||||
* 控制效果双写:将控制类 buff 同步写入旧字段。
|
||||
* duration 会被换算成 toFrost/toStun 所需的倍数参数。
|
||||
*/
|
||||
private applyControlEffect(target: ecs.Entity, cfg: BuffConfig, duration: number): void {
|
||||
if (!target.has(HeroAttrsComp)) return;
|
||||
const attrs = target.get(HeroAttrsComp);
|
||||
|
||||
if (cfg.control_kind === 'frost') {
|
||||
// toFrost(time) 内部会乘以 FROST_TIME,这里反除得到倍数
|
||||
attrs.toFrost(duration / FightSet.FROST_TIME);
|
||||
} else if (cfg.control_kind === 'stun') {
|
||||
attrs.toStun(duration / FightSet.STUN_TIME);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 驱散控制 buff 后重算旧字段。
|
||||
* 如果对应类型的控制 buff 已全部清除,则立即将旧字段归零。
|
||||
*
|
||||
* @param target 目标实体
|
||||
* @param clearedKinds 本次被驱散的控制类型列表
|
||||
*/
|
||||
private recomputeControlState(target: ecs.Entity, clearedKinds: ('frost' | 'stun')[]): void {
|
||||
if (!target.has(HeroAttrsComp)) return;
|
||||
const attrs = target.get(HeroAttrsComp);
|
||||
|
||||
// 检查是否还有同类型控制 buff 残留
|
||||
const hasFrostInBuff = this.hasControlInBuff(target, 'frost');
|
||||
const hasStunInBuff = this.hasControlInBuff(target, 'stun');
|
||||
|
||||
if (clearedKinds.includes('frost') && !hasFrostInBuff) {
|
||||
attrs.frost_end_time = 0;
|
||||
}
|
||||
if (clearedKinds.includes('stun') && !hasStunInBuff) {
|
||||
attrs.stun_end_time = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 仅检查 BuffComp 中是否存在指定控制类型(不查旧字段)。
|
||||
*/
|
||||
private hasControlInBuff(target: ecs.Entity, kind: 'frost' | 'stun'): boolean {
|
||||
if (!target.has(BuffComp)) return false;
|
||||
const buffComp = target.get(BuffComp);
|
||||
for (const [buffId, layers] of buffComp.buffs) {
|
||||
if (layers.length === 0) continue;
|
||||
const cfg = BuffList[buffId];
|
||||
if (cfg?.is_control && cfg.control_kind === kind) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/** Buff 管理器单例(全局唯一实例) */
|
||||
|
||||
@@ -5,10 +5,9 @@
|
||||
* - 遍历 BuffComp.buffs,每层 remaining -= 步长
|
||||
* - 若配置了 tick 效果(DoT/HoT),累计 tick_acc 并按 interval 结算伤害/治疗
|
||||
* - 到期的层从数组中移除;数组空则清理 key
|
||||
* - 兼容期:同时递减旧字段 frost_end_time / stun_end_time
|
||||
*
|
||||
* 注意:当前 HeroBuffSystem 仍在运行相同的 frost/stun 递减逻辑,
|
||||
* 待旧系统完全下线后可移除此处兼容代码。
|
||||
* 控制类 buff(冰冻/眩晕)不在此处做特殊处理:层存活期间 hasControl 判定
|
||||
* 即生效,到期移除后控制自然解除。旧 HeroBuffSystem 已下线。
|
||||
*/
|
||||
|
||||
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
||||
@@ -16,6 +15,10 @@ import { Timer } from "db://oops-framework/core/common/timer/Timer";
|
||||
import { BuffList } from "../common/config/BuffSet";
|
||||
import { HeroAttrsComp } from "./HeroAttrsComp";
|
||||
import { BuffComp, ActiveBuff } from "./BuffComp";
|
||||
import { mLogger } from "../common/Logger";
|
||||
|
||||
/** Buff 模块调试日志开关 */
|
||||
const DEBUG = false;
|
||||
|
||||
/** 固定步长(秒) */
|
||||
const TICK_STEP = 0.1;
|
||||
@@ -61,6 +64,7 @@ export class BuffSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
|
||||
if (cfg.duration > 0 && layer.remaining <= 0) {
|
||||
layers.splice(i, 1);
|
||||
anyChanged = true;
|
||||
mLogger.log(DEBUG, "BuffSystem", `buff 到期移除: ${cfg.name}(${buffId}) eid=${e.eid} 剩余层数=${layers.length}`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,8 +95,10 @@ export class BuffSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
|
||||
while (layer.tick_acc >= tick.interval) {
|
||||
layer.tick_acc -= tick.interval;
|
||||
// 按 ap 缩放后取整:floor(dmg * (1 + ap_snapshot * scale_pct / 10000))
|
||||
// damage_or_heal 优先取药水卡覆写值
|
||||
const baseAmount = layer.value_override !== undefined ? layer.value_override : tick.damage_or_heal;
|
||||
const scale = 1 + layer.source_ap_snapshot * tick.scale_by_ap_pct / 10000;
|
||||
const amount = Math.floor(tick.damage_or_heal * scale);
|
||||
const amount = Math.floor(baseAmount * scale);
|
||||
attrs.add_hp(amount);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -200,14 +200,14 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpda
|
||||
targetView.playEnd(skillConf.endAnm);
|
||||
if (isFrost) {
|
||||
TAttrsComp.toFrost();
|
||||
targetView.in_iced(TAttrsComp.frost_end_time);
|
||||
targetView.in_iced(FightSet.FROST_TIME);
|
||||
if (damageEvent.Attrs.fac === FacSet.HERO) {
|
||||
smc.vmdata.scores.freeze_count++;
|
||||
}
|
||||
}
|
||||
if (isStun) {
|
||||
TAttrsComp.toStun();
|
||||
targetView.in_stun(TAttrsComp.stun_end_time);
|
||||
targetView.in_stun(FightSet.STUN_TIME);
|
||||
if (damageEvent.Attrs.fac === FacSet.HERO) {
|
||||
smc.vmdata.scores.stun_count++;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
||||
import { HeroDisVal, HeroInfo, HSkillInfo, HType, SkillTriggerType } from "../common/config/heroSet";
|
||||
import { mLogger } from "../common/Logger";
|
||||
import { Timer } from "db://oops-framework/core/common/timer/Timer";
|
||||
import { FacSet, FightSet } from "../common/config/GameSet";
|
||||
import { FieldSkillSet, FieldSkillType, SkillOverrides } from "../common/config/SkillSet";
|
||||
import { smc } from "../common/SingletonModuleComp";
|
||||
@@ -9,6 +8,11 @@ import { Attrs } from "../common/config/HeroAttrs";
|
||||
import { FieldSkillHelper } from "./FieldSkillHelper";
|
||||
import { BuffComp } from "./BuffComp";
|
||||
import { BuffList, ModOp } from "../common/config/BuffSet";
|
||||
import { buffManager } from "./BuffManager";
|
||||
|
||||
/** 控制类 buff 配置 id(对应 BuffList) */
|
||||
const BUFF_ID_FROST = 7003;
|
||||
const BUFF_ID_STUN = 7004;
|
||||
@ecs.register('HeroAttrs')
|
||||
export class HeroAttrsComp extends ecs.Comp {
|
||||
public debugMode: boolean = false;
|
||||
@@ -66,9 +70,6 @@ export class HeroAttrsComp extends ecs.Comp {
|
||||
invincible_time: number = 0;// 无敌时间
|
||||
|
||||
|
||||
frost_end_time: number = 0;
|
||||
stun_end_time: number = 0;
|
||||
|
||||
boom: boolean = false; // 自爆怪
|
||||
|
||||
// ==================== 脏标签标记 ====================
|
||||
@@ -108,8 +109,6 @@ export class HeroAttrsComp extends ecs.Comp {
|
||||
* 从 HeroInfo 读取初始配置,建立属性系统
|
||||
*/
|
||||
initAttrs() {
|
||||
this.frost_end_time = 0;
|
||||
this.stun_end_time = 0;
|
||||
}
|
||||
/*******************基础属性管理********************/
|
||||
|
||||
@@ -169,14 +168,16 @@ export class HeroAttrsComp extends ecs.Comp {
|
||||
}
|
||||
|
||||
|
||||
/** 施加冰冻:委托 buffManager 写入 BuffComp,duration = FROST_TIME * time */
|
||||
toFrost(time: number = 1) {
|
||||
const frostTime = FightSet.FROST_TIME * time;
|
||||
this.frost_end_time = Math.max(this.frost_end_time, frostTime);
|
||||
if (!this.ent) return;
|
||||
buffManager.applyBuff(this.ent, BUFF_ID_FROST, 0, 0, { duration: FightSet.FROST_TIME * time });
|
||||
}
|
||||
|
||||
/** 施加击晕:委托 buffManager 写入 BuffComp,并清零技能 CD */
|
||||
toStun(time: number = 1) {
|
||||
const stunTime = FightSet.STUN_TIME * time;
|
||||
this.stun_end_time = Math.max(this.stun_end_time, stunTime);
|
||||
if (!this.ent) return;
|
||||
buffManager.applyBuff(this.ent, BUFF_ID_STUN, 0, 0, { duration: FightSet.STUN_TIME * time });
|
||||
|
||||
// 击晕时 CD 清零
|
||||
for (const key in this.skills) {
|
||||
@@ -217,11 +218,13 @@ export class HeroAttrsComp extends ecs.Comp {
|
||||
skill.ccd = Math.min(actualCd, skill.ccd + dt);
|
||||
}
|
||||
}
|
||||
/** 是否处于冰冻状态(统一走 BuffComp 判定) */
|
||||
isFrost(): boolean {
|
||||
return this.frost_end_time > 0
|
||||
return !!this.ent && buffManager.hasControl(this.ent, 'frost');
|
||||
}
|
||||
/** 是否处于击晕状态(统一走 BuffComp 判定) */
|
||||
isStun(): boolean {
|
||||
return this.stun_end_time > 0
|
||||
return !!this.ent && buffManager.hasControl(this.ent, 'stun');
|
||||
}
|
||||
getSkillLevel(skillId: number): number {
|
||||
if (!skillId) return 0;
|
||||
@@ -350,14 +353,17 @@ export class HeroAttrsComp extends ecs.Comp {
|
||||
if (!cfg || !cfg.modifiers) return;
|
||||
// 每层独立贡献,模拟叠层放大效果
|
||||
for (let i = 0; i < layers.length; i++) {
|
||||
const layerVal = layers[i].value_override; // 药水卡覆写值优先
|
||||
for (const mod of cfg.modifiers) {
|
||||
if (mod.attr !== attr) continue;
|
||||
const value = layerVal !== undefined ? layerVal : mod.value;
|
||||
mLogger.log(this.debugMode, "HeroAttrs", `aggregateTimedMods 命中: ${this.hero_name} buff=${cfg.name} attr=${attr} op=${mod.op} value=${value} remaining=${layers[i].remaining.toFixed(1)}`);
|
||||
if (mod.op === ModOp.Flat) {
|
||||
result.flatSum += mod.value;
|
||||
result.flatSum += value;
|
||||
} else {
|
||||
// PercentAdd 与 PercentMul 暂统一按加法百分比聚合;
|
||||
// PercentMul 真正的独立乘区尚未启用,TODO: 启用时需改造为多乘区连乘
|
||||
result.pctSum += mod.value;
|
||||
result.pctSum += value;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -372,7 +378,11 @@ export class HeroAttrsComp extends ecs.Comp {
|
||||
public getFinalAp(): number {
|
||||
const runtimeAp = this.getRuntimeAp(this.ap);
|
||||
const mods = this.aggregateTimedMods(Attrs.ap);
|
||||
return (runtimeAp + mods.flatSum) * (1 + mods.pctSum / 100);
|
||||
const final = (runtimeAp + mods.flatSum) * (1 + mods.pctSum / 100);
|
||||
if (this.debugMode && (mods.flatSum !== 0 || mods.pctSum !== 0)) {
|
||||
mLogger.log(this.debugMode, "HeroAttrs", `getFinalAp: ${this.hero_name} base=${this.ap} runtime=${runtimeAp.toFixed(1)} flat=${mods.flatSum} pct=${mods.pctSum} final=${final.toFixed(1)}`);
|
||||
}
|
||||
return final;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -471,7 +481,9 @@ export class HeroAttrsComp extends ecs.Comp {
|
||||
const skill = this.skills[skillId];
|
||||
if (!skill) return 0;
|
||||
if (skill.cd <= 0) return 0;
|
||||
const speedBonus = this.getRuntimeAttackSpeedBonus();
|
||||
// 攻速 = 驻场加成 + 计时性 buff 修饰(speed 属性的 flat/pct 均按攻速百分点处理)
|
||||
const timedMods = this.aggregateTimedMods(Attrs.speed);
|
||||
const speedBonus = this.getRuntimeAttackSpeedBonus() + timedMods.flatSum + timedMods.pctSum;
|
||||
if (speedBonus <= 0) return skill.cd;
|
||||
const speedRate = 1 + speedBonus / 100;
|
||||
return Math.max(HeroAttrsComp.minAttackCd, skill.cd / speedRate);
|
||||
@@ -549,9 +561,6 @@ export class HeroAttrsComp extends ecs.Comp {
|
||||
this.wfuny = 0;
|
||||
this.boom = false;
|
||||
|
||||
this.frost_end_time = 0;
|
||||
this.stun_end_time = 0;
|
||||
|
||||
// 重置技能距离缓存
|
||||
this.maxSkillDistance = 0;
|
||||
this.minSkillDistance = 0;
|
||||
@@ -580,32 +589,5 @@ export class HeroAttrsComp extends ecs.Comp {
|
||||
}
|
||||
}
|
||||
|
||||
@ecs.register('HeroBuffSystem')
|
||||
export class HeroBuffSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate {
|
||||
private timer = new Timer(0.1)
|
||||
filter(): ecs.IMatcher {
|
||||
return ecs.allOf(HeroAttrsComp);
|
||||
}
|
||||
|
||||
update(e: ecs.Entity): void {
|
||||
if (this.timer.update(this.dt)) {
|
||||
const attrsComp = e.get(HeroAttrsComp);
|
||||
if (attrsComp.frost_end_time > 0) {
|
||||
attrsComp.frost_end_time -= 0.1;
|
||||
if (attrsComp.frost_end_time <= 0) {
|
||||
attrsComp.frost_end_time = 0;
|
||||
}
|
||||
}
|
||||
if (attrsComp.stun_end_time > 0) {
|
||||
attrsComp.stun_end_time -= 0.1;
|
||||
if (attrsComp.stun_end_time <= 0) {
|
||||
attrsComp.stun_end_time = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
void e;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ import { GameEvent } from "../common/config/GameEvent";
|
||||
import { SkillTriggerType } from "../common/config/heroSet";
|
||||
import { SkillTriggerHelper } from "./SkillTriggerHelper";
|
||||
import { MissionEconomy } from "../map/MissionEconomy";
|
||||
import { mLogger } from "../common/Logger";
|
||||
import { MissionHeroComp } from "../map/MissionHeroComp";
|
||||
import { buffManager } from "./BuffManager";
|
||||
|
||||
@@ -142,10 +143,11 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
|
||||
}
|
||||
}
|
||||
|
||||
console.log("[SCastSystem] forceCastCardSkill: casting skill", s_uuid, "castTimes", castTimes, "targetPos", targetPos);
|
||||
mLogger.log(this.debugMode, "SCastSystem", "forceCastCardSkill: casting skill", s_uuid, "castTimes", castTimes, "targetPos", targetPos, "isFriendly", isFriendly, "buff_value", config.buff_value, "timed_buff_id", config.timed_buff_id);
|
||||
for (let i = 0; i < castTimes; i++) {
|
||||
if (isFriendly) {
|
||||
const friendlyTargets = this.resolveFriendlyTargets(targetEids, FacSet.HERO);
|
||||
mLogger.log(this.debugMode, "SCastSystem", "friendlyTargets count =", friendlyTargets.length);
|
||||
if (friendlyTargets.length === 0) continue;
|
||||
this.applyFriendlySkillEffects(s_uuid, cardLv, config, null as any, mockAttrs, friendlyTargets, spawnPos);
|
||||
} else {
|
||||
@@ -455,12 +457,11 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
private applyActualFriendlyEffect(target: HeroViewComp, kind: SkillKind, sAp: number, _cAttrsComp: HeroAttrsComp, config: SkillConfig, sUp: any, _skillLv: number = 1) {
|
||||
if (!target.ent) return;
|
||||
const model = target.ent.get(HeroAttrsComp);
|
||||
if (!model || model.is_dead) return;
|
||||
mLogger.log(this.debugMode, "SCastSystem", `applyActualFriendlyEffect: skill=${config.uuid} kind=${kind} buff_type=${config.buff_type} timed_buff_id=${config.timed_buff_id} buff_value=${config.buff_value} target=${model.hero_name}`);
|
||||
|
||||
if (config.endAnm && config.endAnm !== "") {
|
||||
target.playEnd(config.endAnm);
|
||||
@@ -493,7 +494,8 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
|
||||
target.ent,
|
||||
config.timed_buff_id,
|
||||
_cAttrsComp.hero_uuid,
|
||||
_cAttrsComp.ap
|
||||
_cAttrsComp.ap,
|
||||
config.buff_value !== undefined ? { value: config.buff_value } : undefined
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user