import { _decorator, v3, Vec3 } from "cc"; import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp"; import { Monster } from "../hero/Mon"; import { MonSet } from "../common/config/heroSet"; import { FightSet } from "../common/config/Mission"; import { RandomManager } from "db://oops-framework/core/common/random/RandomManager"; import { Timer } from "db://oops-framework/core/common/timer/Timer"; import { smc } from "../common/SingletonModuleComp"; import { GameEvent } from "../common/config/GameEvent"; import { oops } from "db://oops-framework/core/Oops"; // 导入肉鸽配置 import { getRogueWaveConfig, RogueConfig, RogueWaveType, AffixCountConfig, MonsterAffixConfig } from "./RogueConfig"; import { MonModelComp } from "../hero/MonModelComp"; const { ccclass, property } = _decorator; /** 视图层对象 */ @ccclass('MissionMonCompComp') @ecs.register('MissionMonComp', false) export class MissionMonCompComp extends CCComp { // 添加刷怪队列 - 扩展支持词条 private monsterQueue: Array<{ uuid: number, position: number, isBoss: boolean, level: number, affixes?: any[], buffData?: any[], // 使用BuffAttr格式的buff数据 rogueHp?: number, // 肉鸽固定血量 rogueAttack?: number // 肉鸽固定攻击力 }> = []; private isSpawning: boolean = false;// 是否正在生成怪物 private spawnInterval: number = 0.1; // 每个怪物生成间隔时间 private spawnTimer: number = 0; // 生成计时器 private spawnCount: number = 0; // 召唤计数器 private pauseInterval: number = 5.0; // 暂停间隔时间(5秒) private isPausing: boolean = false; // 是否正在暂停 onLoad(){ this.on(GameEvent.NewWave,this.do_mon_wave,this) } /** 视图层逻辑代码分离演示 */ start() { // var entity = this.ent as ecs.Entity; // ecs.Entity 可转为当前模块的具体实体对象 // this.on(ModuleEvent.Cmd, this.onHandler, this); } protected update(dt: number): void { if(!smc.mission.play||smc.mission.pause) return // 处理刷怪队列 if (this.monsterQueue.length > 0 && !this.isSpawning) { this.spawnTimer += dt; // 检查是否需要暂停(每召唤5次后暂停5秒) if (this.isPausing) { if (this.spawnTimer >= this.pauseInterval) { // 暂停结束,重置状态 this.isPausing = false; this.spawnCount = 0; this.spawnTimer = 0; console.log("[MissionMonComp]: 暂停结束,继续召唤怪物"); } return; // 暂停期间不召唤怪物 } // 正常召唤间隔 if (this.spawnTimer >= this.spawnInterval) { this.spawnNextMonster(); this.spawnTimer = 0; // 检查是否需要进入暂停状态 if (this.spawnCount >= 5) { this.isPausing = true; this.spawnTimer = 0; // 重置计时器用于暂停计时 console.log("[MissionMonComp]: 已召唤5只怪物,开始暂停5秒"); } } } } do_mon_wave(){ console.log("[MissionMonComp]:怪物登场,当前波次 :",smc.vmdata.mission_data.current_wave) // 重置召唤相关状态 this.spawnCount = 0; this.isPausing = false; this.spawnTimer = 0; const currentWave = smc.vmdata.mission_data.current_wave; // 使用肉鸽模式配置 const rogueWaveConfig = getRogueWaveConfig(currentWave); console.log(`[MissionMonComp]:肉鸽模式第${currentWave}波配置:`, rogueWaveConfig.description); this.generateRogueMonstersFromConfig(rogueWaveConfig); } // 根据肉鸽配置生成怪物(肉鸽模式) private generateRogueMonstersFromConfig(rogueWaveConfig: any) { const { monsters, waveType } = rogueWaveConfig; const currentWave = smc.vmdata.mission_data.current_wave; const monsterLevel = RogueConfig.getMonsterLevel(currentWave); smc.vmdata.mission_data.mon_num=monsters.reduce((total: number, group: any) => total + group.count, 0); // 固定9波模式,所有波次都是战斗波次 console.log(`[MissionMonComp]:第${currentWave}波 - ${waveType}战斗波次`); if (!monsters || monsters.length === 0) { console.warn(`[MissionMonComp]:肉鸽波次配置中没有怪物信息`); return; } monsters.forEach((monsterGroup: any) => { const { uuid, count, affixes, enhancedStats, buffData, isBoss, rogueHp, rogueAttack } = monsterGroup; // 为每个怪物组生成指定数量的怪物 for (let i = 0; i < count; i++) { // 位置循环使用 (0-9),如果怪物数量超过10个位置,则循环使用 const position = i % 5; this.addToSpawnQueueWithAffixes( uuid, position, isBoss || false, monsterLevel, affixes, buffData, // 现在传递buffData而不是enhancedStats和specialEffects rogueHp, // 传递固定血量 rogueAttack // 传递固定攻击力 ); } }); const totalMonsters = monsters.reduce((total: number, group: any) => total + group.count, 0); console.log(`[MissionMonComp]:肉鸽模式本波次将生成 ${totalMonsters} 只怪物,等级: ${monsterLevel}`); // 输出词条信息 monsters.forEach((monsterGroup: any) => { if (monsterGroup.buffData && monsterGroup.buffData.length > 0) { console.log(`[MissionMonComp]:怪物 ${monsterGroup.uuid} 拥有词条:`, monsterGroup.buffData); // 输出词条名称 monsterGroup.buffData.forEach((buff: any) => { const config = MonsterAffixConfig[buff.buff_type]; if (config) { console.log(`[MissionMonComp]: - ${config.name}: ${config.description}`); } }); } }); } // 新增:添加到刷怪队列 - 增加level参数(普通模式) private addToSpawnQueue(uuid: number, position: number, isBoss: boolean = false, level: number = 1) { this.monsterQueue.push({ uuid: uuid, position: position, isBoss: isBoss, level: level }); } // 新增:添加到刷怪队列 - 支持词条(肉鸽模式) private addToSpawnQueueWithAffixes( uuid: number, position: number, isBoss: boolean = false, level: number = 1, affixes?: any[], buffData?: any[], rogueHp?: number, rogueAttack?: number ) { this.monsterQueue.push({ uuid: uuid, position: position, isBoss: isBoss, level: level, affixes: affixes, buffData: buffData, rogueHp: rogueHp, rogueAttack: rogueAttack }); } // 新增:从队列中生成下一个怪物 - 传递词条参数 private spawnNextMonster() { if (this.monsterQueue.length === 0) return; const monsterData = this.monsterQueue.shift(); if (monsterData) { this.addMonster( monsterData.uuid, monsterData.position, monsterData.isBoss, false, monsterData.level, monsterData.buffData, monsterData.rogueHp, monsterData.rogueAttack ); // 增加召唤计数 this.spawnCount++; console.log(`[MissionMonComp]: 召唤第${this.spawnCount}只怪物,剩余队列: ${this.monsterQueue.length}`); } } private addMonster( uuid: number = 1001, i: number = 0, is_boss: boolean = false, is_call: boolean = false, lv: number = 1, buffData?: any[], rogueHp?: number, rogueAttack?: number ) { let mon = ecs.getEntity(Monster); let scale = -1; let pos: Vec3 = v3(MonSet[i].pos); // 生成怪物,传递词条buff数据和肉鸽固定数值 mon.load(pos, scale, uuid, is_boss, is_call, lv, buffData, rogueHp, rogueAttack); // 如果有词条buff数据,记录到控制台 if (buffData && buffData.length > 0) { console.log(`[MissionMonComp]: 怪物 ${uuid} 获得肉鸽词条Buff:`, buffData); } // 如果有肉鸽固定数值,记录到控制台 if (rogueHp !== undefined && rogueAttack !== undefined) { console.log(`[MissionMonComp]: 怪物 ${uuid} 使用肉鸽固定数值 - HP: ${rogueHp}, 攻击: ${rogueAttack}`); } } /** 视图对象通过 ecs.Entity.remove(ModuleViewComp) 删除组件是触发组件处理自定义释放逻辑 */ reset() { // this.node.destroy(); } }