From 06e50a9690f7708dc7134c98807f58f1bb445035 Mon Sep 17 00:00:00 2001 From: UltraNix <80540499+UltraNix@users.noreply.github.com> Date: Sun, 3 Oct 2021 18:12:12 +0200 Subject: [PATCH] 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 --- .../game/Achievements/AchievementMgr.cpp | 46 +++++++++---------- src/server/game/Achievements/AchievementMgr.h | 2 +- src/server/game/Spells/Spell.cpp | 4 +- src/server/game/Spells/SpellInfo.h | 2 +- src/server/game/Spells/SpellMgr.cpp | 8 ++++ 5 files changed, 33 insertions(+), 29 deletions(-) diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 4d6c27781..1f4996d0f 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -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); } diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index ceb6be51f..60c1c07b9 100644 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -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; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index a3372792a..bc5fc8ad9 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -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); } diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index fc057a1c9..6ce42ef52 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -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, diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 1a0a5faff..0d9b3688b 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -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