aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/AchievementMgr.cpp75
-rw-r--r--src/game/Guild.h5
-rw-r--r--src/game/Language.h3
-rw-r--r--src/shared/revision_nr.h2
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__