Files
pixelheros/assets/script/game/skill/STimeComp.ts
panw 5634b49fee fix(技能): 修复瞬时技能碰撞检测关闭时机
移除基于 pendingClose 的延迟关闭逻辑,改为在攻击帧中立即调度关闭碰撞检测。
这避免了同一帧内对同一目标造成多次伤害的问题,并简化了时间类型技能的处理逻辑。
2026-03-16 09:10:03 +08:00

53 lines
1.7 KiB
TypeScript

import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { EType, SkillSet } from "../common/config/SkillSet";
import { SkillView } from "./SkillView";
import { smc } from "../common/SingletonModuleComp";
@ecs.register('StimeDataComp')
export class StimeDataComp extends ecs.Comp {
s_uuid: number = 0;
totalTime: number = 0;
elapsedTime: number = 0;
hitInterval: number = 0;
hitElapsed: number = 0;
reset() {
this.s_uuid = 0;
this.totalTime = 0;
this.elapsedTime = 0;
this.hitInterval = 0;
this.hitElapsed = 0;
}
}
@ecs.register('STimeSystem')
export class STimeSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate {
filter(): ecs.IMatcher {
return ecs.allOf(StimeDataComp, SkillView);
}
update(entity: ecs.Entity): void {
if(!smc.mission.play ) return;
if(smc.mission.pause) return
const timeComp = entity.get(StimeDataComp);
const skillView = entity.get(SkillView);
if (!timeComp || !skillView) return;
const conf = SkillSet[timeComp.s_uuid];
if (!conf || conf.EType !== EType.timeEnd) return;
if (timeComp.totalTime <= 0) {
skillView.close_collider();
entity.destroy();
return;
}
timeComp.elapsedTime += this.dt;
timeComp.hitElapsed += this.dt;
if (timeComp.hitInterval > 0 && timeComp.hitElapsed >= timeComp.hitInterval) {
timeComp.hitElapsed -= timeComp.hitInterval;
skillView.atk(null);
}
if (timeComp.elapsedTime >= timeComp.totalTime) {
skillView.close_collider();
entity.destroy();
}
}
}