From 2884b06b0a5f5210b662884d3fa889a9170889b5 Mon Sep 17 00:00:00 2001 From: tomrus88 Date: Thu, 5 Mar 2009 17:14:51 +0300 Subject: [PATCH] One more attempt to fix free talent points amount --- src/game/PetHandler.cpp | 2 +- src/game/Player.cpp | 54 +++++++++++++++++++++++++-------------- src/game/Player.h | 4 +-- src/game/SkillHandler.cpp | 2 +- 4 files changed, 39 insertions(+), 23 deletions(-) diff --git a/src/game/PetHandler.cpp b/src/game/PetHandler.cpp index cc4fb8412..15adc88a5 100644 --- a/src/game/PetHandler.cpp +++ b/src/game/PetHandler.cpp @@ -693,7 +693,7 @@ void WorldSession::HandleLearnPreviewTalentsPet( WorldPacket & recv_data ) recv_data >> talentId >> talentRank; - _player->LearnPetTalent(guid, talentId, talentRank, true); + _player->LearnPetTalent(guid, talentId, talentRank); } _player->SendTalentsInfoData(true); diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 18c7dc98d..120380937 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -19764,7 +19764,7 @@ void Player::BuildEnchantmentsInfoData(WorldPacket *data) } } -void Player::LearnTalent(uint32 talentId, uint32 talentRank, bool skipPrevRanks) +void Player::LearnTalent(uint32 talentId, uint32 talentRank) { uint32 CurTalentPoints = GetFreeTalentPoints(); @@ -19788,12 +19788,23 @@ void Player::LearnTalent(uint32 talentId, uint32 talentRank, bool skipPrevRanks) if( (getClassMask() & talentTabInfo->ClassMask) == 0 ) return; - // check for LearnPreviewTalents case - if(skipPrevRanks && (CurTalentPoints < (talentRank + 1))) + // find current max talent rank + int32 curtalent_maxrank = 0; + for(int32 k = 4; k > -1; --k) + { + if(talentInfo->RankID[k] && HasSpell(talentInfo->RankID[k])) + { + curtalent_maxrank = k + 1; + break; + } + } + + // we already have same or higher talent rank learned + if(curtalent_maxrank >= (talentRank + 1)) return; - // prevent skip talent ranks (cheating) - if(talentRank > 0 && !HasSpell(talentInfo->RankID[talentRank-1]) && !skipPrevRanks) + // check if we have enough talent points + if(CurTalentPoints < (talentRank - curtalent_maxrank + 1)) return; // Check if it requires another talent @@ -19864,13 +19875,10 @@ void Player::LearnTalent(uint32 talentId, uint32 talentRank, bool skipPrevRanks) sLog.outDetail("TalentID: %u Rank: %u Spell: %u\n", talentId, talentRank, spellid); // update free talent points - if(skipPrevRanks) - SetFreeTalentPoints(CurTalentPoints - (talentRank + 1)); - else - SetFreeTalentPoints(CurTalentPoints - 1); + SetFreeTalentPoints(CurTalentPoints - (talentRank - curtalent_maxrank + 1)); } -void Player::LearnPetTalent(uint64 petGuid, uint32 talentId, uint32 talentRank, bool skipPrevRanks) +void Player::LearnPetTalent(uint64 petGuid, uint32 talentId, uint32 talentRank) { Pet *pet = GetPet(); @@ -19880,7 +19888,7 @@ void Player::LearnPetTalent(uint64 petGuid, uint32 talentId, uint32 talentRank, if(petGuid != pet->GetGUID()) return; - uint32 CurTalentPoints = pet->GetFreeTalentPoints(); + uint32 CurTalentPoints = pet->GetFreeTalentPoints(); if(CurTalentPoints == 0) return; @@ -19915,12 +19923,23 @@ void Player::LearnPetTalent(uint64 petGuid, uint32 talentId, uint32 talentRank, if(!((1 << pet_family->petTalentType) & talentTabInfo->petTalentMask)) return; - // check for LearnPreviewTalents case - if(skipPrevRanks && (CurTalentPoints < (talentRank + 1))) + // find current max talent rank + int32 curtalent_maxrank = 0; + for(int32 k = 4; k > -1; --k) + { + if(talentInfo->RankID[k] && pet->HasSpell(talentInfo->RankID[k])) + { + curtalent_maxrank = k + 1; + break; + } + } + + // we already have same or higher talent rank learned + if(curtalent_maxrank >= (talentRank + 1)) return; - // prevent skip talent ranks (cheating) - if(talentRank > 0 && !pet->HasSpell(talentInfo->RankID[talentRank-1]) && !skipPrevRanks) + // check if we have enough talent points + if(CurTalentPoints < (talentRank - curtalent_maxrank + 1)) return; // Check if it requires another talent @@ -19991,10 +20010,7 @@ void Player::LearnPetTalent(uint64 petGuid, uint32 talentId, uint32 talentRank, sLog.outDetail("TalentID: %u Rank: %u Spell: %u\n", talentId, talentRank, spellid); // update free talent points - if(skipPrevRanks) - pet->SetFreeTalentPoints(CurTalentPoints - (talentRank + 1)); - else - pet->SetFreeTalentPoints(CurTalentPoints - 1); + pet->SetFreeTalentPoints(CurTalentPoints - (talentRank - curtalent_maxrank + 1)); } void Player::SendEquipmentSetList() diff --git a/src/game/Player.h b/src/game/Player.h index a3190acab..bdf48b708 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1475,8 +1475,8 @@ class MANGOS_DLL_SPEC Player : public Unit void BuildPlayerTalentsInfoData(WorldPacket *data); void BuildPetTalentsInfoData(WorldPacket *data); void SendTalentsInfoData(bool pet); - void LearnTalent(uint32 talentId, uint32 talentRank, bool skipPrevRanks = false); - void LearnPetTalent(uint64 petGuid, uint32 talentId, uint32 talentRank, bool skipPrevRanks = false); + void LearnTalent(uint32 talentId, uint32 talentRank); + void LearnPetTalent(uint64 petGuid, uint32 talentId, uint32 talentRank); uint32 CalculateTalentsPoints() const; diff --git a/src/game/SkillHandler.cpp b/src/game/SkillHandler.cpp index 5697bfd6e..b2aeac58e 100644 --- a/src/game/SkillHandler.cpp +++ b/src/game/SkillHandler.cpp @@ -56,7 +56,7 @@ void WorldSession::HandleLearnPreviewTalents(WorldPacket& recvPacket) recvPacket >> talentId >> talentRank; - _player->LearnTalent(talentId, talentRank, true); + _player->LearnTalent(talentId, talentRank); } _player->SendTalentsInfoData(false);