diff --git a/src/server/apps/worldserver/worldserver.conf.dist b/src/server/apps/worldserver/worldserver.conf.dist index 79b496ff0..9034da67a 100644 --- a/src/server/apps/worldserver/worldserver.conf.dist +++ b/src/server/apps/worldserver/worldserver.conf.dist @@ -1765,6 +1765,16 @@ CleanCharacterDB = 0 PersistentCharacterCleanFlags = 0 +# +# ValidateSkillLearnedBySpells +# Description: If enabled, players will lose spells that are invalid for their race/class. +# Default: 1 - (Enabled, enforce valid spells) +# 0 - (Disabled, allow invalid spells) +# Disabling this and then having your character learn spells which require DBC edits can result in the character not being saved in the database +# Disable AT YOUR OWN RISK + +ValidateSkillLearnedBySpells = 1 + # ################################################################################################### diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 7173ad844..5fb5f85be 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -3103,6 +3103,9 @@ bool Player::addSpell(uint32 spellId, uint8 addSpecMask, bool updateActive, bool bool Player::CheckSkillLearnedBySpell(uint32 spellId) { + if (!sWorld->getBoolConfig(CONFIG_VALIDATE_SKILL_LEARNED_BY_SPELLS)) + return true; + SkillLineAbilityMapBounds skill_bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellId); uint32 errorSkill = 0; for (SkillLineAbilityMap::const_iterator sla = skill_bounds.first; sla != skill_bounds.second; ++sla) diff --git a/src/server/game/World/WorldConfig.cpp b/src/server/game/World/WorldConfig.cpp index 19a55465e..7a0b1db40 100644 --- a/src/server/game/World/WorldConfig.cpp +++ b/src/server/game/World/WorldConfig.cpp @@ -160,6 +160,7 @@ void WorldConfig::BuildConfigCache() SetConfigValue(CONFIG_INTERVAL_SAVE, "PlayerSaveInterval", 900000); SetConfigValue(CONFIG_INTERVAL_DISCONNECT_TOLERANCE, "DisconnectToleranceInterval", 0); SetConfigValue(CONFIG_STATS_SAVE_ONLY_ON_LOGOUT, "PlayerSave.Stats.SaveOnlyOnLogout", true); + SetConfigValue(CONFIG_VALIDATE_SKILL_LEARNED_BY_SPELLS, "ValidateSkillLearnedBySpells", true); SetConfigValue(CONFIG_MIN_LEVEL_STAT_SAVE, "PlayerSave.Stats.MinLevel", 0, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value < MAX_LEVEL; }, "< MAX_LEVEL"); diff --git a/src/server/game/World/WorldConfig.h b/src/server/game/World/WorldConfig.h index b874ebc75..3776fcac9 100644 --- a/src/server/game/World/WorldConfig.h +++ b/src/server/game/World/WorldConfig.h @@ -474,6 +474,7 @@ enum ServerConfigs RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE, RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER, CONFIG_NEW_CHAR_STRING, + CONFIG_VALIDATE_SKILL_LEARNED_BY_SPELLS, MAX_NUM_SERVER_CONFIGS };