From 3c10cc0635cc5645524752272e829de030230f85 Mon Sep 17 00:00:00 2001 From: megamage Date: Tue, 24 Mar 2009 17:43:16 -0600 Subject: [PATCH] [7534] Fixed some problems in achievement messages broadcasting. Author: VladimirMangos * Send SMSG_CRITERIA_UPDATE to player itself only. This will fix bug when, for example near player death owerwrite another player death count in statistics until next death or relogin. * Send to near player CHAT_MSG_ACHIEVEMENT instead CHAT_MSG_GUILD_ACHIEVEMENT * Not send CHAT_MSG_GUILD_ACHIEVEMENT to player itself. * Limit around broadcast of SMSG_ACHIEVEMENT_EARNED to CONFIG_LISTEN_RANGE_SAY (same as for CHAT_MSG_ACHIEVEMENT) --HG-- branch : trunk --- src/game/AchievementMgr.cpp | 8 +++++--- src/shared/Database/DBCEnums.h | 1 - 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp index aef535cc33..5e8078de0b 100644 --- a/src/game/AchievementMgr.cpp +++ b/src/game/AchievementMgr.cpp @@ -319,6 +319,7 @@ void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement) MaNGOS::LocalizedPacketDo say_do(say_builder); guild->BroadcastWorker(say_do,GetPlayer()); } + if(achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_KILL|ACHIEVEMENT_FLAG_REALM_FIRST_REACH)) { // broadcast realm first reached @@ -337,19 +338,20 @@ void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement) cell.data.Part.reserved = ALL_DISTRICT; cell.SetNoCreate(); - MaNGOS::AchievementChatBuilder say_builder(*GetPlayer(), CHAT_MSG_GUILD_ACHIEVEMENT, LANG_ACHIEVEMENT_EARNED,achievement->ID); + MaNGOS::AchievementChatBuilder say_builder(*GetPlayer(), CHAT_MSG_ACHIEVEMENT, LANG_ACHIEVEMENT_EARNED,achievement->ID); MaNGOS::LocalizedPacketDo say_do(say_builder); MaNGOS::PlayerDistWorker > say_worker(GetPlayer(),sWorld.getConfig(CONFIG_LISTEN_RANGE_SAY),say_do); TypeContainerVisitor >, WorldTypeMapContainer > message(say_worker); CellLock cell_lock(cell, p); cell_lock->Visit(cell_lock, message, *GetPlayer()->GetMap()); } + WorldPacket data(SMSG_ACHIEVEMENT_EARNED, 8+4+8); data.append(GetPlayer()->GetPackGUID()); data << uint32(achievement->ID); data << uint32(secsToTimeBitFields(time(NULL))); data << uint32(0); - GetPlayer()->SendMessageToSet(&data, true); + GetPlayer()->SendMessageToSetInRange(&data, sWorld.getConfig(CONFIG_LISTEN_RANGE_SAY), true); } void AchievementMgr::SendCriteriaUpdate(uint32 id, CriteriaProgress const* progress) @@ -365,7 +367,7 @@ void AchievementMgr::SendCriteriaUpdate(uint32 id, CriteriaProgress const* progr data << uint32(secsToTimeBitFields(progress->date)); data << uint32(0); // timer 1 data << uint32(0); // timer 2 - GetPlayer()->SendMessageToSet(&data, true); + GetPlayer()->SendDirectMessage(&data); } /** diff --git a/src/shared/Database/DBCEnums.h b/src/shared/Database/DBCEnums.h index ee4f165f89..c5801c7b31 100644 --- a/src/shared/Database/DBCEnums.h +++ b/src/shared/Database/DBCEnums.h @@ -88,7 +88,6 @@ enum AchievementCriteriaTypes ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST = 14, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND= 15, ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP= 16, - // TODO: this can be both arena and total deaths. Where is this difference in the dbc? ACHIEVEMENT_CRITERIA_TYPE_DEATH= 17, ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON = 18, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID = 19,