diff --git a/modules/mod-mythic-plus/src/wailing_caverns/instance_wailing_caverns_mythic.cpp b/modules/mod-mythic-plus/src/wailing_caverns/instance_wailing_caverns_mythic.cpp index 29257ae..45b7fc5 100644 --- a/modules/mod-mythic-plus/src/wailing_caverns/instance_wailing_caverns_mythic.cpp +++ b/modules/mod-mythic-plus/src/wailing_caverns/instance_wailing_caverns_mythic.cpp @@ -1,182 +1,236 @@ -/* - * 完全复制哀嚎洞穴副本脚本文件 - * 添加部分自定义数据以支撑大秘境功能 - */ - - // modules\mod-mythic-plus\src\wailing_caverns\instance_wailing_caverns_mythic.cpp - -#include "InstanceMapScript.h" -#include "InstanceScript.h" -#include "wailing_caverns_mythic.h" - -class instance_wailing_caverns_mythic : public InstanceMapScript -{ -public: - instance_wailing_caverns_mythic() : InstanceMapScript("instance_wailing_caverns_mythic", MAP_WAILING_CAVERNS) {} - - InstanceScript* GetInstanceScript(InstanceMap* map) const override - { - return new instance_wailing_caverns_InstanceMapScript(map); - } - - struct instance_wailing_caverns_InstanceMapScript : public InstanceScript - { - instance_wailing_caverns_InstanceMapScript(Map* map) : InstanceScript(map), _countdownTimer(0) { } - - void Initialize() override - { - memset(&_encounters, 0, sizeof(_encounters)); - } - - void OnCreatureCreate(Creature* creature) override - { - if (creature->GetEntry() == NPC_DISCIPLE_OF_NARALEX) - DiscipleOfNaralexGUID = creature->GetGUID(); - else if (creature->GetEntry() == NPC_LORD_SERPENTIS) - SerpentisGUID = creature->GetGUID(); - } - - void OnGameObjectCreate(GameObject* go) override - { - switch (go->GetEntry()) - { - case GO_INVISIBLE_WALL: - invisibleWallGUID = go->GetGUID(); - // 初始状态:设置到不可见相位 - go->SetPhaseMask(2, true); // 相位2,玩家看不到 - break; - case GO_ENERGY_WELL: - energyWellGUID = go->GetGUID(); - break; - } - } - - void SetData(uint32 type, uint32 data) override - { - switch (type) - { - case TYPE_LORD_COBRAHN: - case TYPE_LORD_PYTHAS: - case TYPE_LADY_ANACONDRA: - case TYPE_LORD_SERPENTIS: - case TYPE_MUTANUS: - _encounters[type] = data; - break; - - case DATA_KEYSTONE_VALIDATED: - _encounters[5] = data; // 确保数据被存储 - if (data == DONE) - { - if (GameObject* wall = instance->GetGameObject(invisibleWallGUID)) - // 恢复到玩家可见的相位 - wall->SetPhaseMask(1, true); // 相位1,玩家可见 - - // 禁用能量之泉 - if (GameObject* well = instance->GetGameObject(energyWellGUID)) - well->SetGameObjectFlag(GO_FLAG_NOT_SELECTABLE); - } - break; - } - - if (data == DONE) - SaveToDB(); - - if (type == TYPE_LORD_COBRAHN && _encounters[TYPE_LORD_SERPENTIS] != DONE) - { - if (Creature* serpentis = instance->GetCreature(SerpentisGUID)) - serpentis->AI()->Talk(SAY_SERPENTIS); - } - - if (type != TYPE_MUTANUS && _encounters[TYPE_LORD_COBRAHN] == DONE && _encounters[TYPE_LORD_PYTHAS] == DONE && - _encounters[TYPE_LADY_ANACONDRA] == DONE && _encounters[TYPE_LORD_SERPENTIS] == DONE) - { - if (Creature* disciple = instance->GetCreature(DiscipleOfNaralexGUID)) - disciple->AI()->Talk(SAY_DISCIPLE); - } - } - - uint32 GetData(uint32 type) const override - { - switch (type) - { - case TYPE_LORD_COBRAHN: - case TYPE_LORD_PYTHAS: - case TYPE_LADY_ANACONDRA: - case TYPE_LORD_SERPENTIS: - return _encounters[type]; - case DATA_KEYSTONE_VALIDATED: - return _encounters[5]; // 添加这个case - } - return 0; - } - - void ReadSaveDataMore(std::istringstream& data) override - { - data >> _encounters[0]; - data >> _encounters[1]; - data >> _encounters[2]; - data >> _encounters[3]; - data >> _encounters[4]; - } - - void WriteSaveDataMore(std::ostringstream& data) override - { - data << _encounters[0] << ' ' - << _encounters[1] << ' ' - << _encounters[2] << ' ' - << _encounters[3] << ' ' - << _encounters[4] << ' '; - } - - void DoAction(int32 actionId) override - { - if (actionId == ACTION_START_MYTHIC_COUNTDOWN) - { - // 开始10秒倒计时 - _countdownTimer = 10; - DoUpdateWorldState(WORLD_STATE_MYTHIC_COUNTDOWN_SHOW, 1); - DoUpdateWorldState(WORLD_STATE_MYTHIC_COUNTDOWN_TIME, _countdownTimer); - - scheduler.Schedule(1s, GROUP_MYTHIC_COUNTDOWN, [this](TaskContext context) - { - --_countdownTimer; - DoUpdateWorldState(WORLD_STATE_MYTHIC_COUNTDOWN_TIME, _countdownTimer); - - if (_countdownTimer > 0) - { - context.Repeat(); - } - else - { - // 倒计时结束,移除空气墙 - DoUpdateWorldState(WORLD_STATE_MYTHIC_COUNTDOWN_SHOW, 0); - if (GameObject* wall = instance->GetGameObject(invisibleWallGUID)) - wall->SetPhaseMask(2, true); // 隐藏空气墙 - - // 开始大秘境挑战 - SetData(DATA_MYTHIC_CHALLENGE_ACTIVE, DONE); - } - }); - } - } - - void Update(uint32 diff) override - { - scheduler.Update(diff); - } - - private: - uint32 _encounters[MAX_ENCOUNTERS]; - ObjectGuid DiscipleOfNaralexGUID; - ObjectGuid SerpentisGUID; - ObjectGuid invisibleWallGUID; // 新增 - ObjectGuid energyWellGUID; // 新增 - uint32 _countdownTimer; // 新增倒计时变量 - TaskScheduler scheduler; // 新增调度器 - }; -}; - -void AddMythicPlusWailingCavernsScripts() -{ - new instance_wailing_caverns_mythic(); -} +///* +// * 完全复制哀嚎洞穴副本脚本文件 +// * 添加部分自定义数据以支撑大秘境功能 +// */ +// +// // modules\mod-mythic-plus\src\wailing_caverns\instance_wailing_caverns_mythic.cpp +// +//#include "InstanceMapScript.h" +//#include "InstanceScript.h" +//#include "wailing_caverns_mythic.h" +//#include +//#include +// +//class instance_wailing_caverns_mythic : public InstanceMapScript +//{ +//public: +// instance_wailing_caverns_mythic() : InstanceMapScript("instance_wailing_caverns_mythic", MAP_WAILING_CAVERNS) {} +// +// InstanceScript* GetInstanceScript(InstanceMap* map) const override +// { +// return new instance_wailing_caverns_InstanceMapScript(map); +// } +// +// struct instance_wailing_caverns_InstanceMapScript : public InstanceScript +// { +// instance_wailing_caverns_InstanceMapScript(Map* map) : InstanceScript(map), _countdownTimer(0) { } +// +// void Initialize() override +// { +// memset(&_encounters, 0, sizeof(_encounters)); +// } +// +// void OnCreatureCreate(Creature* creature) override +// { +// if (creature->GetEntry() == NPC_DISCIPLE_OF_NARALEX) +// DiscipleOfNaralexGUID = creature->GetGUID(); +// else if (creature->GetEntry() == NPC_LORD_SERPENTIS) +// SerpentisGUID = creature->GetGUID(); +// +// // 存储所有生物GUID +// allCreatureGUIDs.push_back(creature->GetGUID()); +// } +// +// void OnGameObjectCreate(GameObject* go) override +// { +// switch (go->GetEntry()) +// { +// case GO_INVISIBLE_WALL: +// invisibleWallGUID = go->GetGUID(); +// // 初始状态:设置到不可见相位 +// go->SetPhaseMask(2, true); // 相位2,玩家看不到 +// break; +// case GO_ENERGY_WELL: +// energyWellGUID = go->GetGUID(); +// break; +// } +// } +// +// void SetData(uint32 type, uint32 data) override +// { +// switch (type) +// { +// case TYPE_LORD_COBRAHN: +// case TYPE_LORD_PYTHAS: +// case TYPE_LADY_ANACONDRA: +// case TYPE_LORD_SERPENTIS: +// case TYPE_MUTANUS: +// _encounters[type] = data; +// break; +// +// case DATA_KEYSTONE_VALIDATED: +// _encounters[5] = data; // 确保数据被存储 +// if (data == DONE) +// { +// if (GameObject* wall = instance->GetGameObject(invisibleWallGUID)) +// // 恢复到玩家可见的相位 +// wall->SetPhaseMask(1, true); // 相位1,玩家可见 +// +// // 禁用能量之泉 +// if (GameObject* well = instance->GetGameObject(energyWellGUID)) +// well->SetGameObjectFlag(GO_FLAG_NOT_SELECTABLE); +// } +// break; +// +// case DATA_MYTHIC_CHALLENGE_ACTIVE: // 添加这个case +// _encounters[8] = data; +// break; +// } +// +// if (data == DONE) +// SaveToDB(); +// +// if (type == TYPE_LORD_COBRAHN && _encounters[TYPE_LORD_SERPENTIS] != DONE) +// { +// if (Creature* serpentis = instance->GetCreature(SerpentisGUID)) +// serpentis->AI()->Talk(SAY_SERPENTIS); +// } +// +// if (type != TYPE_MUTANUS && _encounters[TYPE_LORD_COBRAHN] == DONE && _encounters[TYPE_LORD_PYTHAS] == DONE && +// _encounters[TYPE_LADY_ANACONDRA] == DONE && _encounters[TYPE_LORD_SERPENTIS] == DONE) +// { +// if (Creature* disciple = instance->GetCreature(DiscipleOfNaralexGUID)) +// disciple->AI()->Talk(SAY_DISCIPLE); +// } +// } +// +// uint32 GetData(uint32 type) const override +// { +// switch (type) +// { +// case TYPE_LORD_COBRAHN: +// case TYPE_LORD_PYTHAS: +// case TYPE_LADY_ANACONDRA: +// case TYPE_LORD_SERPENTIS: +// return _encounters[type]; +// case DATA_KEYSTONE_VALIDATED: +// return _encounters[5]; // 添加这个case +// case DATA_MYTHIC_CHALLENGE_ACTIVE: // 添加这个case +// return _encounters[8]; +// default: +// break; +// } +// return 0; +// } +// +// void ReadSaveDataMore(std::istringstream& data) override +// { +// data >> _encounters[0]; +// data >> _encounters[1]; +// data >> _encounters[2]; +// data >> _encounters[3]; +// data >> _encounters[4]; +// } +// +// void WriteSaveDataMore(std::ostringstream& data) override +// { +// data << _encounters[0] << ' ' +// << _encounters[1] << ' ' +// << _encounters[2] << ' ' +// << _encounters[3] << ' ' +// << _encounters[4] << ' '; +// } +// +// void DoAction(int32 actionId) override +// { +// if (actionId == ACTION_START_MYTHIC_COUNTDOWN) +// { +// // 先应用大秘境副本中的生物属性 +// ApplyMythicPlusScalingToExistingCreatures(); +// +// // 开始10秒倒计时 +// _countdownTimer = 10; +// DoUpdateWorldState(WORLD_STATE_MYTHIC_COUNTDOWN_SHOW, 1); +// DoUpdateWorldState(WORLD_STATE_MYTHIC_COUNTDOWN_TIME, _countdownTimer); +// +// scheduler.Schedule(1s, GROUP_MYTHIC_COUNTDOWN, [this](TaskContext context) +// { +// --_countdownTimer; +// DoUpdateWorldState(WORLD_STATE_MYTHIC_COUNTDOWN_TIME, _countdownTimer); +// +// if (_countdownTimer > 0) +// { +// context.Repeat(); +// } +// else +// { +// // 倒计时结束,移除空气墙 +// DoUpdateWorldState(WORLD_STATE_MYTHIC_COUNTDOWN_SHOW, 0); +// if (GameObject* wall = instance->GetGameObject(invisibleWallGUID)) +// wall->SetPhaseMask(2, true); // 隐藏空气墙 +// +// // 开始大秘境挑战 +// SetData(DATA_MYTHIC_CHALLENGE_ACTIVE, DONE); +// } +// }); +// } +// } +// +// void Update(uint32 diff) override +// { +// scheduler.Update(diff); +// } +// +// private: +// uint32 _encounters[MAX_ENCOUNTERS]; +// ObjectGuid DiscipleOfNaralexGUID; // 任务NPC 穆约 +// ObjectGuid SerpentisGUID; +// ObjectGuid invisibleWallGUID; +// ObjectGuid energyWellGUID; +// uint32 _countdownTimer; // 倒计时变量 +// TaskScheduler scheduler; // 调度器 +// std::vector allCreatureGUIDs; // 存储所有生物GUID +// +// // 对现有生物应用大秘境属性 +// void ApplyMythicPlusScalingToExistingCreatures() +// { +// // 获取副本中的玩家来获取钥石信息 +// Map::PlayerList const& players = instance->GetPlayers(); +// if (players.IsEmpty()) // 修正:使用 empty() 而不是 IsEmpty() +// return; +// +// Player* player = players.begin()->GetSource(); +// Item* keystone = player->GetItemByEntry(999001); +// if (!keystone) +// return; +// +// uint8 keystoneLevel = MythicPlusCreatureManager::GetKeystoneLevel(keystone); +// std::vector affixes = MythicPlusCreatureManager::GetKeystoneAffixes(keystone); +// uint32 dungeonId = keystone->GetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID); +// +// // 遍历所有存储的生物GUID +// +// for (const ObjectGuid& guid : allCreatureGUIDs) +// { +// if (guid == DiscipleOfNaralexGUID) +// continue; +// +// if (Creature* creature = instance->GetCreature(guid)) +// { +// if (creature->IsAlive()) // 确保生物还活着 +// { +// MythicPlusCreatureManager::ApplyMythicPlusScaling(creature, keystoneLevel, dungeonId); +// MythicPlusCreatureManager::ApplyAffixEffects(creature, affixes); +// } +// } +// +// } +// +// } +// }; +//}; +// +//void AddMythicPlusWailingCavernsScripts() +//{ +// new instance_wailing_caverns_mythic(); +//} diff --git a/modules/mod-mythic-plus/src/wailing_caverns/wailing_caverns_mythic.h b/modules/mod-mythic-plus/src/wailing_caverns/wailing_caverns_mythic.h index 3f3b6ee..8d19e97 100644 --- a/modules/mod-mythic-plus/src/wailing_caverns/wailing_caverns_mythic.h +++ b/modules/mod-mythic-plus/src/wailing_caverns/wailing_caverns_mythic.h @@ -1,51 +1,51 @@ -// modules\mod-mythic-plus\src\wailing_caverns\wailing_caverns_mythic.h -#ifndef _MOD_MYTHIC_WAILING_CAVERNS_H -#define _MOD_MYTHIC_WAILING_CAVERNS_H - -#define DataHeader "WMP" // WMP = Wailing Caverns Mythic Plus - -enum DataTypes -{ - TYPE_LORD_COBRAHN = 0, - TYPE_LORD_PYTHAS = 1, - TYPE_LADY_ANACONDRA = 2, - TYPE_LORD_SERPENTIS = 3, - TYPE_MUTANUS = 4, - DATA_KEYSTONE_VALIDATED = 5, // 新增 - - - DATA_MYTHIC_COUNTDOWN_TIMER = 6, // 倒计时状态 - DATA_MYTHIC_COUNTDOWN_ACTIVE = 7, // 倒计时是否激活 - DATA_MYTHIC_CHALLENGE_ACTIVE = 8, // 新增 - - MAX_ENCOUNTERS = 9, // 更新数量 - - NPC_DISCIPLE_OF_NARALEX = 3678, - NPC_LORD_SERPENTIS = 3673, - - SAY_DISCIPLE = 0, - SAY_SERPENTIS = 0, - GO_INVISIBLE_WALL = 410004, // 墙体ID - GO_ENERGY_WELL = 410000, // 能量之泉ID -}; - -// 添加动作定义 -enum Actions -{ - ACTION_START_MYTHIC_COUNTDOWN = 1, -}; - -// 添加世界状态定义 -enum WorldStates -{ - WORLD_STATE_MYTHIC_COUNTDOWN_SHOW = 20100, - WORLD_STATE_MYTHIC_COUNTDOWN_TIME = 20101, -}; - -// 添加调度器组定义 -enum SchedulerGroups -{ - GROUP_MYTHIC_COUNTDOWN = 1, -}; - -#endif +//// modules\mod-mythic-plus\src\wailing_caverns\wailing_caverns_mythic.h +//#ifndef _MOD_MYTHIC_WAILING_CAVERNS_H +//#define _MOD_MYTHIC_WAILING_CAVERNS_H +// +//#define DataHeader "WMP" // WMP = Wailing Caverns Mythic Plus +// +//enum DataTypes +//{ +// TYPE_LORD_COBRAHN = 0, +// TYPE_LORD_PYTHAS = 1, +// TYPE_LADY_ANACONDRA = 2, +// TYPE_LORD_SERPENTIS = 3, +// TYPE_MUTANUS = 4, +// DATA_KEYSTONE_VALIDATED = 5, // 新增 +// +// +// DATA_MYTHIC_COUNTDOWN_TIMER = 6, // 倒计时状态 +// DATA_MYTHIC_COUNTDOWN_ACTIVE = 7, // 倒计时是否激活 +// DATA_MYTHIC_CHALLENGE_ACTIVE = 8, // 新增 +// +// MAX_ENCOUNTERS = 9, // 更新数量 +// +// NPC_DISCIPLE_OF_NARALEX = 3678, +// NPC_LORD_SERPENTIS = 3673, +// +// SAY_DISCIPLE = 0, +// SAY_SERPENTIS = 0, +// GO_INVISIBLE_WALL = 410004, // 墙体ID +// GO_ENERGY_WELL = 410000, // 能量之泉ID +//}; +// +//// 添加动作定义 +//enum Actions +//{ +// ACTION_START_MYTHIC_COUNTDOWN = 1, +//}; +// +//// 添加世界状态定义 +//enum WorldStates +//{ +// WORLD_STATE_MYTHIC_COUNTDOWN_SHOW = 20100, +// WORLD_STATE_MYTHIC_COUNTDOWN_TIME = 20101, +//}; +// +//// 添加调度器组定义 +//enum SchedulerGroups +//{ +// GROUP_MYTHIC_COUNTDOWN = 1, +//}; +// +//#endif