aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-03-14 19:09:15 +0100
committerShauren <shauren.trinity@gmail.com>2025-03-14 19:09:15 +0100
commit4d0903c61ccce5ed44c87483f0cdbca7ec7ddf6b (patch)
tree659f891a464031c6391e862ea856bec36691fce6
parente79228533e0856f34e1a6d2de88497cff3d164f3 (diff)
Core/Misc: Reduce differences between branches
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp67
-rw-r--r--src/server/game/Achievements/AchievementMgr.h4
-rw-r--r--src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp4
-rw-r--r--src/server/game/Chat/HyperlinkTags.cpp4
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp7
-rw-r--r--src/server/game/Conditions/DisableMgr.cpp2
-rw-r--r--src/server/game/Entities/DynamicObject/DynamicObject.cpp14
-rw-r--r--src/server/game/Entities/DynamicObject/DynamicObject.h2
-rw-r--r--src/server/game/Entities/Player/Player.cpp43
-rw-r--r--src/server/game/Entities/Player/Player.h2
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp6
-rw-r--r--src/server/game/Guilds/Guild.h1
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp100
-rw-r--r--src/server/game/Spells/SpellEffects.cpp4
-rw-r--r--src/server/game/Tools/CharacterDatabaseCleaner.cpp3
-rw-r--r--src/server/scripts/Battlefield/BattlefieldWG.cpp3
-rw-r--r--src/server/scripts/Commands/cs_disable.cpp4
-rw-r--r--src/server/scripts/Commands/cs_modify.cpp5
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);
}
}