diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp index bf65393a4..3cb56dc7e 100644 --- a/src/game/AchievementMgr.cpp +++ b/src/game/AchievementMgr.cpp @@ -25,6 +25,7 @@ #include "Guild.h" #include "Database/DatabaseEnv.h" #include "GameEvent.h" +#include "World.h" AchievementMgr::AchievementMgr(Player *player) { @@ -96,26 +97,15 @@ void AchievementMgr::LoadFromDB(QueryResult *achievementResult, QueryResult *cri } -void AchievementMgr::SendAchievementEarned(uint32 achievementId) +void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement) { - sLog.outString("AchievementMgr::SendAchievementEarned(%u)", achievementId); + sLog.outString("AchievementMgr::SendAchievementEarned(%u)", achievement->ID); - 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()); const char *msg = "|Hplayer:$N|h[$N]|h has earned the achievement $a!"; - data << uint32(strlen(msg)+1); - data << msg; - data << uint8(0); - data << uint32(achievementId); - GetPlayer()->SendMessageToSet(&data, true); - if(Guild* guild = objmgr.GetGuildById(GetPlayer()->GetGuildId())) { - data.Initialize(SMSG_MESSAGECHAT, 200); + WorldPacket data(SMSG_MESSAGECHAT, 200); + data << uint8(CHAT_MSG_ACHIEVEMENT); data << uint8(CHAT_MSG_GUILD_ACHIEVEMENT); data << uint32(LANG_UNIVERSAL); data << uint64(GetPlayer()->GetGUID()); @@ -124,13 +114,37 @@ void AchievementMgr::SendAchievementEarned(uint32 achievementId) data << uint32(strlen(msg)+1); data << msg; data << uint8(0); - data << uint32(achievementId); + data << uint32(achievement->ID); guild->BroadcastPacket(&data); } + if(achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_KILL|ACHIEVEMENT_FLAG_REALM_FIRST_REACH)) + { + // broadcast realm first reached + WorldPacket data(SMSG_SERVER_FIRST_ACHIEVEMENT, strlen(GetPlayer()->GetName())+1+8+4+4); + 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 + 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); - data.Initialize(SMSG_ACHIEVEMENT_EARNED, 8+4+8); + } + WorldPacket data(SMSG_ACHIEVEMENT_EARNED, 8+4+8); data.append(GetPlayer()->GetPackGUID()); - data << uint32(achievementId); + data << uint32(achievement->ID); data << uint32(secsToTimeBitFields(time(NULL))); data << uint32(0); GetPlayer()->SendMessageToSet(&data, true); @@ -443,7 +457,7 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement) if(achievement->flags & ACHIEVEMENT_FLAG_COUNTER || m_completedAchievements.find(achievement->ID)!=m_completedAchievements.end()) return; - SendAchievementEarned(achievement->ID); + SendAchievementEarned(achievement); m_completedAchievements[achievement->ID] = time(NULL); // don't insert for ACHIEVEMENT_FLAG_REALM_FIRST_KILL since otherwise only the first group member would reach that achievement diff --git a/src/game/AchievementMgr.h b/src/game/AchievementMgr.h index f34759f78..4a86277d6 100644 --- a/src/game/AchievementMgr.h +++ b/src/game/AchievementMgr.h @@ -64,7 +64,7 @@ class AchievementMgr Player* GetPlayer() { return m_player;} private: - void SendAchievementEarned(uint32 achievementId); + void SendAchievementEarned(AchievementEntry const* achievement); void SendCriteriaUpdate(CriteriaProgress *progress); void SetCriteriaProgress(AchievementCriteriaEntry const* entry, uint32 newValue, bool relative=false); void CompletedCriteria(AchievementCriteriaEntry const* entry); diff --git a/src/game/Player.cpp b/src/game/Player.cpp index cb6a895cf..52aa1ae7b 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -3572,6 +3572,8 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC CharacterDatabase.PExecute("DELETE FROM mail_items WHERE receiver = '%u'",guid); CharacterDatabase.PExecute("DELETE FROM character_pet WHERE owner = '%u'",guid); CharacterDatabase.PExecute("DELETE FROM character_pet_declinedname WHERE owner = '%u'",guid); + CharacterDatabase.PExecute("DELETE FROM character_achievement WHERE guid = '%u'",guid); + CharacterDatabase.PExecute("DELETE FROM character_achievement_progress WHERE guid = '%u'",guid); CharacterDatabase.CommitTransaction(); //loginDatabase.PExecute("UPDATE realmcharacters SET numchars = numchars - 1 WHERE acctid = %d AND realmid = %d", accountId, realmID);