aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp8
-rw-r--r--src/server/game/Miscellaneous/Formulas.h7
-rw-r--r--src/server/game/Quests/QuestDef.cpp27
-rw-r--r--src/server/game/Quests/QuestDef.h3
-rw-r--r--src/server/game/World/World.cpp22
-rw-r--r--src/server/game/World/World.h3
-rw-r--r--src/server/worldserver/worldserver.conf.dist28
7 files changed, 88 insertions, 10 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index d5e06900761..4191dba7c81 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -6446,6 +6446,12 @@ void Player::CheckAreaExploreAndOutdoor()
XP = uint32(sObjectMgr->GetBaseXP(areaEntry->area_level)*sWorld->getRate(RATE_XP_EXPLORE));
}
+ if (sWorld->getIntConfig(CONFIG_MIN_DISCOVERED_SCALED_XP_RATIO))
+ {
+ uint32 minScaledXP = uint32(sObjectMgr->GetBaseXP(areaEntry->area_level)*sWorld->getRate(RATE_XP_EXPLORE)) * sWorld->getIntConfig(CONFIG_MIN_DISCOVERED_SCALED_XP_RATIO) / 100;
+ XP = std::max(minScaledXP, XP);
+ }
+
GiveXP(XP, nullptr);
SendExplorationExperience(areaId, XP);
}
@@ -23609,7 +23615,7 @@ bool Player::isHonorOrXPTarget(Unit* victim) const
uint8 k_grey = Trinity::XP::GetGrayLevel(getLevel());
// Victim level less gray level
- if (v_level <= k_grey)
+ if (v_level <= k_grey && !sWorld->getIntConfig(CONFIG_MIN_CREATURE_SCALED_XP_RATIO))
return false;
if (Creature const* creature = victim->ToCreature())
diff --git a/src/server/game/Miscellaneous/Formulas.h b/src/server/game/Miscellaneous/Formulas.h
index 81e906ed47d..7931860868e 100644
--- a/src/server/game/Miscellaneous/Formulas.h
+++ b/src/server/game/Miscellaneous/Formulas.h
@@ -158,6 +158,13 @@ namespace Trinity
baseGain = 0;
}
+ if (sWorld->getIntConfig(CONFIG_MIN_CREATURE_SCALED_XP_RATIO))
+ {
+ // Use mob level instead of player level to avoid overscaling on gain in a min is enforced
+ uint32 baseGainMin = (mob_level * 5 + nBaseExp) * sWorld->getIntConfig(CONFIG_MIN_CREATURE_SCALED_XP_RATIO) / 100;
+ baseGain = std::max(baseGainMin, baseGain);
+ }
+
sScriptMgr->OnBaseGainCalculation(baseGain, pl_level, mob_level, content);
return baseGain;
}
diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp
index 55100ca7396..0c106f69b4a 100644
--- a/src/server/game/Quests/QuestDef.cpp
+++ b/src/server/game/Quests/QuestDef.cpp
@@ -213,15 +213,12 @@ uint32 Quest::XPValue(Player* player) const
else if (diffFactor > 10)
diffFactor = 10;
- uint32 xp = diffFactor * xpentry->Exp[_rewardXPDifficulty] / 10;
- if (xp <= 100)
- xp = 5 * ((xp + 2) / 5);
- else if (xp <= 500)
- xp = 10 * ((xp + 5) / 10);
- else if (xp <= 1000)
- xp = 25 * ((xp + 12) / 25);
- else
- xp = 50 * ((xp + 25) / 50);
+ uint32 xp = RoundXPValue(diffFactor * xpentry->Exp[_rewardXPDifficulty] / 10);
+ if (sWorld->getIntConfig(CONFIG_MIN_QUEST_SCALED_XP_RATIO))
+ {
+ uint32 minScaledXP = RoundXPValue(xpentry->Exp[_rewardXPDifficulty]) * sWorld->getIntConfig(CONFIG_MIN_QUEST_SCALED_XP_RATIO) / 100;
+ xp = std::max(minScaledXP, xp);
+ }
return xp;
}
@@ -447,3 +444,15 @@ void Quest::AddQuestLevelToTitle(std::string &title, int32 level)
questTitlePretty << "[" << level << "] " << title;
title = questTitlePretty.str();
}
+
+uint32 Quest::RoundXPValue(uint32 xp)
+{
+ if (xp <= 100)
+ return 5 * ((xp + 2) / 5);
+ else if (xp <= 500)
+ return 10 * ((xp + 5) / 10);
+ else if (xp <= 1000)
+ return 25 * ((xp + 12) / 25);
+ else
+ return 50 * ((xp + 25) / 50);
+}
diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h
index d2a5e0d5d84..75c5abd7911 100644
--- a/src/server/game/Quests/QuestDef.h
+++ b/src/server/game/Quests/QuestDef.h
@@ -384,6 +384,9 @@ class TC_GAME_API Quest
uint32 _startItemCount = 0;
uint32 _rewardMailSenderEntry = 0;
uint32 _specialFlags = 0; // custom flags, not sniffed/WDB
+
+ // Helpers
+ static uint32 RoundXPValue(uint32 xp);
};
struct QuestStatusData
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 7e34a4ae91f..03081a113de 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -728,6 +728,28 @@ void World::LoadConfigSettings(bool reload)
m_float_configs[CONFIG_GROUP_XP_DISTANCE] = sConfigMgr->GetFloatDefault("MaxGroupXPDistance", 74.0f);
m_float_configs[CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE] = sConfigMgr->GetFloatDefault("MaxRecruitAFriendBonusDistance", 100.0f);
+ m_int_configs[CONFIG_MIN_QUEST_SCALED_XP_RATIO] = sConfigMgr->GetIntDefault("MinQuestScaledXPRatio", 0);
+ if (m_int_configs[CONFIG_MIN_QUEST_SCALED_XP_RATIO] > 100)
+ {
+ TC_LOG_ERROR("server.loading", "MinQuestScaledXPRatio (%i) must be in range 0..100. Set to 0.", m_int_configs[CONFIG_MIN_QUEST_SCALED_XP_RATIO]);
+ m_int_configs[CONFIG_MIN_QUEST_SCALED_XP_RATIO] = 0;
+ }
+
+ m_int_configs[CONFIG_MIN_CREATURE_SCALED_XP_RATIO] = sConfigMgr->GetIntDefault("MinCreatureScaledXPRatio", 0);
+ if (m_int_configs[CONFIG_MIN_CREATURE_SCALED_XP_RATIO] > 100)
+ {
+ TC_LOG_ERROR("server.loading", "MinCreatureScaledXPRatio (%i) must be in range 0..100. Set to 0.", m_int_configs[CONFIG_MIN_CREATURE_SCALED_XP_RATIO]);
+ m_int_configs[CONFIG_MIN_CREATURE_SCALED_XP_RATIO] = 0;
+ }
+
+ m_int_configs[CONFIG_MIN_DISCOVERED_SCALED_XP_RATIO] = sConfigMgr->GetIntDefault("MinDiscoveredScaledXPRatio", 0);
+ if (m_int_configs[CONFIG_MIN_DISCOVERED_SCALED_XP_RATIO] > 100)
+ {
+ TC_LOG_ERROR("server.loading", "MinDiscoveredScaledXPRatio (%i) must be in range 0..100. Set to 0.", m_int_configs[CONFIG_MIN_DISCOVERED_SCALED_XP_RATIO]);
+ m_int_configs[CONFIG_MIN_DISCOVERED_SCALED_XP_RATIO] = 0;
+ }
+
+ /// @todo Add MonsterSight (with meaning) in worldserver.conf or put them as define
m_float_configs[CONFIG_SIGHT_MONSTER] = sConfigMgr->GetFloatDefault("MonsterSight", 50.0f);
if (reload)
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index dc75a32d43d..8d06620641b 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -250,6 +250,9 @@ enum WorldIntConfigs
CONFIG_DAILY_QUEST_RESET_TIME_HOUR,
CONFIG_MAX_PRIMARY_TRADE_SKILL,
CONFIG_MIN_PETITION_SIGNS,
+ CONFIG_MIN_QUEST_SCALED_XP_RATIO,
+ CONFIG_MIN_CREATURE_SCALED_XP_RATIO,
+ CONFIG_MIN_DISCOVERED_SCALED_XP_RATIO,
CONFIG_GM_LOGIN_STATE,
CONFIG_GM_VISIBLE_STATE,
CONFIG_GM_ACCEPT_TICKETS,
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index 482e9460047..78d18651724 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -1105,6 +1105,34 @@ MaxGroupXPDistance = 74
MaxRecruitAFriendBonusDistance = 100
#
+# MinQuestScaledXPRatio
+# Description: Min ratio of experience that a quest can grant when player level scaling is factored.
+# Example: 50 (No less than 50% experience granted from a lower leveled quests completion)
+# 100 (Quests always grant full experience upon completion)
+# Default: 0 - (Quests too low may grant no experience)
+
+MinQuestScaledXPRatio = 0
+
+#
+# MinCreatureScaledXPRatio
+# Description: Min ratio of experience that a creature kill can grant when player level scaling is factored. This
+# will also allow spell procs to trigger, such as Drain Soul, if > 0 and exp is grantable.
+# Example: 50 (No less than 50% experience granted from a lower leveled creature kill)
+# 100 (Creature kills always grant full experience upon kill)
+# Default: 0 - (Creatures too low may grant no experience)
+
+MinCreatureScaledXPRatio = 0
+
+#
+# MinDiscoveredScaledXPRatio
+# Description: Min ratio of experience that an area discovery event will grant when player level scaling is factored.
+# Example: 50 (No less than 50% experience granted from discovering a new section of map)
+# 100 (Map exploration always grant full experience upon discovery)
+# Default: 0 - (No experience granted when discovered area is too low level)
+
+MinDiscoveredScaledXPRatio = 0
+
+#
# MailDeliveryDelay
# Description: Time (in seconds) mail delivery is delayed when sending items.
# Default: 3600 - (1 hour)