diff options
author | Shauren <shauren.trinity@gmail.com> | 2020-12-22 23:48:02 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2020-12-23 00:04:43 +0100 |
commit | bff8f2ff4ebc4144a2c1c31a65b78a1f0ed3f973 (patch) | |
tree | 6db38e500781d00a525e1f57c09f64665c95d98c /src | |
parent | 01af07c20bb1122408fd229b6149a35f4c1a8b13 (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.h | 2 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCEnums.h | 13 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 63 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 1 | ||||
-rw-r--r-- | src/server/game/Quests/QuestDef.h | 2 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 28 | ||||
-rw-r--r-- | src/server/game/World/World.h | 1 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_reset.cpp | 4 | ||||
-rw-r--r-- | src/server/worldserver/worldserver.conf.dist | 12 |
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 |