aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp24
-rw-r--r--src/server/game/Entities/Player/Player.h2
-rw-r--r--src/server/game/Entities/Player/RestMgr.cpp24
-rw-r--r--src/server/game/Entities/Player/RestMgr.h10
-rw-r--r--src/server/game/Quests/QuestDef.cpp15
-rw-r--r--src/server/game/Quests/QuestDef.h1
-rw-r--r--src/server/game/Spells/Spell.h2
7 files changed, 49 insertions, 29 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index a9089bc5dbb..e4b933084a2 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -491,8 +491,8 @@ bool Player::Create(ObjectGuid::LowType guidlow, WorldPackets::Character::Charac
SetWatchedFactionIndex(-1);
SetCustomizations(Trinity::Containers::MakeIteratorPair(createInfo->Customizations.begin(), createInfo->Customizations.end()));
- SetRestState(REST_TYPE_XP, (GetSession()->IsARecruiter() || GetSession()->GetRecruiterId() != 0) ? REST_STATE_RAF_LINKED : REST_STATE_NOT_RAF_LINKED);
- SetRestState(REST_TYPE_HONOR, REST_STATE_NOT_RAF_LINKED);
+ SetRestState(REST_TYPE_XP, (GetSession()->IsARecruiter() || GetSession()->GetRecruiterId() != 0) ? REST_STATE_RAF_LINKED : REST_STATE_NORMAL);
+ SetRestState(REST_TYPE_HONOR, REST_STATE_NORMAL);
SetNativeGender(Gender(createInfo->Sex));
SetInventorySlotCount(INVENTORY_DEFAULT_SIZE);
@@ -7999,7 +7999,7 @@ void Player::ApplyItemObtainSpells(Item* item, bool apply)
if (apply)
{
if (!HasAura(spellId))
- CastSpell(this, spellId, item);
+ CastSpell(this, spellId, CastSpellExtraArgs().SetCastItem(item));
}
else
RemoveAurasDueToSpell(spellId);
@@ -14082,11 +14082,16 @@ uint32 Player::GetDefaultGossipMenuForSource(WorldObject* source)
int32 Player::GetQuestMinLevel(Quest const* quest) const
{
- if (Optional<ContentTuningLevels> questLevels = sDB2Manager.GetContentTuningData(quest->GetContentTuningId(), m_playerData->CtrOptions->ContentTuningConditionMask))
+ return GetQuestMinLevel(quest->GetContentTuningId());
+}
+
+int32 Player::GetQuestMinLevel(uint32 contentTuningId) const
+{
+ if (Optional<ContentTuningLevels> questLevels = sDB2Manager.GetContentTuningData(contentTuningId, m_playerData->CtrOptions->ContentTuningConditionMask))
{
ChrRacesEntry const* race = sChrRacesStore.AssertEntry(GetRace());
FactionTemplateEntry const* raceFaction = sFactionTemplateStore.AssertEntry(race->FactionID);
- int32 questFactionGroup = sContentTuningStore.AssertEntry(quest->GetContentTuningId())->GetScalingFactionGroup();
+ int32 questFactionGroup = sContentTuningStore.AssertEntry(contentTuningId)->GetScalingFactionGroup();
if (questFactionGroup && raceFaction->FactionGroup != questFactionGroup)
return questLevels->MaxLevel;
@@ -14101,9 +14106,14 @@ int32 Player::GetQuestLevel(Quest const* quest) const
if (!quest)
return 0;
- if (Optional<ContentTuningLevels> questLevels = sDB2Manager.GetContentTuningData(quest->GetContentTuningId(), m_playerData->CtrOptions->ContentTuningConditionMask))
+ return GetQuestLevel(quest->GetContentTuningId());
+}
+
+int32 Player::GetQuestLevel(uint32 contentTuningId) const
+{
+ if (Optional<ContentTuningLevels> questLevels = sDB2Manager.GetContentTuningData(contentTuningId, m_playerData->CtrOptions->ContentTuningConditionMask))
{
- int32 minLevel = GetQuestMinLevel(quest);
+ int32 minLevel = GetQuestMinLevel(contentTuningId);
int32 maxLevel = questLevels->MaxLevel;
int32 level = GetLevel();
if (level >= minLevel)
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index f2047aac692..acbbc17c552 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1552,7 +1552,9 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
/*********************************************************/
int32 GetQuestMinLevel(Quest const* quest) const;
+ int32 GetQuestMinLevel(uint32 contentTuningId) const;
int32 GetQuestLevel(Quest const* quest) const;
+ int32 GetQuestLevel(uint32 contentTuningId) const;
void PrepareQuestMenu(ObjectGuid guid);
void SendPreparedQuest(WorldObject* source);
bool IsActiveQuest(uint32 quest_id) const;
diff --git a/src/server/game/Entities/Player/RestMgr.cpp b/src/server/game/Entities/Player/RestMgr.cpp
index 2eb0243be28..d59c5b6e3ce 100644
--- a/src/server/game/Entities/Player/RestMgr.cpp
+++ b/src/server/game/Entities/Player/RestMgr.cpp
@@ -63,25 +63,23 @@ void RestMgr::SetRestBonus(RestTypes restType, float restBonus)
if (restBonus > rest_bonus_max)
restBonus = rest_bonus_max;
+ uint32 oldBonus = uint32(_restBonus[restType]);
_restBonus[restType] = restBonus;
- uint32 oldBonus = uint32(_restBonus[restType]);
- if (oldBonus == uint32(restBonus))
- return;
+ PlayerRestState oldRestState = static_cast<PlayerRestState>(*_player->m_activePlayerData->RestInfo[restType].StateID);
+ PlayerRestState newRestState = REST_STATE_NORMAL;
- // update data for client
if (affectedByRaF && _player->GetsRecruitAFriendBonus(true) && (_player->GetSession()->IsARecruiter() || _player->GetSession()->GetRecruiterId() != 0))
- _player->SetRestState(restType, REST_STATE_RAF_LINKED);
- else
- {
- if (_restBonus[restType] > 10)
- _player->SetRestState(restType, REST_STATE_RESTED);
- else if (_restBonus[restType] <= 1)
- _player->SetRestState(restType, REST_STATE_NOT_RAF_LINKED);
- }
+ newRestState = REST_STATE_RAF_LINKED;
+ else if (_restBonus[restType] >= 1)
+ newRestState = REST_STATE_RESTED;
+
+ if (oldBonus == uint32(restBonus) && oldRestState == newRestState)
+ return;
- // RestTickUpdate
+ // update data for client
_player->SetRestThreshold(restType, uint32(_restBonus[restType]));
+ _player->SetRestState(restType, newRestState);
}
void RestMgr::AddRestBonus(RestTypes restType, float restBonus)
diff --git a/src/server/game/Entities/Player/RestMgr.h b/src/server/game/Entities/Player/RestMgr.h
index 46079a301a4..5071e1e474c 100644
--- a/src/server/game/Entities/Player/RestMgr.h
+++ b/src/server/game/Entities/Player/RestMgr.h
@@ -40,11 +40,12 @@ enum PlayerRestInfoOffsets : uint8
MAX_REST_INFO
};
+// Exhaustion.db2 ids
enum PlayerRestState : uint8
{
- REST_STATE_RESTED = 0x01,
- REST_STATE_NOT_RAF_LINKED = 0x02,
- REST_STATE_RAF_LINKED = 0x06
+ REST_STATE_RESTED = 1,
+ REST_STATE_NORMAL = 2,
+ REST_STATE_RAF_LINKED = 6
};
enum RestFlag : uint32
@@ -75,9 +76,10 @@ public:
void Update(time_t now);
+ float CalcExtraPerSec(RestTypes restType, float bubble) const;
+
protected:
void LoadRestBonus(RestTypes restType, PlayerRestState state, float restBonus);
- float CalcExtraPerSec(RestTypes restType, float bubble) const;
private:
Player* _player;
diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp
index e402dc6c214..8d059c3340e 100644
--- a/src/server/game/Quests/QuestDef.cpp
+++ b/src/server/game/Quests/QuestDef.cpp
@@ -357,11 +357,16 @@ void Quest::LoadConditionalConditionalQuestCompletionLog(Field* fields)
uint32 Quest::XPValue(Player const* player) const
{
+ return XPValue(player, GetContentTuningId(), _rewardXPDifficulty, _rewardXPMultiplier, _expansion);
+}
+
+uint32 Quest::XPValue(Player const* player, uint32 contentTuningId, uint32 xpDifficulty, float xpMultiplier /*= 1.0f*/, int32 expansion /*= -1*/)
+{
if (player)
{
- uint32 questLevel = player->GetQuestLevel(this);
+ uint32 questLevel = player->GetQuestLevel(contentTuningId);
QuestXPEntry const* questXp = sQuestXPStore.LookupEntry(questLevel);
- if (!questXp || _rewardXPDifficulty >= 10)
+ if (!questXp || xpDifficulty >= 10)
return 0;
int32 diffFactor = 2 * (questLevel - player->GetLevel()) + 12;
@@ -370,15 +375,15 @@ uint32 Quest::XPValue(Player const* player) const
else if (diffFactor > 10)
diffFactor = 10;
- uint32 xp = diffFactor * questXp->Difficulty[_rewardXPDifficulty] * _rewardXPMultiplier / 10;
- if (player->GetLevel() >= GetMaxLevelForExpansion(CURRENT_EXPANSION - 1) && player->GetSession()->GetExpansion() == CURRENT_EXPANSION && _expansion < CURRENT_EXPANSION)
+ uint32 xp = diffFactor * questXp->Difficulty[xpDifficulty] * xpMultiplier / 10;
+ if (player->GetLevel() >= GetMaxLevelForExpansion(CURRENT_EXPANSION - 1) && player->GetSession()->GetExpansion() == CURRENT_EXPANSION && expansion >= 0 && expansion < CURRENT_EXPANSION)
xp = uint32(xp / 9.0f);
xp = RoundXPValue(xp);
if (sWorld->getIntConfig(CONFIG_MIN_QUEST_SCALED_XP_RATIO))
{
- uint32 minScaledXP = RoundXPValue(questXp->Difficulty[_rewardXPDifficulty] * _rewardXPMultiplier) * sWorld->getIntConfig(CONFIG_MIN_QUEST_SCALED_XP_RATIO) / 100;
+ uint32 minScaledXP = RoundXPValue(questXp->Difficulty[xpDifficulty] * xpMultiplier) * sWorld->getIntConfig(CONFIG_MIN_QUEST_SCALED_XP_RATIO) / 100;
xp = std::max(minScaledXP, xp);
}
diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h
index e0bbc363226..7f04ef0eb25 100644
--- a/src/server/game/Quests/QuestDef.h
+++ b/src/server/game/Quests/QuestDef.h
@@ -505,6 +505,7 @@ class TC_GAME_API Quest
void LoadConditionalConditionalQuestCompletionLog(Field* fields);
uint32 XPValue(Player const* player) const;
+ static uint32 XPValue(Player const* player, uint32 contentTuningId, uint32 xpDifficulty, float xpMultiplier = 1.0f, int32 expansion = -1);
uint32 MoneyValue(Player const* player) const;
uint32 MaxMoneyValue() const;
uint32 GetMaxMoneyReward() const;
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index 1ee8a54a5c3..0283ef0de1b 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -378,6 +378,8 @@ class TC_GAME_API Spell
void EffectAddGarrisonFollower();
void EffectActivateGarrisonBuilding();
void EffectGrantBattlePetLevel();
+ void EffectGiveExperience();
+ void EffectGiveRestedExperience();
void EffectHealBattlePetPct();
void EffectEnableBattlePets();
void EffectChangeBattlePetQuality();