diff --git a/src/BaseCreatureHandler.h b/src/Creature/BaseCreatureHandler.h similarity index 100% rename from src/BaseCreatureHandler.h rename to src/Creature/BaseCreatureHandler.h diff --git a/src/CreatureHooks.cpp b/src/Creature/CreatureHooks.cpp similarity index 100% rename from src/CreatureHooks.cpp rename to src/Creature/CreatureHooks.cpp diff --git a/src/CreatureHooks.h b/src/Creature/CreatureHooks.h similarity index 100% rename from src/CreatureHooks.h rename to src/Creature/CreatureHooks.h diff --git a/src/CreatureOverride.h b/src/Creature/CreatureOverride.h similarity index 100% rename from src/CreatureOverride.h rename to src/Creature/CreatureOverride.h diff --git a/src/MpScheduler.h b/src/MpScheduler.h new file mode 100644 index 0000000..0441a52 --- /dev/null +++ b/src/MpScheduler.h @@ -0,0 +1,66 @@ +#ifndef MYTHICPLUS_SCHEDULER_H +#define MYTHICPLUS_SCHEDULER_H + +#include "MpLogger.h" +#include "ScriptMgr.h" +#include "TaskScheduler.h" +#include + +enum MP_SCHEDULE_GROUP { + MP_WORLD_TASK_GROUP = 100 +}; + +/** + * Global scheduler specifically for handling events fired inside of mythic + * scripts + */ +class MpScheduler +{ +public: + static MpScheduler* instance () + { + static MpScheduler instance; + return &instance; + } + + MpScheduler(const MpScheduler&) = delete; + MpScheduler& operator=(const MpScheduler&) = delete; + + TaskScheduler& GetWorldScheduler() { + return _worldScheduler; + } + + void StartScheduler() { + + MpLogger::info("Starting World Scheduler"); + _worldScheduler.Schedule(1s, [&](TaskContext ctx) { + MpLogger::info("Insidie world scheduler"); + return; + }); + } + + void ScheduleWorldTask(std::chrono::nanoseconds const& time, std::function task) { + _worldScheduler.Schedule(time, MP_WORLD_TASK_GROUP, task); + } + +private: + MpScheduler() {} + ~MpScheduler() {} + + TaskScheduler _worldScheduler; +}; + +#define sMpScheduler MpScheduler::instance() +#endif // MYTHICPLUS_SCHEDULER_H + +// Attach the world scheduler to listen to world events +class MpScheduler_WorldScript : public WorldScript +{ + public: + MpScheduler_WorldScript() : WorldScript("MpScheduler_GlobalScript") { } + + void OnUpdate(uint32 diff) override { + sMpScheduler->GetWorldScheduler().Update(diff); + } +}; + diff --git a/src/MythicPlus_loader.cpp b/src/MythicPlus_loader.cpp index 4d1dfbc..f833304 100755 --- a/src/MythicPlus_loader.cpp +++ b/src/MythicPlus_loader.cpp @@ -1,10 +1,19 @@ -#include "Instances/Ragefire/boss_bazzalan.cpp" +#include "MpScheduler.h" +#include "MpLogger.h" // Creature Overrides enum { RAGEFIRE_BAZZALAN = 11519 }; +// This adds schedulers for use across scripts scoped to MythicPlus +void Add_MP_Schedulers() +{ + MpLogger::debug("Add_MP_Schedulers()"); + new MpScheduler_WorldScript(); + sMpScheduler->StartScheduler(); +} + void Addmod_mythic_plusScripts(); void Add_MP_AllCreatureScripts(); void Add_MP_AllMapScripts(); @@ -15,9 +24,6 @@ void Add_MP_PlayerScripts(); void Add_MP_UnitScripts(); void Add_MP_WorldScripts(); -// Mythic custom encounters for mythic+ dungeons - - void Addmod_mythic_plusScripts() { Add_MP_AllCreatureScripts(); @@ -28,6 +34,7 @@ void Addmod_mythic_plusScripts() Add_MP_PlayerScripts(); Add_MP_UnitScripts(); Add_MP_WorldScripts(); + Add_MP_Schedulers(); // new Ragefire_Bazzalan_Mythic(); diff --git a/src/AllCreatureScript.cpp b/src/Scripts/AllCreatureScript.cpp similarity index 100% rename from src/AllCreatureScript.cpp rename to src/Scripts/AllCreatureScript.cpp diff --git a/src/AllMapScript.cpp b/src/Scripts/AllMapScript.cpp similarity index 100% rename from src/AllMapScript.cpp rename to src/Scripts/AllMapScript.cpp diff --git a/src/CommandScript.cpp b/src/Scripts/CommandScript.cpp similarity index 100% rename from src/CommandScript.cpp rename to src/Scripts/CommandScript.cpp diff --git a/src/GlobalScript.cpp b/src/Scripts/GlobalScript.cpp similarity index 100% rename from src/GlobalScript.cpp rename to src/Scripts/GlobalScript.cpp diff --git a/src/GroupScript.cpp b/src/Scripts/GroupScript.cpp similarity index 100% rename from src/GroupScript.cpp rename to src/Scripts/GroupScript.cpp diff --git a/src/PlayerScript.cpp b/src/Scripts/PlayerScript.cpp similarity index 63% rename from src/PlayerScript.cpp rename to src/Scripts/PlayerScript.cpp index 6fb5a12..548c7a2 100644 --- a/src/PlayerScript.cpp +++ b/src/Scripts/PlayerScript.cpp @@ -1,5 +1,6 @@ #include "MpLogger.h" #include "MpDataStore.h" +#include "MpScheduler.h" #include "MythicPlus.h" #include "Player.h" #include "Group.h" @@ -9,9 +10,9 @@ class MythicPlus_PlayerScript : public PlayerScript { public: - MythicPlus_PlayerScript() : PlayerScript("MythicPlus_PlayerScript") { } + MythicPlus_PlayerScript() : PlayerScript("MythicPlus_PlayerScript") {} - void OnPlayerKilledByCreature(Creature* killer, Player* player) + void OnPlayerKilledByCreature(Creature* killer, Player* player) override { Map* map = player->GetMap(); if(!sMythicPlus->IsMapEligible(map)) { @@ -52,8 +53,6 @@ public: uint32 totalDeaths = data->GetDeaths(player->GetMapId(), player->GetInstanceId()); if(totalDeaths > 1) { - // kick the group out of the instance - Map* map = player->GetMap(); Map::PlayerList players = map->GetPlayers(); @@ -61,19 +60,39 @@ public: return; } - // map->RemoveAllPlayers(); - for(auto it = players.begin(); it != players.end(); ++it) - { - Player* player = it->GetSource(); - player->GetSession()->SendNotification("Your group has died too many time to continue. %u", totalDeaths); + Group* group = player->GetGroup(); + if(!group) { + MpLogger::warn("Player {} is not in a group.", player->GetName()); + return; } - map->RemoveAllPlayers(); - map->ToInstanceMap()->Reset(0); + + // map->RemoveAllPlayers(); + MpLogger::info("Starting scheduled failure notification"); + sMpScheduler->ScheduleWorldTask(1s, [](TaskContext ctx) { + MpLogger::info("<<<<<<<<<<< Player Death Scheduler fire >>>>>>>>>>>>>"); + }); + // sMpScheduler->GetWorldScheduler().Schedule(1s, [playerName = player->GetName()](TaskContext ctx) { + // MpLogger::info("<<<<<<<<<<< Player Death Scheduler fire {} >>>>>>>>>>>>>", playerName); + // return; + // }); + // std::vector players = GetGroupMembers(player); + // MpLogger::info("Failed mythic+ instance run notification fired. "); + // WorldPacket data; + + // for(Player* player : players) + // { + // MpLogger::info("Seding notification of failure to player: {}", player->GetName()); + // player->GetSession()->SendShowBank(player->GetGUID()); + // // player->GetSession()->SendNotification("Your group has died too many time to continue."); + // // ChatHandler::BuildChatPacket(data, CHAT_MSG_RAID_BOSS_EMOTE, LANG_UNIVERSAL, nullptr, player, message); + // // player->GetSession()->SendPacket(&data); + // } + + // map->ToInstanceMap()->Reset(0); + // ); + } - - } - - void OnSave(Player* player) { + return; } @@ -122,6 +141,25 @@ public: sMpDataStore->DBUpdatePlayerInstanceData(player->GetGUID(), data->difficulty, map->GetId(), map->GetInstanceId()); sMpDataStore->DBUpdateGroupData(group->GetGUID(), data->difficulty, map->GetId(), map->GetInstanceId(), 0); } + + std::vector GetGroupMembers(Player* currentPlayer) + { + std::vector groupPlayers; + + Group* group = currentPlayer->GetGroup(); + if (!group) + { + MpLogger::warn("Player is not in a group."); + return groupPlayers; + } + + group->DoForAllMembers([&](Player* member) { + groupPlayers.push_back(member); + }); + + return groupPlayers; + } + }; void Add_MP_PlayerScripts() diff --git a/src/UnitScript.cpp b/src/Scripts/UnitScript.cpp similarity index 100% rename from src/UnitScript.cpp rename to src/Scripts/UnitScript.cpp diff --git a/src/WorldScript.cpp b/src/Scripts/WorldScript.cpp similarity index 100% rename from src/WorldScript.cpp rename to src/Scripts/WorldScript.cpp