import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops"; import { GameEvent } from "../common/config/GameEvent"; import { Attrs, AttrsType, BType, NeAttrs } from "../common/config/HeroAttrs"; import { BuffConf, SkillRange } from "../common/config/SkillSet"; import { HeroInfo, AttrSet, HType, JobUpConf } from "../common/config/heroSet"; import { HeroSkillsComp } from "./HeroSkills"; import { smc } from "../common/SingletonModuleComp"; import { mLogger } from "../common/Logger"; import { _decorator } from "cc"; const { property } = _decorator; interface talTrigger{ value:number count:number } @ecs.register('HeroAttrs') export class HeroAttrsComp extends ecs.Comp { public debugMode: boolean = true; Ebus:any=null! // ==================== 角色基础信息 ==================== hero_uuid: number = 1001; hero_name: string = "hero"; lv: number = 1; type: number = 0; // 0近战 1远程 2辅助 fac: number = 0; // 0:hero 1:monster rangeType:SkillRange = SkillRange.Melee; // ==================== 基础属性(有初始值) ==================== ap: number = 0; // 基础攻击 hp: number = 100; // 基础血量 hp_max: number = 100; // 最大血量 speed: number = 100; // 基础移动速度 dis: number = 100; // 基础距离 shield: number = 0; // 当前护盾 shield_max: number = 0; // 最大护盾值 // ==================== 脏标签标记 ==================== dirty_hp: boolean = false; // 血量变更标记 dirty_mp: boolean = false; // 魔法值变更标记 dirty_shield: boolean = false; // 护盾变更标记 // ==================== 技能距离缓存 ==================== maxSkillDistance: number = 0; // 最远技能攻击距离(缓存,受MP影响) minSkillDistance: number = 0; // 最近技能攻击距离(缓存,不受MP影响,用于停止位置判断) // ==================== Buff/Debuff 系统 ==================== /** 持久型buff数组 - 不会自动过期 */ BUFFS: Record> = {}; DEBUFFS: Record> = {}; // ==================== 标记状态 ==================== is_dead: boolean = false; is_count_dead: boolean = false; is_atking: boolean = false; // 是否正在攻击 is_stop: boolean = false; // 是否正在停止 is_boss: boolean = false; is_big_boss: boolean = false; is_master: boolean = false; is_friend: boolean = false; is_kalami: boolean = false; is_reviving: boolean = false; // 是否正在复活中 // ==================== 计数统计 ==================== atk_count: number = 0; // 攻击次数 atked_count: number = 0; // 被攻击次数 killed_count:number=0; // 注意:技能数据已迁移到 HeroSkillsComp,不再存储在这里 start(){ } // ==================== BUFF 系统初始化 ==================== /** * 初始化角色的 buff debuff * 从 HeroInfo 读取初始配置,建立属性系统 */ initAttrs() { // 清空现有 buff/debuff this.BUFFS = {}; this.DEBUFFS = {}; // 获取英雄配置 const heroInfo = HeroInfo[this.hero_uuid]; if (!heroInfo) return; } /*******************基础属性管理********************/ add_hp(value:number,isValue:boolean){ const oldHp = this.hp; let addValue = value; if(!isValue){ addValue = value * this.hp_max / 100; } // ✅ 数据层只负责数据修改,不调用视图层 // let heroView = this.ent.get(HeroViewComp); // if(heroView && addValue > 0){ // heroView.health(addValue); // } this.hp += addValue; this.hp = Math.max(0, Math.min(this.hp, this.hp_max)); this.dirty_hp = true; // ✅ 仅标记需要更新 mLogger.log(this.debugMode, 'HeroAttrs', ` HP变更: ${this.hero_name}, 变化=${addValue.toFixed(1)}, ${oldHp.toFixed(1)} -> ${this.hp.toFixed(1)}`); } add_shield(value:number,isValue:boolean){ const oldShield = this.shield; let addValue = value; if(!isValue){ addValue = value * this.shield_max / 100; } this.shield += addValue; this.dirty_shield = true; // 标记护盾需要更新 mLogger.log(this.debugMode, 'HeroAttrs', ` 护盾变更: ${this.hero_name}, 变化=${addValue.toFixed(1)}, ${oldShield.toFixed(1)} -> ${this.shield.toFixed(1)}`); } // ==================== BUFF 管理 ==================== /** * 添加 buff 效果(支持多次叠加) * @param buffConf buff 配置 (来自 SkillSet.BuffConf heroSet.buff) */ addBuff(buffConf: BuffConf) { } // ==================== 临时 BUFF/DEBUFF 更新 ==================== /** * 更新临时 buff/debuff 的剩余时间 * @param dt 时间增量 */ updateBuffsDebuffs(dt: number) { } // ==================== 技能距离缓存管理 ==================== /** * 更新技能距离缓存 * 在技能初始化、新增技能、MP变化时调用 * @param skillsComp 技能组件 */ public updateSkillDistanceCache(skillsComp: HeroSkillsComp): void { if (!skillsComp) { this.maxSkillDistance = 0; this.minSkillDistance = 0; return; } // 最远距离使用当前MP可施放的技能 this.maxSkillDistance = skillsComp.getMaxSkillDistance(); // 最近距离使用所有技能中的最小距离,不考虑MP限制,用于停止位置判断 this.minSkillDistance = skillsComp.getAbsoluteMinSkillDistance(); } /** * 获取缓存的最远技能攻击距离 * @returns 最远攻击距离 */ public getCachedMaxSkillDistance(): number { return this.maxSkillDistance; } /** * 获取缓存的最近技能攻击距离 * @returns 最近攻击距离 */ public getCachedMinSkillDistance(): number { return this.minSkillDistance; } reset() { // 重置为初始状态 this.hero_uuid = 1001; this.hero_name = "hero"; this.lv = 1; this.type = 0; this.fac = 0; this.ap = 0; this.hp = 100; this.speed = 100; this.dis = 0; this.hp = 100; this.shield = 0; this.shield_max = 0; this.BUFFS = {}; this.DEBUFFS = {}; // 重置技能距离缓存 this.maxSkillDistance = 0; this.minSkillDistance = 0; this.is_dead = false; this.is_count_dead = false; this.is_atking = false; this.is_stop = false; this.is_boss = false; this.is_big_boss = false; this.is_master = false; this.is_friend = false; this.is_kalami = false; this.is_reviving = false; this.atk_count = 0; this.atked_count = 0; this.killed_count =0; // 重置脏标签 this.dirty_hp = false; this.dirty_mp = false; this.dirty_shield = false; smc.updateHeroInfo(this); } }