- 删除 SCDSystem、HeroAttrSystem 等独立系统,将功能整合到现有组件 - 移除 TalComp 天赋组件及相关配置(TalSet、AttrSet、CardSet) - 清理 HeroAttrs 中未使用的属性枚举,保留核心战斗属性 - 简化 Hero 实体创建逻辑,不再为主角挂载天赋组件 - 移除 SingletonModuleComp 中与天赋、经验、收集相关的数据管理
223 lines
7.3 KiB
TypeScript
223 lines
7.3 KiB
TypeScript
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<number, Array<{value: number, BType: BType,time:number}>> = {};
|
||
DEBUFFS: Record<number, Array<{value: number, BType: BType,time:number}>> = {};
|
||
|
||
// ==================== 标记状态 ====================
|
||
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);
|
||
}
|
||
|
||
|
||
|
||
}
|
||
|
||
|
||
|