diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game/AchievementMgr.cpp | 75 | ||||
-rw-r--r-- | src/game/Guild.h | 5 | ||||
-rw-r--r-- | src/game/Language.h | 3 | ||||
-rw-r--r-- | src/shared/revision_nr.h | 2 |
4 files changed, 56 insertions, 29 deletions
diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp index 726316666c2..7b902869fcc 100644 --- a/src/game/AchievementMgr.cpp +++ b/src/game/AchievementMgr.cpp @@ -28,6 +28,9 @@ #include "World.h" #include "SpellMgr.h" #include "ProgressBar.h" +#include "GridNotifiersImpl.h" +#include "CellImpl.h" +#include "Language.h" #include "Policies/SingletonImp.h" @@ -83,6 +86,37 @@ const CriteriaCastSpellRequirement AchievementGlobalMgr::m_criteriaCastSpellRequ {6662, 31261, 0, 0} }; + +namespace MaNGOS +{ + class AchievementChatBuilder + { + public: + AchievementChatBuilder(Player const& pl, ChatMsg msgtype, int32 textId, uint32 ach_id) + : i_player(pl), i_msgtype(msgtype), i_textId(textId), i_achievementId(ach_id) {} + void operator()(WorldPacket& data, int32 loc_idx) + { + char const* text = objmgr.GetMangosString(i_textId,loc_idx); + + data << uint8(i_msgtype); + data << uint32(LANG_UNIVERSAL); + data << uint64(i_player.GetGUID()); + data << uint32(5); + data << uint64(i_player.GetGUID()); + data << uint32(strlen(text)+1); + data << text; + data << uint8(0); + data << uint32(i_achievementId); + } + + private: + Player const& i_player; + ChatMsg i_msgtype; + int32 i_textId; + uint32 i_achievementId; + }; +} // namespace MaNGOS + AchievementMgr::AchievementMgr(Player *player) { m_player = player; @@ -276,20 +310,11 @@ void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement) { sLog.outDebug("AchievementMgr::SendAchievementEarned(%u)", achievement->ID); - const char *msg = "|Hplayer:$N|h[$N]|h has earned the achievement $a!"; if(Guild* guild = objmgr.GetGuildById(GetPlayer()->GetGuildId())) { - WorldPacket data(SMSG_MESSAGECHAT, 200); - data << uint8(CHAT_MSG_GUILD_ACHIEVEMENT); - data << uint32(LANG_UNIVERSAL); - data << uint64(GetPlayer()->GetGUID()); - data << uint32(5); - data << uint64(GetPlayer()->GetGUID()); - data << uint32(strlen(msg)+1); - data << msg; - data << uint8(0); - data << uint32(achievement->ID); - guild->BroadcastPacket(&data); + MaNGOS::AchievementChatBuilder say_builder(*GetPlayer(), CHAT_MSG_GUILD_ACHIEVEMENT, LANG_ACHIEVEMENT_EARNED,achievement->ID); + MaNGOS::LocalizedPacketDo<MaNGOS::AchievementChatBuilder> say_do(say_builder); + guild->BroadcastWorker(say_do,GetPlayer()); } if(achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_KILL|ACHIEVEMENT_FLAG_REALM_FIRST_REACH)) { @@ -298,23 +323,23 @@ void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement) data << GetPlayer()->GetName(); data << uint64(GetPlayer()->GetGUID()); data << uint32(achievement->ID); - data << uint32(0); // 1=link supplied string as player name, 0=display plain string + data << uint32(0); // 1=link supplied string as player name, 0=display plain string sWorld.SendGlobalMessage(&data); } else { - WorldPacket data(SMSG_MESSAGECHAT, 200); - data << uint8(CHAT_MSG_ACHIEVEMENT); - data << uint32(LANG_UNIVERSAL); - data << uint64(GetPlayer()->GetGUID()); - data << uint32(5); - data << uint64(GetPlayer()->GetGUID()); - data << uint32(strlen(msg)+1); - data << msg; - data << uint8(0); - data << uint32(achievement->ID); - GetPlayer()->SendMessageToSet(&data, true); - + CellPair p = MaNGOS::ComputeCellPair(GetPlayer()->GetPositionX(), GetPlayer()->GetPositionY()); + + Cell cell(p); + cell.data.Part.reserved = ALL_DISTRICT; + cell.SetNoCreate(); + + MaNGOS::AchievementChatBuilder say_builder(*GetPlayer(), CHAT_MSG_GUILD_ACHIEVEMENT, LANG_ACHIEVEMENT_EARNED,achievement->ID); + MaNGOS::LocalizedPacketDo<MaNGOS::AchievementChatBuilder> say_do(say_builder); + MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::AchievementChatBuilder> > say_worker(GetPlayer(),sWorld.getConfig(CONFIG_LISTEN_RANGE_SAY),say_do); + TypeContainerVisitor<MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::AchievementChatBuilder> >, WorldTypeMapContainer > message(say_worker); + CellLock<GridReadGuard> cell_lock(cell, p); + cell_lock->Visit(cell_lock, message, *GetPlayer()->GetMap()); } WorldPacket data(SMSG_ACHIEVEMENT_EARNED, 8+4+8); data.append(GetPlayer()->GetPackGUID()); diff --git a/src/game/Guild.h b/src/game/Guild.h index d3e1b0e0759..74e4bdf18ae 100644 --- a/src/game/Guild.h +++ b/src/game/Guild.h @@ -318,11 +318,12 @@ class Guild void BroadcastPacket(WorldPacket *packet); template<class Do> - void BroadcastWorker(Do& _do) + void BroadcastWorker(Do& _do, Player* except = NULL) { for(MemberList::iterator itr = members.begin(); itr != members.end(); ++itr) if(Player *player = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(itr->first, 0, HIGHGUID_PLAYER))) - _do(player); + if(player != except) + _do(player); } void CreateRank(std::string name,uint32 rights); diff --git a/src/game/Language.h b/src/game/Language.h index ff732ca3bdb..327eef25ead 100644 --- a/src/game/Language.h +++ b/src/game/Language.h @@ -695,7 +695,8 @@ enum TrinityStrings LANG_NEED_CHARACTER_NAME = 807, LANG_PLAYER_NOT_EXIST_OR_OFFLINE = 808, LANG_ACCOUNT_FOR_PLAYER_NOT_FOUND = 809, - // Room for in-game strings 810-999 not used + LANG_ACHIEVEMENT_EARNED = 810, + // Room for in-game strings 811-999 not used // Level 4 (CLI only commands) LANG_COMMAND_EXIT = 1000, diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 5990b611d87..72a44568afc 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7311" + #define REVISION_NR "7312" #endif // __REVISION_NR_H__ |