From d4fa53d43555077d228b0bf064f83e901d6d9e1d Mon Sep 17 00:00:00 2001 From: Ben Carter Date: Sat, 18 Jan 2025 11:28:07 -0500 Subject: [PATCH] Updates to bring in event handlers for communication and register on server load --- src/Scripts/PlayerMessageEvents.cpp | 114 +++++++++++----------------- src/Scripts/PlayerScript.cpp | 7 +- src/Scripts/WorldScript.cpp | 6 +- 3 files changed, 52 insertions(+), 75 deletions(-) diff --git a/src/Scripts/PlayerMessageEvents.cpp b/src/Scripts/PlayerMessageEvents.cpp index 7249039..97bef34 100644 --- a/src/Scripts/PlayerMessageEvents.cpp +++ b/src/Scripts/PlayerMessageEvents.cpp @@ -1,15 +1,13 @@ #include "MpLogger.h" -#include "MpDataStore.h" -#include "MpScheduler.h" #include "MythicPlus.h" #include "Player.h" -#include "Group.h" #include "ScriptMgr.h" -#include "TaskScheduler.h" -#include "AdvancementMgr.cpp" +#include "AdvancementMgr.h" #include "Chat.h" #include "Channel.h" #include "ChannelMgr.h" +#include "MpEventProcessor.h" +#include // For starts_with #include #include @@ -26,20 +24,29 @@ class MythicPlus_PlayerMessageEvents : public PlayerScript { +public: + MythicPlus_PlayerMessageEvents() : PlayerScript("MythicPlus_PlayerMessageEvents") {} /** - * Listen to all messages from a playerand process them if + * Listens to AddOn Chat channel for Mythic+ communication between UI and server mythic+ functionality */ - void OnChat(Player* player, uint32 type, uint32 lang, std::string& msg, Channel* channel) override + void OnChat(Player* player, uint32 type, uint32 lang, std::string& msg, Player* receiver) override { - if(!player || !channel) { + // All communication from the client should be a whisper to themselves over tha addon channel + if(!player || !receiver) { return; } - // Handle chat message coming in to the data channel from the client. This allows backedend calls into the module - // from Eluna / AIO without the need to modify mod-eluna directly. - if(type == CHAT_MSG_CHANNEL && MP_DATA_CHAT_CHANNEL == channel->GetName()) { - MpLogger::info("Player {} sent a message {} to channel {}", player->GetName(), msg, channel->GetName()); + if(lang == LANG_ADDON) { + if(msg.empty()) { + MpLogger::info("Empty AddOn message received from player: {}", player->GetName()); + return; + } + + // if the message begins with our prefix for our data channel then process the event + if(boost::starts_with(msg, MP_DATA_CHAT_CHANNEL)) { + sMpEventProcessor->ProcessMessage(player, msg); + } } } @@ -49,67 +56,36 @@ class MythicPlus_PlayerMessageEvents : public PlayerScript * * Load advancement data for the player at load time used to apply buffs. */ - void OnLogin(Player* player) override - { - if(!player) { - return; - } + // void OnLogin(Player* player) override + // { + // if(!player) { + // return; + // } - // Create a channel called MpEx if it does not exist - ChannelMgr* cmg = ChannelMgr::forTeam(TEAM_NEUTRAL); - Channel* channel = cmg->GetChannel(static_cast(MP_DATA_CHAT_CHANNEL), player); + // // Create a channel called MpEx if it does not exist + // MpLogger::info("Player {} logged in on team {}", player->GetName(), player->GetTeamId()); + // ChannelMgr* cmg = ChannelMgr::forTeam(player->GetTeamId()); - // If the channel does not yet, exist the first player to login to the server will ensure it is created. - if(!channel) { - channel = cmg->GetJoinChannel(static_cast(MP_DATA_CHAT_CHANNEL),0); - } + // if(!cmg) { + // MpLogger::error("Failed to get channel manager for team {}", player->GetTeamId()); + // return; + // } - } + // Channel* channel = cmg->GetChannel(static_cast(MP_DATA_CHAT_CHANNEL), player); + // if(!channel) { + // MpLogger::error("Failed to get mythic data channel for player {}", player->GetName()); + // Channel* nchan = new Channel(static_cast(MP_DATA_CHAT_CHANNEL), 17, 0, player->GetTeamId()); + // if(!nchan) { + // MpLogger::error("Failed to create mythic data channel for player {}", player->GetName()); + // return; + // } + // } + + // } }; -// Split the string passed in by delimiters -std::vector splitString(const std::string& s, char delimiter) { - std::vector tokens; - size_t start = 0; - size_t end = s.find(delimiter); - - while (end != std::string::npos) { - if (end != start) { - tokens.emplace_back(s.substr(start, end - start)); - } - start = end + 1; - end = s.find(delimiter, start); - } - - // Add the last token if it's not empty - if (start < s.length()) { - tokens.emplace_back(s.substr(start)); - } - - return tokens; -} - -/** - * Parse the incoming message into its parts: - * - p:playerGuid:action:input1:input2:input3... - * i.e) p:5793:UpgradeAdvancement:0:10:2 - */ -void parsePlayerMessage(Player* player, std::string& msg) +void Add_MP_PlayerMessageEvents() { - if(!player) { - MpLogger::error("Null player passed to parsePlayerMessage"); - return; - } - - if(msg[0] != 'p') { - MpLogger::warn("Invalid player message format received from player {} message: {}", player->GetName(), msg); - return; - } - - std::vector actionArgs; - char delimiter = '|'; - - // split the protocol into valid parts - std::vector parts = splitString(msg, delimiter); - + MpLogger::debug("Add_MP_PlayerEventMessages"); + new MythicPlus_PlayerMessageEvents(); } diff --git a/src/Scripts/PlayerScript.cpp b/src/Scripts/PlayerScript.cpp index 8b58120..bdbd829 100644 --- a/src/Scripts/PlayerScript.cpp +++ b/src/Scripts/PlayerScript.cpp @@ -6,10 +6,7 @@ #include "Group.h" #include "ScriptMgr.h" #include "TaskScheduler.h" -#include "AdvancementMgr.cpp" -#include "Chat.h" -#include "Channel.h" -#include "ChannelMgr.h" +#include "AdvancementMgr.h" class MythicPlus_PlayerScript : public PlayerScript { @@ -23,7 +20,7 @@ public: * - Determine whether or not the Group failed the instance due to death count setting. */ - void OnPlayerKilledByCreature(Creature* killer, Player* player) + void OnPlayerKilledByCreature(Creature* killer, Player* player) override { Map* map = player->GetMap(); if(!sMythicPlus->IsMapEligible(map)) { diff --git a/src/Scripts/WorldScript.cpp b/src/Scripts/WorldScript.cpp index 567d998..473b94c 100644 --- a/src/Scripts/WorldScript.cpp +++ b/src/Scripts/WorldScript.cpp @@ -5,6 +5,7 @@ #include "MpLogger.h" #include "Player.h" #include "ScriptMgr.h" +#include "MpEventHandlers.cpp" class MythicPlus_WorldScript : public WorldScript { @@ -97,12 +98,15 @@ public: int32 size = sMpDataStore->LoadScaleFactors(); MpLogger::info("Loaded {} Mythic+ Scaling Factors from database...", size); - size = sAdvancementMgr->LoadAdvencementRanks(); + size = sAdvancementMgr->LoadAdvancementRanks(); MpLogger::info("Loaded {} advancement ranks...", size); size = sAdvancementMgr->LoadMaterialTypes(); MpLogger::info("Loaded {} material types...", size); + // Registering event handlers for the Mythic+ events from client + MP_Register_EventHandlers(); + MpLogger::info("Registered Mythic+ Event Handlers..."); } };