fix(Core/Achievements): Fixed showing achievement statistics of inspected player. (#8093)

* fix(Core/Spells): Implemented SPELL_ATTR0_CU_NO_PVP_FLAG.

Fixes #7938

* fix(Core/Achievements): Fixed showing achievement statistics of inspected player.

Fixes #7979
This commit is contained in:
UltraNix
2021-10-03 18:12:12 +02:00
committed by GitHub
parent 396070ee4d
commit 06e50a9690
5 changed files with 33 additions and 29 deletions

View File

@@ -2320,44 +2320,40 @@ void AchievementMgr::SendAllAchievementData() const
void AchievementMgr::SendRespondInspectAchievements(Player* player) const
{
WorldPacket data(SMSG_RESPOND_INSPECT_ACHIEVEMENTS, 9 + m_completedAchievements.size() * 8 + 4 + 4);
WorldPacket data(SMSG_RESPOND_INSPECT_ACHIEVEMENTS, 9 + m_completedAchievements.size() * 8 + 4 + m_criteriaProgress.size() * 38 + 4);
data << GetPlayer()->GetPackGUID();
BuildAllDataPacket(&data, true);
BuildAllDataPacket(&data);
player->GetSession()->SendPacket(&data);
}
/**
* used by SMSG_RESPOND_INSPECT_ACHIEVEMENT and SMSG_ALL_ACHIEVEMENT_DATA
*/
void AchievementMgr::BuildAllDataPacket(WorldPacket* data, bool inspect) const
void AchievementMgr::BuildAllDataPacket(WorldPacket* data) const
{
if (!m_completedAchievements.empty())
for (CompletedAchievementMap::const_iterator iter = m_completedAchievements.begin(); iter != m_completedAchievements.end(); ++iter)
{
AchievementEntry const* achievement = nullptr;
for (CompletedAchievementMap::const_iterator iter = m_completedAchievements.begin(); iter != m_completedAchievements.end(); ++iter)
{
// Skip hidden achievements
achievement = sAchievementStore.LookupEntry(iter->first);
if (!achievement || achievement->flags & ACHIEVEMENT_FLAG_HIDDEN)
continue;
// Skip hidden achievements
AchievementEntry const* achievement = sAchievementStore.LookupEntry(iter->first);
if (!achievement || achievement->flags & ACHIEVEMENT_FLAG_HIDDEN)
continue;
*data << uint32(iter->first);
data->AppendPackedTime(iter->second.date);
}
*data << uint32(iter->first);
data->AppendPackedTime(iter->second.date);
}
*data << int32(-1);
if (!inspect && !m_criteriaProgress.empty())
for (CriteriaProgressMap::const_iterator iter = m_criteriaProgress.begin(); iter != m_criteriaProgress.end(); ++iter)
{
*data << uint32(iter->first);
data->appendPackGUID(iter->second.counter);
*data << GetPlayer()->GetPackGUID();
*data << uint32(0);
data->AppendPackedTime(iter->second.date);
*data << uint32(0);
*data << uint32(0);
}
for (CriteriaProgressMap::const_iterator iter = m_criteriaProgress.begin(); iter != m_criteriaProgress.end(); ++iter)
{
*data << uint32(iter->first);
data->appendPackGUID(iter->second.counter);
*data << GetPlayer()->GetPackGUID();
*data << uint32(0);
data->AppendPackedTime(iter->second.date);
*data << uint32(0);
*data << uint32(0);
}
*data << int32(-1);
}

View File

@@ -304,7 +304,7 @@ private:
bool IsCompletedCriteria(AchievementCriteriaEntry const* achievementCriteria, AchievementEntry const* achievement);
bool IsCompletedAchievement(AchievementEntry const* entry);
bool CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement);
void BuildAllDataPacket(WorldPacket* data, bool inspect = false) const;
void BuildAllDataPacket(WorldPacket* data) const;
Player* m_player;
CriteriaProgressMap m_criteriaProgress;

View File

@@ -2743,7 +2743,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target)
// if target is fallged for pvp also flag caster if a player
// xinef: do not flag spells with aura bind sight (no special attribute)
if (effectUnit->IsPvP() && effectUnit != m_caster && effectUnit->GetOwnerGUID() != m_caster->GetGUID() &&
m_caster->GetTypeId() == TYPEID_PLAYER && !m_spellInfo->HasAura(SPELL_AURA_BIND_SIGHT))
m_caster->GetTypeId() == TYPEID_PLAYER && !m_spellInfo->HasAttribute(SPELL_ATTR0_CU_NO_PVP_FLAG))
{
m_caster->ToPlayer()->UpdatePvP(true);
}
@@ -2830,7 +2830,7 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA
if (unit->HasUnitState(UNIT_STATE_ATTACK_PLAYER))
{
m_caster->SetContestedPvP();
if (m_caster->GetTypeId() == TYPEID_PLAYER && !m_spellInfo->HasAura(SPELL_AURA_BIND_SIGHT))
if (m_caster->GetTypeId() == TYPEID_PLAYER && !m_spellInfo->HasAttribute(SPELL_ATTR0_CU_NO_PVP_FLAG))
m_caster->ToPlayer()->UpdatePvP(true);
}

View File

@@ -180,7 +180,7 @@ enum SpellCustomAttributes
SPELL_ATTR0_CU_NO_INITIAL_THREAT = 0x00000010,
SPELL_ATTR0_CU_AURA_CC = 0x00000020,
SPELL_ATTR0_CU_DONT_BREAK_STEALTH = 0x00000040,
SPELL_ATTR0_CU_NONE3 = 0x00000080, // UNUSED
SPELL_ATTR0_CU_NO_PVP_FLAG = 0x00000080,
SPELL_ATTR0_CU_DIRECT_DAMAGE = 0x00000100,
SPELL_ATTR0_CU_CHARGE = 0x00000200,
SPELL_ATTR0_CU_PICKPOCKET = 0x00000400,

View File

@@ -2856,6 +2856,11 @@ void SpellMgr::LoadSpellCustomAttr()
case SPELL_AURA_MOD_STUN:
spellInfo->AttributesCu |= SPELL_ATTR0_CU_AURA_CC;
break;
case SPELL_AURA_BIND_SIGHT:
spellInfo->AttributesCu |= SPELL_ATTR0_CU_NO_PVP_FLAG;
break;
default:
break;
}
switch (spellInfo->Effects[j].Effect)
@@ -3269,6 +3274,9 @@ void SpellMgr::LoadSpellCustomAttr()
case 6197: // Eagle Eye
spellInfo->AttributesCu |= SPELL_ATTR0_CU_NO_INITIAL_THREAT;
break;
case 50315: // Disco Ball
spellInfo->AttributesCu |= SPELL_ATTR0_CU_NO_PVP_FLAG;
break;
// Xinef: NOT CUSTOM, cant add in DBC CORRECTION because i need to swap effects, too much work to do there
// Envenom