diff options
Diffstat (limited to 'src')
18 files changed, 131 insertions, 144 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index a76564d8b77..1fc0b8bf304 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -426,7 +426,7 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Wo } case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM: { - AchievementCriteriaEntry const* entry = ASSERT_NOTNULL(sAchievementMgr->GetAchievementCriteria(criteria_id)); + AchievementCriteriaEntry const* entry = sAchievementCriteriaStore.AssertEntry(criteria_id); uint32 itemId = (entry->Type == ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM ? miscValue2 : miscValue1); ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemId); @@ -477,9 +477,8 @@ bool AchievementCriteriaDataSet::Meets(Player const* source, WorldObject const* return true; } -AchievementMgr::AchievementMgr(Player* player) +AchievementMgr::AchievementMgr(Player* player) : m_player(player), m_achievementPoints(0) { - m_player = player; } AchievementMgr::~AchievementMgr() { } @@ -501,6 +500,7 @@ void AchievementMgr::Reset() } m_completedAchievements.clear(); + m_achievementPoints = 0; m_criteriaProgress.clear(); DeleteFromDB(m_player->GetGUID()); @@ -522,7 +522,7 @@ void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaCondition condi for (AchievementCriteriaEntry const* achievementCriteria : *achievementCriteriaList) { - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(achievementCriteria->AchievementID); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementCriteria->AchievementID); if (!achievement) continue; @@ -610,7 +610,7 @@ void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQ uint32 achievementid = fields[0].GetUInt16(); // must not happen: cleanup at server startup in sAchievementMgr->LoadCompletedAchievements() - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(achievementid); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementid); if (!achievement) continue; @@ -618,6 +618,8 @@ void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQ ca.date = time_t(fields[1].GetUInt32()); ca.changed = false; + m_achievementPoints += achievement->Points; + // title achievement rewards are retroactive if (AchievementReward const* reward = sAchievementMgr->GetAchievementReward(achievement)) if (uint32 titleId = reward->TitleId[Player::TeamForRace(GetPlayer()->GetRace()) == ALLIANCE ? 0 : 1]) @@ -636,7 +638,7 @@ void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQ uint32 counter = fields[1].GetUInt32(); time_t date = time_t(fields[2].GetUInt32()); - AchievementCriteriaEntry const* criteria = sAchievementMgr->GetAchievementCriteria(id); + AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(id); if (!criteria) { // Removing non-existing criteria data for all characters @@ -784,7 +786,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui AchievementCriteriaEntryList const& achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByType(type, miscValue1); for (AchievementCriteriaEntry const* achievementCriteria : achievementCriteriaList) { - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(achievementCriteria->AchievementID); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementCriteria->AchievementID); if (!CanUpdateCriteria(achievementCriteria, achievement, miscValue1, miscValue2, ref)) continue; @@ -1051,13 +1053,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui break; case ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS: if (!miscValue1) - { - uint32 points = 0; - for (std::pair<uint32 const, CompletedAchievementData> const& completedAchievement : m_completedAchievements) - if (AchievementEntry const* completedAchievements = sAchievementMgr->GetAchievement(completedAchievement.first)) - points += completedAchievements->Points; - SetCriteriaProgress(achievementCriteria, points, PROGRESS_SET); - } + SetCriteriaProgress(achievementCriteria, m_achievementPoints, PROGRESS_SET); else SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_ACCUMULATE); break; @@ -1174,7 +1170,7 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve if (!progress) return false; - switch (achievementCriteria->Type) + switch (AchievementCriteriaTypes(achievementCriteria->Type)) { case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG: case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE: @@ -1274,6 +1270,7 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve default: break; } + return false; } @@ -1415,7 +1412,7 @@ void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry, if (entry->StartTimer) { // has to exist, otherwise we wouldn't be here - timedCompleted = IsCompletedCriteria(entry, sAchievementMgr->GetAchievement(entry->AchievementID)); + timedCompleted = IsCompletedCriteria(entry, sAchievementStore.LookupEntry(entry->AchievementID)); // Client expects this in packet timeElapsed = entry->StartTimer - (timedIter->second/IN_MILLISECONDS); @@ -1452,7 +1449,7 @@ void AchievementMgr::UpdateTimedAchievements(uint32 timeDiff) // Time is up, remove timer and reset progress if (itr->second <= timeDiff) { - AchievementCriteriaEntry const* entry = sAchievementMgr->GetAchievementCriteria(itr->first); + AchievementCriteriaEntry const* entry = sAchievementCriteriaStore.LookupEntry(itr->first); RemoveCriteriaProgress(entry); m_timedAchievements.erase(itr++); } @@ -1472,7 +1469,7 @@ void AchievementMgr::StartTimedAchievement(AchievementCriteriaTimedTypes type, u if (criteria->StartAsset != entry) continue; - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(criteria->AchievementID); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(criteria->AchievementID); if (m_timedAchievements.find(criteria->ID) == m_timedAchievements.end() && !IsCompletedCriteria(criteria, achievement)) { // Start the timer @@ -1527,6 +1524,8 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement) if (achievement->Flags & (ACHIEVEMENT_FLAG_REALM_FIRST_REACH | ACHIEVEMENT_FLAG_REALM_FIRST_KILL)) sAchievementMgr->SetRealmCompleted(achievement); + m_achievementPoints += achievement->Points; + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT, achievement->ID); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS, achievement->Points); @@ -1610,7 +1609,7 @@ void AchievementMgr::BuildAllDataPacket(Player const* receiver, WorldPacket* dat for (std::pair<uint32 const, CompletedAchievementData> const& completedAchievement : m_completedAchievements) { // Skip hidden achievements - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(completedAchievement.first); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(completedAchievement.first); if (!achievement || achievement->Flags & ACHIEVEMENT_FLAG_HIDDEN) continue; @@ -2333,11 +2332,11 @@ void AchievementGlobalMgr::LoadAchievementCriteriaList() uint32 loaded = 0; for (uint32 entryId = 0; entryId < sAchievementCriteriaStore.GetNumRows(); ++entryId) { - AchievementCriteriaEntry const* criteria = sAchievementMgr->GetAchievementCriteria(entryId); + AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(entryId); if (!criteria) continue; - if (!GetAchievement(criteria->AchievementID)) + if (!sAchievementStore.LookupEntry(criteria->AchievementID)) { TC_LOG_DEBUG("server.loading", "Achievement {} referenced by criteria {} doesn't exist, criteria not loaded.", criteria->AchievementID, criteria->ID); continue; @@ -2415,7 +2414,7 @@ void AchievementGlobalMgr::LoadAchievementReferenceList() for (uint32 entryId = 0; entryId < sAchievementStore.GetNumRows(); ++entryId) { - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(entryId); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(entryId); if (!achievement || !achievement->SharesCriteria) continue; @@ -2424,7 +2423,7 @@ void AchievementGlobalMgr::LoadAchievementReferenceList() } // Once Bitten, Twice Shy (10 player) - Icecrown Citadel - if (AchievementEntry const* achievement = sAchievementMgr->GetAchievement(4539)) + if (AchievementEntry const* achievement = sAchievementStore.LookupEntry(4539)) const_cast<AchievementEntry*>(achievement)->InstanceID = 631; // Correct map requirement (currently has Ulduar) TC_LOG_INFO("server.loading", ">> Loaded {} achievement references in {} ms.", count, GetMSTimeDiffToNow(oldMSTime)); @@ -2451,7 +2450,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() Field* fields = result->Fetch(); uint32 criteria_id = fields[0].GetUInt32(); - AchievementCriteriaEntry const* criteria = sAchievementMgr->GetAchievementCriteria(criteria_id); + AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(criteria_id); if (!criteria) { @@ -2491,7 +2490,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() // post loading checks for (uint32 entryId = 0; entryId < sAchievementCriteriaStore.GetNumRows(); ++entryId) { - AchievementCriteriaEntry const* criteria = sAchievementMgr->GetAchievementCriteria(entryId); + AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(entryId); if (!criteria) continue; @@ -2517,7 +2516,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() break; case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: { - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(criteria->AchievementID); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(criteria->AchievementID); if (!achievement) continue; @@ -2546,7 +2545,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST: case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM: // only Children's Week achievements { - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(criteria->AchievementID); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(criteria->AchievementID); if (!achievement) continue; if (achievement->Category != CATEGORY_CHILDRENS_WEEK && achievement->ID != 1785) @@ -2589,7 +2588,7 @@ void AchievementGlobalMgr::LoadCompletedAchievements() Field* fields = result->Fetch(); uint16 achievementId = fields[0].GetUInt16(); - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(achievementId); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementId); if (!achievement) { // Remove non-existing achievements from all characters @@ -2628,7 +2627,7 @@ void AchievementGlobalMgr::LoadRewards() { Field* fields = result->Fetch(); uint32 id = fields[0].GetUInt32(); - AchievementEntry const* achievement = GetAchievement(id); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(id); if (!achievement) { TC_LOG_ERROR("sql.sql", "Table `achievement_reward` contains a wrong achievement ID ({}), ignored.", id); @@ -2763,13 +2762,3 @@ void AchievementGlobalMgr::LoadRewardLocales() TC_LOG_INFO("server.loading", ">> Loaded {} achievement reward locale strings in {} ms.", uint32(m_achievementRewardLocales.size()), GetMSTimeDiffToNow(oldMSTime)); } - -AchievementEntry const* AchievementGlobalMgr::GetAchievement(uint32 achievementId) const -{ - return sAchievementStore.LookupEntry(achievementId); -} - -AchievementCriteriaEntry const* AchievementGlobalMgr::GetAchievementCriteria(uint32 criteriaId) const -{ - return sAchievementCriteriaStore.LookupEntry(criteriaId); -} diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index 28041c35e77..0299add217a 100644 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -292,6 +292,7 @@ class TC_GAME_API AchievementMgr void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost = 0); void RemoveTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry); // used for quest and scripted timed achievements + uint32 GetAchievementPoints() const { return m_achievementPoints; } private: void SendAchievementEarned(AchievementEntry const* achievement) const; void SendCriteriaUpdate(AchievementCriteriaEntry const* entry, CriteriaProgress const* progress, uint32 timeElapsed, bool timedCompleted) const; @@ -312,6 +313,7 @@ class TC_GAME_API AchievementMgr CompletedAchievementMap m_completedAchievements; typedef std::map<uint32, uint32> TimedAchievementMap; TimedAchievementMap m_timedAchievements; // Criteria id/time left in MS + uint32 m_achievementPoints; }; class TC_GAME_API AchievementGlobalMgr @@ -377,8 +379,6 @@ class TC_GAME_API AchievementGlobalMgr void LoadCompletedAchievements(); void LoadRewards(); void LoadRewardLocales(); - AchievementEntry const* GetAchievement(uint32 achievementId) const; - AchievementCriteriaEntry const* GetAchievementCriteria(uint32 achievementId) const; private: AchievementCriteriaDataMap m_criteriaDataMap; diff --git a/src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp b/src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp index 91af31cc41c..6c69343f1a0 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp +++ b/src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp @@ -16,8 +16,8 @@ */ #include "ChatCommandArgs.h" -#include "AchievementMgr.h" #include "ChatCommand.h" +#include "DBCStores.h" #include "ObjectMgr.h" #include "SpellMgr.h" #include "Util.h" @@ -29,7 +29,7 @@ struct AchievementVisitor { using value_type = AchievementEntry const*; value_type operator()(Hyperlink<achievement> achData) const { return achData->Achievement; } - value_type operator()(uint32 achId) const { return sAchievementMgr->GetAchievement(achId); } + value_type operator()(uint32 achId) const { return sAchievementStore.LookupEntry(achId); } }; ChatCommandResult Trinity::Impl::ChatCommands::ArgInfo<AchievementEntry const*>::TryConsume(AchievementEntry const*& data, ChatHandler const* handler, std::string_view args) { diff --git a/src/server/game/Chat/HyperlinkTags.cpp b/src/server/game/Chat/HyperlinkTags.cpp index 84f1986cd91..8aaee9ec346 100644 --- a/src/server/game/Chat/HyperlinkTags.cpp +++ b/src/server/game/Chat/HyperlinkTags.cpp @@ -16,7 +16,7 @@ */ #include "Hyperlinks.h" -#include "AchievementMgr.h" +#include "DBCStores.h" #include "ObjectMgr.h" #include "SpellInfo.h" #include "SpellMgr.h" @@ -63,7 +63,7 @@ bool Trinity::Hyperlinks::LinkTags::achievement::StoreTo(AchievementLinkData& va uint32 achievementId; if (!t.TryConsumeTo(achievementId)) return false; - val.Achievement = sAchievementMgr->GetAchievement(achievementId); + val.Achievement = sAchievementStore.LookupEntry(achievementId); if (!(val.Achievement && t.TryConsumeTo(val.CharacterId) && t.TryConsumeTo(val.IsFinished) && t.TryConsumeTo(val.Month) && t.TryConsumeTo(val.Day))) return false; diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 7ecaf0977dc..e79f6605fb1 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -17,6 +17,7 @@ #include "ConditionMgr.h" #include "AchievementMgr.h" +#include "DBCStores.h" #include "DatabaseEnv.h" #include "GameEventMgr.h" #include "GameObject.h" @@ -439,7 +440,7 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) const } case CONDITION_REALM_ACHIEVEMENT: { - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(ConditionValue1); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(ConditionValue1); if (achievement && sAchievementMgr->IsRealmCompleted(achievement)) condMeets = true; break; @@ -2003,7 +2004,7 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) const } case CONDITION_ACHIEVEMENT: { - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(cond->ConditionValue1); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(cond->ConditionValue1); if (!achievement) { TC_LOG_ERROR("sql.sql", "{} has non existing achivement id ({}), skipped.", cond->ToString(true), cond->ConditionValue1); @@ -2302,7 +2303,7 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) const break; case CONDITION_REALM_ACHIEVEMENT: { - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(cond->ConditionValue1); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(cond->ConditionValue1); if (!achievement) { TC_LOG_ERROR("sql.sql", "{} has non existing realm first achivement id ({}), skipped.", cond->ToString(true), cond->ConditionValue1); diff --git a/src/server/game/Conditions/DisableMgr.cpp b/src/server/game/Conditions/DisableMgr.cpp index 6eb6a3ddcaf..886c3cb4839 100644 --- a/src/server/game/Conditions/DisableMgr.cpp +++ b/src/server/game/Conditions/DisableMgr.cpp @@ -188,7 +188,7 @@ void LoadDisables() TC_LOG_ERROR("sql.sql", "Disable flags specified for outdoor PvP {}, useless data.", entry); break; case DISABLE_TYPE_ACHIEVEMENT_CRITERIA: - if (!sAchievementMgr->GetAchievementCriteria(entry)) + if (!sAchievementCriteriaStore.LookupEntry(entry)) { TC_LOG_ERROR("sql.sql", "Achievement Criteria entry {} from `disables` doesn't exist in dbc, skipped.", entry); continue; diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp index 84d268f562f..017b79e5ffa 100644 --- a/src/server/game/Entities/DynamicObject/DynamicObject.cpp +++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp @@ -82,29 +82,23 @@ void DynamicObject::RemoveFromWorld() } } -bool DynamicObject::CreateDynamicObject(ObjectGuid::LowType guidlow, Unit* caster, uint32 spellId, Position const& pos, float radius, DynamicObjectType type) +bool DynamicObject::CreateDynamicObject(ObjectGuid::LowType guidlow, Unit* caster, SpellInfo const* spell, Position const& pos, float radius, DynamicObjectType type) { SetMap(caster->GetMap()); Relocate(pos); if (!IsPositionValid()) { - TC_LOG_ERROR("misc", "DynamicObject (spell {}) not created. Suggested coordinates isn't valid (X: {} Y: {})", spellId, GetPositionX(), GetPositionY()); + TC_LOG_ERROR("misc", "DynamicObject (spell {}) not created. Suggested coordinates isn't valid (X: {} Y: {})", spell->Id, GetPositionX(), GetPositionY()); return false; } WorldObject::_Create(guidlow, HighGuid::DynamicObject, caster->GetPhaseMask()); - SetEntry(spellId); + SetEntry(spell->Id); SetObjectScale(1); SetGuidValue(DYNAMICOBJECT_CASTER, caster->GetGUID()); - - // The lower word of DYNAMICOBJECT_BYTES must be 0x0001. This value means that the visual radius will be overriden - // by client for most of the "ground patch" visual effect spells and a few "skyfall" ones like Hurricane. - // If any other value is used, the client will _always_ use the radius provided in DYNAMICOBJECT_RADIUS, but - // precompensation is necessary (eg radius *= 2) for many spells. Anyway, blizz sends 0x0001 for all the spells - // I saw sniffed... SetByteValue(DYNAMICOBJECT_BYTES, 0, type); - SetUInt32Value(DYNAMICOBJECT_SPELLID, spellId); + SetUInt32Value(DYNAMICOBJECT_SPELLID, spell->Id); SetFloatValue(DYNAMICOBJECT_RADIUS, radius); SetUInt32Value(DYNAMICOBJECT_CASTTIME, GameTime::GetGameTimeMS()); diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.h b/src/server/game/Entities/DynamicObject/DynamicObject.h index 8d2cd68acd4..dc5b5218af2 100644 --- a/src/server/game/Entities/DynamicObject/DynamicObject.h +++ b/src/server/game/Entities/DynamicObject/DynamicObject.h @@ -42,7 +42,7 @@ class TC_GAME_API DynamicObject : public WorldObject, public GridObject<DynamicO void AddToWorld() override; void RemoveFromWorld() override; - bool CreateDynamicObject(ObjectGuid::LowType guidlow, Unit* caster, uint32 spellId, Position const& pos, float radius, DynamicObjectType type); + bool CreateDynamicObject(ObjectGuid::LowType guidlow, Unit* caster, SpellInfo const* spell, Position const& pos, float radius, DynamicObjectType type); void Update(uint32 p_time) override; void Remove(); void SetDuration(int32 newDuration); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 3ccf62abd42..ff4f91cc297 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -14411,11 +14411,11 @@ void Player::PrepareQuestMenu(ObjectGuid guid) //only for quests which cast teleport spells on player Map* _map = IsInWorld() ? GetMap() : sMapMgr->FindMap(GetMapId(), GetInstanceId()); ASSERT(_map); - GameObject* pGameObject = _map->GetGameObject(guid); - if (pGameObject) + GameObject* gameObject = _map->GetGameObject(guid); + if (gameObject) { - objectQR = sObjectMgr->GetGOQuestRelations(pGameObject->GetEntry()); - objectQIR = sObjectMgr->GetGOQuestInvolvedRelations(pGameObject->GetEntry()); + objectQR = sObjectMgr->GetGOQuestRelations(gameObject->GetEntry()); + objectQIR = sObjectMgr->GetGOQuestInvolvedRelations(gameObject->GetEntry()); } else return; @@ -14538,31 +14538,30 @@ bool Player::IsActiveQuest(uint32 quest_id) const return m_QuestStatus.find(quest_id) != m_QuestStatus.end(); } -Quest const* Player::GetNextQuest(ObjectGuid guid, Quest const* quest) const +Quest const* Player::GetNextQuest(Object const* questGiver, Quest const* quest) const { - QuestRelationResult quests; + uint32 nextQuestID = quest->GetNextQuestInChain(); + if (!nextQuestID) + return nullptr; - Creature* creature = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, guid); - if (creature) - quests = sObjectMgr->GetCreatureQuestRelations(creature->GetEntry()); - else + if (questGiver == this) { - //we should obtain map pointer from GetMap() in 99% of cases. Special case - //only for quests which cast teleport spells on player - Map* _map = IsInWorld() ? GetMap() : sMapMgr->FindMap(GetMapId(), GetInstanceId()); - ASSERT(_map); - GameObject* pGameObject = _map->GetGameObject(guid); - if (pGameObject) - quests = sObjectMgr->GetGOQuestRelations(pGameObject->GetEntry()); - else + if (!quest->HasFlag(QUEST_FLAGS_AUTOCOMPLETE)) return nullptr; + + return sObjectMgr->GetQuestTemplate(nextQuestID); } - if (uint32 nextQuestID = quest->GetNextQuestInChain()) - if (quests.HasQuest(nextQuestID)) - return sObjectMgr->GetQuestTemplate(nextQuestID); + //we should obtain map pointer from GetMap() in 99% of cases. Special case + //only for quests which cast teleport spells on player + if (WorldObject const* worldObjectQuestGiver = dynamic_cast<WorldObject const*>(questGiver)) + if (!IsInMap(worldObjectQuestGiver)) + return nullptr; - return nullptr; + if (!questGiver->hasQuest(nextQuestID)) + return nullptr; + + return sObjectMgr->GetQuestTemplate(nextQuestID); } bool Player::CanSeeStartQuest(Quest const* quest) const diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index ba7bb3a16b5..fdb042894f8 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1246,7 +1246,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void PrepareQuestMenu(ObjectGuid guid); void SendPreparedQuest(ObjectGuid guid); bool IsActiveQuest(uint32 quest_id) const; - Quest const* GetNextQuest(ObjectGuid guid, Quest const* quest) const; + Quest const* GetNextQuest(Object const* questGiver, Quest const* quest) const; bool CanSeeStartQuest(Quest const* quest) const; bool CanTakeQuest(Quest const* quest, bool msg) const; bool CanAddQuest(Quest const* quest, bool msg) const; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 97d585c5db1..af083b1532e 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -7386,7 +7386,7 @@ void ObjectMgr::LoadAccessRequirements() if (ar->achievement) { - if (!sAchievementMgr->GetAchievement(ar->achievement)) + if (!sAchievementStore.LookupEntry(ar->achievement)) { TC_LOG_ERROR("sql.sql", "Required Achievement {} not exist for map {} difficulty {}, remove quest done requirement.", ar->achievement, mapid, difficulty); ar->achievement = 0; @@ -10103,9 +10103,9 @@ void ObjectMgr::LoadFactionChangeAchievements() uint32 alliance = fields[0].GetUInt32(); uint32 horde = fields[1].GetUInt32(); - if (!sAchievementMgr->GetAchievement(alliance)) + if (!sAchievementStore.LookupEntry(alliance)) TC_LOG_ERROR("sql.sql", "Achievement {} (alliance_id) referenced in `player_factionchange_achievement` does not exist, pair skipped!", alliance); - else if (!sAchievementMgr->GetAchievement(horde)) + else if (!sAchievementStore.LookupEntry(horde)) TC_LOG_ERROR("sql.sql", "Achievement {} (horde_id) referenced in `player_factionchange_achievement` does not exist, pair skipped!", horde); else FactionChangeAchievements[alliance] = horde; diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index 26ca49d3b49..5e93660f877 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -727,6 +727,7 @@ class TC_GAME_API Guild // Bank tabs void SetBankTabText(uint8 tabId, std::string_view text); + EmblemInfo const& GetEmblemInfo() const { return m_emblemInfo; } void ResetTimes(); Trinity::unique_weak_ptr<Guild> GetWeakPtr() const { return m_weakRef; } diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 5dff546301b..7c74891d6d3 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -276,6 +276,10 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData) TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_CHOOSE_REWARD npc = {}, quest = {}, reward = {}", guid.ToString(), questId, reward); + Quest const* quest = sObjectMgr->GetQuestTemplate(questId); + if (!quest) + return; + Object* object = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT); if (!object || !object->hasInvolvedQuest(questId)) return; @@ -284,71 +288,69 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData) if (!_player->CanInteractWithQuestGiver(object)) return; - if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId)) + if ((!_player->CanSeeStartQuest(quest) && _player->GetQuestStatus(questId) == QUEST_STATUS_NONE) || + (_player->GetQuestStatus(questId) != QUEST_STATUS_COMPLETE && !quest->IsAutoComplete())) { - if ((!_player->CanSeeStartQuest(quest) && _player->GetQuestStatus(questId) == QUEST_STATUS_NONE) || - (_player->GetQuestStatus(questId) != QUEST_STATUS_COMPLETE && !quest->IsAutoComplete())) - { - TC_LOG_ERROR("entities.player.cheat", "Error in QUEST_STATUS_COMPLETE: player {} {} tried to complete quest {}, but is not allowed to do so (possible packet-hacking or high latency)", - _player->GetName(), _player->GetGUID().ToString(), questId); - return; - } - if (_player->CanRewardQuest(quest, true)) // First, check if player is allowed to turn the quest in (all objectives completed). If not, we send players to the offer reward screen + TC_LOG_ERROR("entities.player.cheat", "Error in QUEST_STATUS_COMPLETE: player {} {} tried to complete quest {}, but is not allowed to do so (possible packet-hacking or high latency)", + _player->GetName(), _player->GetGUID().ToString(), questId); + return; + } + + if (_player->CanRewardQuest(quest, true)) // First, check if player is allowed to turn the quest in (all objectives completed). If not, we send players to the offer reward screen + { + if (_player->CanRewardQuest(quest, reward, true)) // Then check if player can receive the reward item (if inventory is not full, if player doesn't have too many unique items, and so on). If not, the client will close the gossip window { - if (_player->CanRewardQuest(quest, reward, true)) // Then check if player can receive the reward item (if inventory is not full, if player doesn't have too many unique items, and so on). If not, the client will close the gossip window - { - _player->RewardQuest(quest, reward, object); + _player->RewardQuest(quest, reward, object); - switch (object->GetTypeId()) + switch (object->GetTypeId()) + { + case TYPEID_UNIT: { - case TYPEID_UNIT: + Creature* questgiver = object->ToCreature(); + // Send next quest + if (Quest const* nextQuest = _player->GetNextQuest(questgiver, quest)) { - Creature* questgiver = object->ToCreature(); - // Send next quest - if (Quest const* nextQuest = _player->GetNextQuest(guid, quest)) + // Only send the quest to the player if the conditions are met + if (_player->CanTakeQuest(nextQuest, false)) { - // Only send the quest to the player if the conditions are met - if (_player->CanTakeQuest(nextQuest, false)) - { - if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) - _player->AddQuestAndCheckCompletion(nextQuest, object); - - _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true); - } - } + if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) + _player->AddQuestAndCheckCompletion(nextQuest, object); - _player->PlayerTalkClass->ClearMenus(); - questgiver->AI()->OnQuestReward(_player, quest, reward); - break; + _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true); + } } - case TYPEID_GAMEOBJECT: + + _player->PlayerTalkClass->ClearMenus(); + questgiver->AI()->OnQuestReward(_player, quest, reward); + break; + } + case TYPEID_GAMEOBJECT: + { + GameObject* questGiver = object->ToGameObject(); + // Send next quest + if (Quest const* nextQuest = _player->GetNextQuest(questGiver, quest)) { - GameObject* questGiver = object->ToGameObject(); - // Send next quest - if (Quest const* nextQuest = _player->GetNextQuest(guid, quest)) + // Only send the quest to the player if the conditions are met + if (_player->CanTakeQuest(nextQuest, false)) { - // Only send the quest to the player if the conditions are met - if (_player->CanTakeQuest(nextQuest, false)) - { - if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) - _player->AddQuestAndCheckCompletion(nextQuest, object); - - _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true); - } - } + if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) + _player->AddQuestAndCheckCompletion(nextQuest, object); - _player->PlayerTalkClass->ClearMenus(); - questGiver->AI()->OnQuestReward(_player, quest, reward); - break; + _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true); + } } - default: - break; + + _player->PlayerTalkClass->ClearMenus(); + questGiver->AI()->OnQuestReward(_player, quest, reward); + break; } + default: + break; } } - else - _player->PlayerTalkClass->SendQuestGiverOfferReward(quest, guid, true); } + else + _player->PlayerTalkClass->SendQuestGiverOfferReward(quest, guid, true); } void WorldSession::HandleQuestgiverRequestRewardOpcode(WorldPacket& recvData) diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index a6317dbe9f3..8c0dd77391c 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -1586,7 +1586,7 @@ void Spell::EffectPersistentAA() } DynamicObject* dynObj = new DynamicObject(false); - if (!dynObj->CreateDynamicObject(unitCaster->GetMap()->GenerateLowGuid<HighGuid::DynamicObject>(), unitCaster, m_spellInfo->Id, *destTarget, radius, DYNAMIC_OBJECT_AREA_SPELL)) + if (!dynObj->CreateDynamicObject(unitCaster->GetMap()->GenerateLowGuid<HighGuid::DynamicObject>(), unitCaster, m_spellInfo, *destTarget, radius, DYNAMIC_OBJECT_AREA_SPELL)) { delete dynObj; return; @@ -2431,7 +2431,7 @@ void Spell::EffectAddFarsight() return; DynamicObject* dynObj = new DynamicObject(true); - if (!dynObj->CreateDynamicObject(player->GetMap()->GenerateLowGuid<HighGuid::DynamicObject>(), player, m_spellInfo->Id, *destTarget, radius, DYNAMIC_OBJECT_FARSIGHT_FOCUS)) + if (!dynObj->CreateDynamicObject(player->GetMap()->GenerateLowGuid<HighGuid::DynamicObject>(), player, m_spellInfo, *destTarget, radius, DYNAMIC_OBJECT_FARSIGHT_FOCUS)) { delete dynObj; return; diff --git a/src/server/game/Tools/CharacterDatabaseCleaner.cpp b/src/server/game/Tools/CharacterDatabaseCleaner.cpp index 85a1bb178b5..43443213743 100644 --- a/src/server/game/Tools/CharacterDatabaseCleaner.cpp +++ b/src/server/game/Tools/CharacterDatabaseCleaner.cpp @@ -16,7 +16,6 @@ */ #include "Common.h" -#include "AchievementMgr.h" #include "CharacterDatabaseCleaner.h" #include "DatabaseEnv.h" #include "DBCStores.h" @@ -108,7 +107,7 @@ void CharacterDatabaseCleaner::CheckUnique(char const* column, char const* table bool CharacterDatabaseCleaner::AchievementProgressCheck(uint32 criteria) { - return sAchievementMgr->GetAchievementCriteria(criteria) != nullptr; + return sAchievementCriteriaStore.LookupEntry(criteria) != nullptr; } void CharacterDatabaseCleaner::CleanCharacterAchievementProgress() diff --git a/src/server/scripts/Battlefield/BattlefieldWG.cpp b/src/server/scripts/Battlefield/BattlefieldWG.cpp index 529e75c6af9..9aa93d76ca1 100644 --- a/src/server/scripts/Battlefield/BattlefieldWG.cpp +++ b/src/server/scripts/Battlefield/BattlefieldWG.cpp @@ -24,6 +24,7 @@ #include "BattlefieldMgr.h" #include "Battleground.h" #include "CreatureTextMgr.h" +#include "DBCStores.h" #include "GameObject.h" #include "GameTime.h" #include "Log.h" @@ -762,7 +763,7 @@ void BattlefieldWG::OnBattleEnd(bool endByTimer) // ******************************************************* void BattlefieldWG::DoCompleteOrIncrementAchievement(uint32 achievement, Player* player, uint8 /*incrementNumber*/) { - AchievementEntry const* achievementEntry = sAchievementMgr->GetAchievement(achievement); + AchievementEntry const* achievementEntry = sAchievementStore.LookupEntry(achievement); if (!achievementEntry) return; diff --git a/src/server/scripts/Commands/cs_disable.cpp b/src/server/scripts/Commands/cs_disable.cpp index 25a2b4463c8..6345c118415 100644 --- a/src/server/scripts/Commands/cs_disable.cpp +++ b/src/server/scripts/Commands/cs_disable.cpp @@ -23,8 +23,8 @@ Category: commandscripts EndScriptData */ #include "ScriptMgr.h" -#include "AchievementMgr.h" #include "Chat.h" +#include "DBCStores.h" #include "DatabaseEnv.h" #include "DisableMgr.h" #include "Language.h" @@ -129,7 +129,7 @@ public: } case DISABLE_TYPE_ACHIEVEMENT_CRITERIA: { - if (!sAchievementMgr->GetAchievementCriteria(entry)) + if (!sAchievementCriteriaStore.LookupEntry(entry)) { handler->PSendSysMessage(LANG_COMMAND_NO_ACHIEVEMENT_CRITERIA_FOUND); handler->SetSentErrorMessage(true); diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 158be69baa2..8d89ec6ed40 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -554,12 +554,13 @@ public: } else { + uint32 moneyToAddMsg = moneyToAdd * -1; if (newmoney > static_cast<int32>(MAX_MONEY_AMOUNT)) newmoney = MAX_MONEY_AMOUNT; - handler->PSendSysMessage(LANG_YOU_TAKE_MONEY, abs(moneyToAdd), handler->GetNameLink(target).c_str()); + handler->PSendSysMessage(LANG_YOU_TAKE_MONEY, moneyToAddMsg, handler->GetNameLink(target).c_str()); if (handler->needReportToTarget(target)) - ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_MONEY_TAKEN, handler->GetNameLink().c_str(), abs(moneyToAdd)); + ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_MONEY_TAKEN, handler->GetNameLink().c_str(), moneyToAddMsg); target->SetMoney(newmoney); } } |