diff options
| -rw-r--r-- | sql/mangos.sql | 3 | ||||
| -rw-r--r-- | sql/updates/7312_01_mangos_mangos_string.sql | 5 | ||||
| -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 | 
6 files changed, 63 insertions, 30 deletions
diff --git a/sql/mangos.sql b/sql/mangos.sql index a7e555be112..75b4fce25e6 100644 --- a/sql/mangos.sql +++ b/sql/mangos.sql @@ -22,7 +22,7 @@  DROP TABLE IF EXISTS `db_version`;  CREATE TABLE `db_version` (    `version` varchar(120) default NULL, -  `required_7303_01_mangos_pools` bit(1) default NULL +  `required_7312_01_mangos_mangos_string` bit(1) default NULL  ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes';  -- @@ -2870,6 +2870,7 @@ INSERT INTO `mangos_string` VALUES  (807,'Please provide character name',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),  (808,'Player %s not found or offline',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),  (809,'Account for character %s not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), +(810,'|Hplayer:$N|h[$N]|h has earned the achievement $a!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),  (1000,'Exiting daemon...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),  (1001,'Account deleted: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),  (1002,'Account %s NOT deleted (probably sql file format was updated)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), diff --git a/sql/updates/7312_01_mangos_mangos_string.sql b/sql/updates/7312_01_mangos_mangos_string.sql new file mode 100644 index 00000000000..8a5f848d438 --- /dev/null +++ b/sql/updates/7312_01_mangos_mangos_string.sql @@ -0,0 +1,5 @@ +ALTER TABLE db_version CHANGE COLUMN required_7303_01_mangos_pools required_7312_01_mangos_mangos_string bit; + +DELETE FROM `mangos_string` WHERE entry = 810; +INSERT INTO `mangos_string` VALUES +(810,'|Hplayer:$N|h[$N]|h has earned the achievement $a!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); 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__  | 
