One more attempt to fix free talent points amount

This commit is contained in:
tomrus88 2009-03-05 17:14:51 +03:00
parent ef65518690
commit 2884b06b0a
4 changed files with 39 additions and 23 deletions

View file

@ -693,7 +693,7 @@ void WorldSession::HandleLearnPreviewTalentsPet( WorldPacket & recv_data )
recv_data >> talentId >> talentRank; recv_data >> talentId >> talentRank;
_player->LearnPetTalent(guid, talentId, talentRank, true); _player->LearnPetTalent(guid, talentId, talentRank);
} }
_player->SendTalentsInfoData(true); _player->SendTalentsInfoData(true);

View file

@ -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(); uint32 CurTalentPoints = GetFreeTalentPoints();
@ -19788,12 +19788,23 @@ void Player::LearnTalent(uint32 talentId, uint32 talentRank, bool skipPrevRanks)
if( (getClassMask() & talentTabInfo->ClassMask) == 0 ) if( (getClassMask() & talentTabInfo->ClassMask) == 0 )
return; return;
// check for LearnPreviewTalents case // find current max talent rank
if(skipPrevRanks && (CurTalentPoints < (talentRank + 1))) 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; return;
// prevent skip talent ranks (cheating) // check if we have enough talent points
if(talentRank > 0 && !HasSpell(talentInfo->RankID[talentRank-1]) && !skipPrevRanks) if(CurTalentPoints < (talentRank - curtalent_maxrank + 1))
return; return;
// Check if it requires another talent // 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); sLog.outDetail("TalentID: %u Rank: %u Spell: %u\n", talentId, talentRank, spellid);
// update free talent points // update free talent points
if(skipPrevRanks) SetFreeTalentPoints(CurTalentPoints - (talentRank - curtalent_maxrank + 1));
SetFreeTalentPoints(CurTalentPoints - (talentRank + 1));
else
SetFreeTalentPoints(CurTalentPoints - 1);
} }
void Player::LearnPetTalent(uint64 petGuid, uint32 talentId, uint32 talentRank, bool skipPrevRanks) void Player::LearnPetTalent(uint64 petGuid, uint32 talentId, uint32 talentRank)
{ {
Pet *pet = GetPet(); Pet *pet = GetPet();
@ -19915,12 +19923,23 @@ void Player::LearnPetTalent(uint64 petGuid, uint32 talentId, uint32 talentRank,
if(!((1 << pet_family->petTalentType) & talentTabInfo->petTalentMask)) if(!((1 << pet_family->petTalentType) & talentTabInfo->petTalentMask))
return; return;
// check for LearnPreviewTalents case // find current max talent rank
if(skipPrevRanks && (CurTalentPoints < (talentRank + 1))) 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; return;
// prevent skip talent ranks (cheating) // check if we have enough talent points
if(talentRank > 0 && !pet->HasSpell(talentInfo->RankID[talentRank-1]) && !skipPrevRanks) if(CurTalentPoints < (talentRank - curtalent_maxrank + 1))
return; return;
// Check if it requires another talent // 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); sLog.outDetail("TalentID: %u Rank: %u Spell: %u\n", talentId, talentRank, spellid);
// update free talent points // update free talent points
if(skipPrevRanks) pet->SetFreeTalentPoints(CurTalentPoints - (talentRank - curtalent_maxrank + 1));
pet->SetFreeTalentPoints(CurTalentPoints - (talentRank + 1));
else
pet->SetFreeTalentPoints(CurTalentPoints - 1);
} }
void Player::SendEquipmentSetList() void Player::SendEquipmentSetList()

View file

@ -1475,8 +1475,8 @@ class MANGOS_DLL_SPEC Player : public Unit
void BuildPlayerTalentsInfoData(WorldPacket *data); void BuildPlayerTalentsInfoData(WorldPacket *data);
void BuildPetTalentsInfoData(WorldPacket *data); void BuildPetTalentsInfoData(WorldPacket *data);
void SendTalentsInfoData(bool pet); void SendTalentsInfoData(bool pet);
void LearnTalent(uint32 talentId, uint32 talentRank, bool skipPrevRanks = false); void LearnTalent(uint32 talentId, uint32 talentRank);
void LearnPetTalent(uint64 petGuid, uint32 talentId, uint32 talentRank, bool skipPrevRanks = false); void LearnPetTalent(uint64 petGuid, uint32 talentId, uint32 talentRank);
uint32 CalculateTalentsPoints() const; uint32 CalculateTalentsPoints() const;

View file

@ -56,7 +56,7 @@ void WorldSession::HandleLearnPreviewTalents(WorldPacket& recvPacket)
recvPacket >> talentId >> talentRank; recvPacket >> talentId >> talentRank;
_player->LearnTalent(talentId, talentRank, true); _player->LearnTalent(talentId, talentRank);
} }
_player->SendTalentsInfoData(false); _player->SendTalentsInfoData(false);