mirror of
https://github.com/mangosfour/server.git
synced 2025-12-15 10:37:02 +00:00
[7534] Fixed some problems in achievement messages broadcasting.
* 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)
This commit is contained in:
parent
cc11ff40fe
commit
59b7d05e8d
3 changed files with 6 additions and 5 deletions
|
|
@ -319,6 +319,7 @@ void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement)
|
||||||
MaNGOS::LocalizedPacketDo<MaNGOS::AchievementChatBuilder> say_do(say_builder);
|
MaNGOS::LocalizedPacketDo<MaNGOS::AchievementChatBuilder> say_do(say_builder);
|
||||||
guild->BroadcastWorker(say_do,GetPlayer());
|
guild->BroadcastWorker(say_do,GetPlayer());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_KILL|ACHIEVEMENT_FLAG_REALM_FIRST_REACH))
|
if(achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_KILL|ACHIEVEMENT_FLAG_REALM_FIRST_REACH))
|
||||||
{
|
{
|
||||||
// broadcast realm first reached
|
// broadcast realm first reached
|
||||||
|
|
@ -337,19 +338,20 @@ void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement)
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
cell.data.Part.reserved = ALL_DISTRICT;
|
||||||
cell.SetNoCreate();
|
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<MaNGOS::AchievementChatBuilder> say_do(say_builder);
|
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);
|
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);
|
TypeContainerVisitor<MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::AchievementChatBuilder> >, WorldTypeMapContainer > message(say_worker);
|
||||||
CellLock<GridReadGuard> cell_lock(cell, p);
|
CellLock<GridReadGuard> cell_lock(cell, p);
|
||||||
cell_lock->Visit(cell_lock, message, *GetPlayer()->GetMap());
|
cell_lock->Visit(cell_lock, message, *GetPlayer()->GetMap());
|
||||||
}
|
}
|
||||||
|
|
||||||
WorldPacket data(SMSG_ACHIEVEMENT_EARNED, 8+4+8);
|
WorldPacket data(SMSG_ACHIEVEMENT_EARNED, 8+4+8);
|
||||||
data.append(GetPlayer()->GetPackGUID());
|
data.append(GetPlayer()->GetPackGUID());
|
||||||
data << uint32(achievement->ID);
|
data << uint32(achievement->ID);
|
||||||
data << uint32(secsToTimeBitFields(time(NULL)));
|
data << uint32(secsToTimeBitFields(time(NULL)));
|
||||||
data << uint32(0);
|
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)
|
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(secsToTimeBitFields(progress->date));
|
||||||
data << uint32(0); // timer 1
|
data << uint32(0); // timer 1
|
||||||
data << uint32(0); // timer 2
|
data << uint32(0); // timer 2
|
||||||
GetPlayer()->SendMessageToSet(&data, true);
|
GetPlayer()->SendDirectMessage(&data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -88,7 +88,6 @@ enum AchievementCriteriaTypes
|
||||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST = 14,
|
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST = 14,
|
||||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND= 15,
|
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND= 15,
|
||||||
ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP= 16,
|
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= 17,
|
||||||
ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON = 18,
|
ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON = 18,
|
||||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID = 19,
|
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID = 19,
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "7533"
|
#define REVISION_NR "7534"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue