diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/DataStores/DBCStores.h | 1 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCStructure.h | 8 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCfmt.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 33 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 10 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 69 |
6 files changed, 31 insertions, 92 deletions
diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h index 6a8cd69e5d7..fcb7e0ccc68 100644 --- a/src/server/game/DataStores/DBCStores.h +++ b/src/server/game/DataStores/DBCStores.h @@ -231,6 +231,7 @@ extern DBCStorage <RandomPropertiesPointsEntry> sRandomPropertiesPointsStore; extern DBCStorage <ScalingStatDistributionEntry> sScalingStatDistributionStore; extern DBCStorage <SkillLineEntry> sSkillLineStore; extern DBCStorage <SkillLineAbilityEntry> sSkillLineAbilityStore; +extern DBCStorage <SkillRaceClassInfoEntry> sSkillRaceClassInfoStore; extern DBCStorage <SkillTiersEntry> sSkillTiersStore; extern SpellEffectScallingByEffectId sSpellEffectScallingByEffectId; extern DBCStorage <SpellCastTimesEntry> sSpellCastTimesStore; diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index ce76b94035d..c26898abf21 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -1400,11 +1400,11 @@ struct SkillRaceClassInfoEntry { //uint32 ID; // 0 uint32 SkillID; // 1 - uint32 RaceMask; // 2 - uint32 ClassMask; // 3 + int32 RaceMask; // 2 + int32 ClassMask; // 3 uint32 Flags; // 4 - //uint32 Availability; // 5 - //uint32 MinLevel; // 6 + uint32 Availability; // 5 + uint32 MinLevel; // 6 uint32 SkillTierID; // 7 }; diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index fa1e460e956..338a06cb3f8 100644 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -129,7 +129,7 @@ char const RandomPropertiesPointsfmt[] = "niiiiiiiiiiiiiii"; char const ScalingStatDistributionfmt[] = "niii"; char const SkillLinefmt[] = "nisxixixx"; char const SkillLineAbilityfmt[] = "niiiiiiiiiiii"; -char const SkillRaceClassInfofmt[] = "diiiixxi"; +char const SkillRaceClassInfofmt[] = "diiiiiii"; char const SkillTiersfmt[] = "niiiiiiiiiiiiiiii"; char const SpecializationSpellsEntryfmt[] = "niiix"; char const SpellCastTimefmt[] = "nixx"; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 3d4e7ad02cb..56df1419056 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2909,7 +2909,7 @@ void Player::GiveLevel(uint8 level) packet.HealthDelta = int32(basehp) - int32(GetCreateHealth()); /// @todo find some better solution - // for (int i = 0; i < MAX_STORED_POWERS; ++i) + // for (int i = 0; i < MAX_STORED_POWERS; ++i) packet.PowerDelta[0] = int32(basemana) - int32(GetCreateMana()); packet.PowerDelta[1] = 0; packet.PowerDelta[2] = 0; @@ -2936,6 +2936,7 @@ void Player::GiveLevel(uint8 level) SetLevel(level); UpdateSkillsForLevel(); + LearnDefaultSkills(); LearnSpecializationSpells(); // save base values (bonuses already included in stored stats @@ -3048,7 +3049,6 @@ void Player::InitStatsForLevel(bool reapplyMods) SetUInt32Value(UNIT_FIELD_AURASTATE, 0); UpdateSkillsForLevel(); - LearnSpecializationSpells(); // set default cast time multiplier SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f); @@ -3645,9 +3645,9 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent if (!pSkill) continue; - ///@todo: confirm if rogues start with lockpicking skill at level 1 but only receive the spell to use it at level 16 - if ((_spell_idx->second->AquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(pSkill->ID)) || (pSkill->ID == SKILL_LOCKPICKING && _spell_idx->second->TrivialSkillLineRankHigh == 0)) - LearnDefaultSkill(pSkill->ID, 0); + if ((_spell_idx->second->AquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(pSkill->ID))) + if (SkillRaceClassInfoEntry const* rcInfo = GetSkillRaceClassInfo(pSkill->ID, getRace(), getClass())) + LearnDefaultSkill(rcInfo); } } } @@ -22675,20 +22675,20 @@ void Player::LearnDefaultSkills() PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass()); for (PlayerCreateInfoSkills::const_iterator itr = info->skills.begin(); itr != info->skills.end(); ++itr) { - uint32 skillId = itr->SkillId; - if (HasSkill(skillId)) + SkillRaceClassInfoEntry const* rcInfo = *itr; + if (HasSkill(rcInfo->SkillID)) + continue; + + if (rcInfo->MinLevel > getLevel()) continue; - LearnDefaultSkill(skillId, itr->Rank); + LearnDefaultSkill(rcInfo); } } -void Player::LearnDefaultSkill(uint32 skillId, uint16 rank) +void Player::LearnDefaultSkill(SkillRaceClassInfoEntry const* rcInfo) { - SkillRaceClassInfoEntry const* rcInfo = GetSkillRaceClassInfo(skillId, getRace(), getClass()); - if (!rcInfo) - return; - + uint16 skillId = rcInfo->SkillID; switch (GetSkillRangeType(rcInfo)) { case SKILL_RANGE_LANGUAGE: @@ -22715,8 +22715,9 @@ void Player::LearnDefaultSkill(uint32 skillId, uint16 rank) break; case SKILL_RANGE_RANK: { - if (!rank) - break; + uint16 rank = 1; + if (getClass() == CLASS_DEATH_KNIGHT && skillId == SKILL_FIRST_AID) + rank = 4; SkillTiersEntry const* tier = sSkillTiersStore.LookupEntry(rcInfo->SkillTierID); uint16 maxValue = tier->Value[std::max<int32>(rank - 1, 0)]; @@ -22724,7 +22725,7 @@ void Player::LearnDefaultSkill(uint32 skillId, uint16 rank) if (rcInfo->Flags & SKILL_FLAG_ALWAYS_MAX_VALUE) skillValue = maxValue; else if (getClass() == CLASS_DEATH_KNIGHT) - skillValue = std::min(std::max<uint16>({ uint16(1), uint16((getLevel() - 1) * 5) }), maxValue); + skillValue = std::min(std::max(uint16(1), uint16((getLevel() - 1) * 5)), maxValue); SetSkill(skillId, rank, skillValue, maxValue); break; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 9d05aad8304..dbb1a03272f 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -386,13 +386,7 @@ struct PlayerCreateInfoAction typedef std::list<PlayerCreateInfoAction> PlayerCreateInfoActions; -struct PlayerCreateInfoSkill -{ - uint16 SkillId; - uint16 Rank; -}; - -typedef std::list<PlayerCreateInfoSkill> PlayerCreateInfoSkills; +typedef std::list<SkillRaceClassInfoEntry const*> PlayerCreateInfoSkills; struct PlayerInfo { @@ -1874,7 +1868,7 @@ class Player : public Unit, public GridObject<Player> void ResetSpells(bool myClassOnly = false); void LearnCustomSpells(); void LearnDefaultSkills(); - void LearnDefaultSkill(uint32 skillId, uint16 rank); + void LearnDefaultSkill(SkillRaceClassInfoEntry const* rcInfo); void LearnQuestRewardedSpells(); void LearnQuestRewardedSpells(Quest const* quest); void LearnSpellHighestRank(uint32 spellid); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index f42826a04e4..df7a3a65dd8 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2899,73 +2899,16 @@ void ObjectMgr::LoadPlayerInfo() { uint32 oldMSTime = getMSTime(); - QueryResult result = WorldDatabase.PQuery("SELECT raceMask, classMask, skill, rank FROM playercreateinfo_skills"); - - if (!result) - { - TC_LOG_ERROR("server.loading", ">> Loaded 0 player create skills. DB table `playercreateinfo_skills` is empty."); - } - else - { - uint32 count = 0; - - do - { - Field* fields = result->Fetch(); - uint32 raceMask = fields[0].GetUInt32(); - uint32 classMask = fields[1].GetUInt32(); - PlayerCreateInfoSkill skill; - skill.SkillId = fields[2].GetUInt16(); - skill.Rank = fields[3].GetUInt16(); - - if (skill.Rank >= MAX_SKILL_STEP) - { - TC_LOG_ERROR("sql.sql", "Skill rank value %hu set for skill %hu raceMask %u classMask %u is too high, max allowed value is %d", skill.Rank, skill.SkillId, raceMask, classMask, MAX_SKILL_STEP); - continue; - } - - if (raceMask != 0 && !(raceMask & RACEMASK_ALL_PLAYABLE)) - { - TC_LOG_ERROR("sql.sql", "Wrong race mask %u in `playercreateinfo_skills` table, ignoring.", raceMask); - continue; - } - - if (classMask != 0 && !(classMask & CLASSMASK_ALL_PLAYABLE)) - { - TC_LOG_ERROR("sql.sql", "Wrong class mask %u in `playercreateinfo_skills` table, ignoring.", classMask); - continue; - } - - if (!sSkillLineStore.LookupEntry(skill.SkillId)) - { - TC_LOG_ERROR("sql.sql", "Wrong skill id %u in `playercreateinfo_skills` table, ignoring.", skill.SkillId); - continue; - } - + for (SkillRaceClassInfoEntry const* rcInfo : sSkillRaceClassInfoStore) + if (rcInfo->Availability == 1) for (uint32 raceIndex = RACE_HUMAN; raceIndex < MAX_RACES; ++raceIndex) - { - if (raceMask == 0 || ((1 << (raceIndex - 1)) & raceMask)) - { + if (rcInfo->RaceMask == -1 || ((1 << (raceIndex - 1)) & rcInfo->RaceMask)) for (uint32 classIndex = CLASS_WARRIOR; classIndex < MAX_CLASSES; ++classIndex) - { - if (classMask == 0 || ((1 << (classIndex - 1)) & classMask)) - { - if (!GetSkillRaceClassInfo(skill.SkillId, raceIndex, classIndex)) - continue; - + if (rcInfo->ClassMask == -1 || ((1 << (classIndex - 1)) & rcInfo->ClassMask)) if (PlayerInfo* info = _playerInfo[raceIndex][classIndex]) - { - info->skills.push_back(skill); - ++count; - } - } - } - } - } - } while (result->NextRow()); + info->skills.push_back(rcInfo); - TC_LOG_INFO("server.loading", ">> Loaded %u player create skills in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); - } + TC_LOG_INFO("server.loading", ">> Loaded player create skills in %u ms", GetMSTimeDiffToNow(oldMSTime)); } // Load playercreate custom spells |