aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2020-12-22 23:48:02 +0100
committerShauren <shauren.trinity@gmail.com>2020-12-23 00:04:43 +0100
commitbff8f2ff4ebc4144a2c1c31a65b78a1f0ed3f973 (patch)
tree6db38e500781d00a525e1f57c09f64665c95d98c /src
parent01af07c20bb1122408fd229b6149a35f4c1a8b13 (diff)
Core/Players: Introduce configurable allied race starting level and fix default level selection for pandaren death knights
Diffstat (limited to 'src')
-rw-r--r--src/server/game/DataStores/DB2Structure.h2
-rw-r--r--src/server/game/DataStores/DBCEnums.h13
-rw-r--r--src/server/game/Entities/Player/Player.cpp63
-rw-r--r--src/server/game/Entities/Player/Player.h1
-rw-r--r--src/server/game/Quests/QuestDef.h2
-rw-r--r--src/server/game/World/World.cpp28
-rw-r--r--src/server/game/World/World.h1
-rw-r--r--src/server/scripts/Commands/cs_reset.cpp4
-rw-r--r--src/server/worldserver/worldserver.conf.dist12
9 files changed, 82 insertions, 44 deletions
diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h
index 8cb0995e121..d533ef062c4 100644
--- a/src/server/game/DataStores/DB2Structure.h
+++ b/src/server/game/DataStores/DB2Structure.h
@@ -721,6 +721,8 @@ struct ChrRacesEntry
int8 FemaleTextureFallbackRaceID;
int8 FemaleTextureFallbackSex;
int8 UnalteredVisualCustomizationRaceID;
+
+ EnumFlag<ChrRacesFlag> GetFlags() const { return static_cast<ChrRacesFlag>(Flags); }
};
#define MAX_MASTERY_SPELLS 2
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index f9b79bbe2b1..f0f293649b4 100644
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -201,6 +201,13 @@ enum BattlemasterListFlags
BATTLEMASTER_LIST_FLAG_FACTIONAL = 0x40
};
+enum class ChrRacesFlag : int32
+{
+ AlliedRace = 0x80000
+};
+
+DEFINE_ENUM_FLAG(ChrRacesFlag);
+
enum ChrSpecializationFlag
{
CHR_SPECIALIZATION_FLAG_CASTER = 0x01,
@@ -851,14 +858,14 @@ enum class ChrCustomizationOptionFlag : int32
Disabled = 0x4,
};
-DEFINE_ENUM_FLAG(ChrCustomizationOptionFlag)
+DEFINE_ENUM_FLAG(ChrCustomizationOptionFlag);
enum class ChrCustomizationReqFlag : int32
{
HasRequirements = 0x1
};
-DEFINE_ENUM_FLAG(ChrCustomizationReqFlag)
+DEFINE_ENUM_FLAG(ChrCustomizationReqFlag);
enum Curves
{
@@ -1431,7 +1438,7 @@ enum class UiMapFlag : int32
ForceOnNavbar = 0x00008000
};
-DEFINE_ENUM_FLAG(UiMapFlag)
+DEFINE_ENUM_FLAG(UiMapFlag);
enum UiMapSystem : int8
{
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 45f7a5829f7..858aa6dceab 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -486,34 +486,7 @@ bool Player::Create(ObjectGuid::LowType guidlow, WorldPackets::Character::Charac
SetInventorySlotCount(INVENTORY_DEFAULT_SIZE);
// set starting level
- uint32 start_level = sWorld->getIntConfig(CONFIG_START_PLAYER_LEVEL);
- if (getClass() == CLASS_DEATH_KNIGHT)
- start_level = sWorld->getIntConfig(CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL);
- else if (getClass() == CLASS_DEMON_HUNTER)
- start_level = sWorld->getIntConfig(CONFIG_START_DEMON_HUNTER_PLAYER_LEVEL);
-
- if (createInfo->TemplateSet)
- {
- if (m_session->HasPermission(rbac::RBAC_PERM_USE_CHARACTER_TEMPLATES))
- {
- if (CharacterTemplate const* charTemplate = sCharacterTemplateDataStore->GetCharacterTemplate(*createInfo->TemplateSet))
- {
- if (charTemplate->Level > start_level)
- start_level = charTemplate->Level;
- }
- }
- else
- TC_LOG_WARN("cheat", "Account: %u (IP: %s) tried to use a character template without given permission. Possible cheating attempt.", m_session->GetAccountId(), m_session->GetRemoteAddress().c_str());
- }
-
- if (m_session->HasPermission(rbac::RBAC_PERM_USE_START_GM_LEVEL))
- {
- uint32 gm_level = sWorld->getIntConfig(CONFIG_START_GM_LEVEL);
- if (gm_level > start_level)
- start_level = gm_level;
- }
-
- SetLevel(start_level);
+ SetLevel(GetStartLevel(createInfo->Race, createInfo->Class, createInfo->TemplateSet));
InitRunes();
@@ -23791,6 +23764,40 @@ WorldLocation Player::GetStartPosition() const
return WorldLocation(mapId, info->positionX, info->positionY, info->positionZ, 0);
}
+uint8 Player::GetStartLevel(uint8 race, uint8 playerClass, Optional<int32> characterTemplateId) const
+{
+ uint8 startLevel = sWorld->getIntConfig(CONFIG_START_PLAYER_LEVEL);
+ if (sChrRacesStore.AssertEntry(race)->GetFlags().HasFlag(ChrRacesFlag::AlliedRace))
+ startLevel = sWorld->getIntConfig(CONFIG_START_ALLIED_RACE_LEVEL);
+
+ if (playerClass == CLASS_DEATH_KNIGHT)
+ {
+ if (race == RACE_PANDAREN_ALLIANCE || race == RACE_PANDAREN_HORDE)
+ startLevel = std::max<uint8>(sWorld->getIntConfig(CONFIG_START_ALLIED_RACE_LEVEL), startLevel);
+ else
+ startLevel = std::max<uint8>(sWorld->getIntConfig(CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL), startLevel);
+ }
+ else if (playerClass == CLASS_DEMON_HUNTER)
+ startLevel = std::max<uint8>(sWorld->getIntConfig(CONFIG_START_DEMON_HUNTER_PLAYER_LEVEL), startLevel);
+
+ if (characterTemplateId)
+ {
+ if (m_session->HasPermission(rbac::RBAC_PERM_USE_CHARACTER_TEMPLATES))
+ {
+ if (CharacterTemplate const* charTemplate = sCharacterTemplateDataStore->GetCharacterTemplate(*characterTemplateId))
+ startLevel = std::max(charTemplate->Level, startLevel);
+ }
+ else
+ TC_LOG_WARN("cheat", "Account: %u (IP: %s) tried to use a character template without given permission. Possible cheating attempt.",
+ m_session->GetAccountId(), m_session->GetRemoteAddress().c_str());
+ }
+
+ if (m_session->HasPermission(rbac::RBAC_PERM_USE_START_GM_LEVEL))
+ startLevel = std::max<uint8>(sWorld->getIntConfig(CONFIG_START_GM_LEVEL), startLevel);
+
+ return startLevel;
+}
+
bool Player::HaveAtClient(Object const* u) const
{
return u == this || m_clientGUIDs.find(u->GetGUID()) != m_clientGUIDs.end();
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 7b12713ae5a..647ca6f73cf 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2218,6 +2218,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
float m_homebindZ;
WorldLocation GetStartPosition() const;
+ uint8 GetStartLevel(uint8 race, uint8 playerClass, Optional<int32> characterTemplateId) const;
// currently visible objects at player client
GuidUnorderedSet m_clientGUIDs;
diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h
index 2235a3d19af..945a874f4b4 100644
--- a/src/server/game/Quests/QuestDef.h
+++ b/src/server/game/Quests/QuestDef.h
@@ -144,7 +144,7 @@ enum class QuestGiverStatus : uint32
ScriptedDefault = 0x80000000
};
-DEFINE_ENUM_FLAG(QuestGiverStatus)
+DEFINE_ENUM_FLAG(QuestGiverStatus);
enum QuestFlags : uint32
{
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index c5c47857409..2f820271d60 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -931,12 +931,12 @@ void World::LoadConfigSettings(bool reload)
m_int_configs[CONFIG_START_PLAYER_LEVEL] = m_int_configs[CONFIG_MAX_PLAYER_LEVEL];
}
- m_int_configs[CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL] = sConfigMgr->GetIntDefault("StartDeathKnightPlayerLevel", 55);
+ m_int_configs[CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL] = sConfigMgr->GetIntDefault("StartDeathKnightPlayerLevel", 8);
if (m_int_configs[CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL] < 1)
{
- TC_LOG_ERROR("server.loading", "StartDeathKnightPlayerLevel (%i) must be in range 1..MaxPlayerLevel(%u). Set to 55.",
+ TC_LOG_ERROR("server.loading", "StartDeathKnightPlayerLevel (%i) must be in range 1..MaxPlayerLevel(%u). Set to 1.",
m_int_configs[CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL], m_int_configs[CONFIG_MAX_PLAYER_LEVEL]);
- m_int_configs[CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL] = 55;
+ m_int_configs[CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL] = 1;
}
else if (m_int_configs[CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL] > m_int_configs[CONFIG_MAX_PLAYER_LEVEL])
{
@@ -945,12 +945,12 @@ void World::LoadConfigSettings(bool reload)
m_int_configs[CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL] = m_int_configs[CONFIG_MAX_PLAYER_LEVEL];
}
- m_int_configs[CONFIG_START_DEMON_HUNTER_PLAYER_LEVEL] = sConfigMgr->GetIntDefault("StartDemonHunterPlayerLevel", 98);
- if (m_int_configs[CONFIG_START_DEMON_HUNTER_PLAYER_LEVEL] < 98)
+ m_int_configs[CONFIG_START_DEMON_HUNTER_PLAYER_LEVEL] = sConfigMgr->GetIntDefault("StartDemonHunterPlayerLevel", 8);
+ if (m_int_configs[CONFIG_START_DEMON_HUNTER_PLAYER_LEVEL] < 1)
{
- TC_LOG_ERROR("server.loading", "StartDemonHunterPlayerLevel (%i) must be in range 98..MaxPlayerLevel(%u). Set to 98.",
+ TC_LOG_ERROR("server.loading", "StartDemonHunterPlayerLevel (%i) must be in range 1..MaxPlayerLevel(%u). Set to 1.",
m_int_configs[CONFIG_START_DEMON_HUNTER_PLAYER_LEVEL], m_int_configs[CONFIG_MAX_PLAYER_LEVEL]);
- m_int_configs[CONFIG_START_DEMON_HUNTER_PLAYER_LEVEL] = 98;
+ m_int_configs[CONFIG_START_DEMON_HUNTER_PLAYER_LEVEL] = 1;
}
else if (m_int_configs[CONFIG_START_DEMON_HUNTER_PLAYER_LEVEL] > m_int_configs[CONFIG_MAX_PLAYER_LEVEL])
{
@@ -959,6 +959,20 @@ void World::LoadConfigSettings(bool reload)
m_int_configs[CONFIG_START_DEMON_HUNTER_PLAYER_LEVEL] = m_int_configs[CONFIG_MAX_PLAYER_LEVEL];
}
+ m_int_configs[CONFIG_START_ALLIED_RACE_LEVEL] = sConfigMgr->GetIntDefault("StartAlliedRacePlayerLevel", 10);
+ if (m_int_configs[CONFIG_START_ALLIED_RACE_LEVEL] < 1)
+ {
+ TC_LOG_ERROR("server.loading", "StartDemonHunterPlayerLevel (%i) must be in range 1..MaxPlayerLevel(%u). Set to 1.",
+ m_int_configs[CONFIG_START_ALLIED_RACE_LEVEL], m_int_configs[CONFIG_MAX_PLAYER_LEVEL]);
+ m_int_configs[CONFIG_START_ALLIED_RACE_LEVEL] = 1;
+ }
+ else if (m_int_configs[CONFIG_START_ALLIED_RACE_LEVEL] > m_int_configs[CONFIG_MAX_PLAYER_LEVEL])
+ {
+ TC_LOG_ERROR("server.loading", "StartDemonHunterPlayerLevel (%i) must be in range 1..MaxPlayerLevel(%u). Set to %u.",
+ m_int_configs[CONFIG_START_ALLIED_RACE_LEVEL], m_int_configs[CONFIG_MAX_PLAYER_LEVEL], m_int_configs[CONFIG_MAX_PLAYER_LEVEL]);
+ m_int_configs[CONFIG_START_ALLIED_RACE_LEVEL] = m_int_configs[CONFIG_MAX_PLAYER_LEVEL];
+ }
+
m_int_configs[CONFIG_START_PLAYER_MONEY] = sConfigMgr->GetIntDefault("StartPlayerMoney", 0);
if (int32(m_int_configs[CONFIG_START_PLAYER_MONEY]) < 0)
{
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index 693ae1f39d3..3160ff92595 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -251,6 +251,7 @@ enum WorldIntConfigs
CONFIG_START_PLAYER_LEVEL,
CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL,
CONFIG_START_DEMON_HUNTER_PLAYER_LEVEL,
+ CONFIG_START_ALLIED_RACE_LEVEL,
CONFIG_START_PLAYER_MONEY,
CONFIG_CURRENCY_START_APEXIS_CRYSTALS,
CONFIG_CURRENCY_MAX_APEXIS_CRYSTALS,
diff --git a/src/server/scripts/Commands/cs_reset.cpp b/src/server/scripts/Commands/cs_reset.cpp
index 283c4e598f2..42498ae5929 100644
--- a/src/server/scripts/Commands/cs_reset.cpp
+++ b/src/server/scripts/Commands/cs_reset.cpp
@@ -132,9 +132,7 @@ public:
uint8 oldLevel = target->getLevel();
// set starting level
- uint32 startLevel = target->getClass() != CLASS_DEATH_KNIGHT
- ? sWorld->getIntConfig(CONFIG_START_PLAYER_LEVEL)
- : sWorld->getIntConfig(CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL);
+ uint8 startLevel = target->GetStartLevel(target->getRace(), target->getClass(), {});
target->_ApplyAllLevelScaleItemMods(false);
target->SetLevel(startLevel);
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index 442b05e571d..c4a07abb5fd 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -892,9 +892,9 @@ StartPlayerLevel = 1
# StartDeathKnightPlayerLevel
# Description: Starting level for death knights after creation.
# Range: 1-MaxPlayerLevel
-# Default: 10
+# Default: 8
-StartDeathKnightPlayerLevel = 10
+StartDeathKnightPlayerLevel = 8
#
# StartDemonHunterPlayerLevel
@@ -905,6 +905,14 @@ StartDeathKnightPlayerLevel = 10
StartDemonHunterPlayerLevel = 8
#
+# StartAlliedRacePlayerLevel
+# Description: Staring level for allied races after creation.
+# Range: 1-MaxPlayerLevel
+# Default: 10
+
+StartAlliedRacePlayerLevel = 10
+
+#
# StartPlayerMoney
# Description: Amount of money (in Copper) that a character has after creation.
# Default: 0