[大秘境]优化,移除哀嚎洞穴副本脚本,采用混合模式,支持原始副本脚本和大秘境副本脚本
This commit is contained in:
parent
46338f58b8
commit
a332823676
@ -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 <Mythic_Script.h>
|
||||
//#include <GCAddon.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();
|
||||
//
|
||||
// // 存储所有生物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<ObjectGuid> 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<uint32> 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();
|
||||
//}
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user