diff options
Diffstat (limited to 'src/game/SkillHandler.cpp')
-rw-r--r-- | src/game/SkillHandler.cpp | 121 |
1 files changed, 22 insertions, 99 deletions
diff --git a/src/game/SkillHandler.cpp b/src/game/SkillHandler.cpp index 973d0bf9c39..55f510dc6da 100644 --- a/src/game/SkillHandler.cpp +++ b/src/game/SkillHandler.cpp @@ -1,7 +1,7 @@ /* - * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/> + * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> * - * Copyright (C) 2008 Trinity <http://www.trinitycore.org/> + * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,12 +23,10 @@ #include "Opcodes.h" #include "Log.h" #include "Player.h" -#include "World.h" #include "WorldPacket.h" #include "WorldSession.h" #include "ObjectAccessor.h" #include "UpdateMask.h" -#include "SpellAuras.h" void WorldSession::HandleLearnTalentOpcode( WorldPacket & recv_data ) { @@ -37,110 +35,34 @@ void WorldSession::HandleLearnTalentOpcode( WorldPacket & recv_data ) uint32 talent_id, requested_rank; recv_data >> talent_id >> requested_rank; - uint32 CurTalentPoints = GetPlayer()->GetFreeTalentPoints(); - - if(CurTalentPoints == 0) - return; - - if (requested_rank > 4) - return; - - TalentEntry const *talentInfo = sTalentStore.LookupEntry( talent_id ); - - if(!talentInfo) - return; - - TalentTabEntry const *talentTabInfo = sTalentTabStore.LookupEntry( talentInfo->TalentTab ); - - if(!talentTabInfo) - return; - - Player * player = GetPlayer(); - - // prevent learn talent for different class (cheating) - if( (player->getClassMask() & talentTabInfo->ClassMask) == 0 ) - return; + _player->LearnTalent(talent_id, requested_rank); + _player->SendTalentsInfoData(false); +} - // prevent skip talent ranks (cheating) - if(requested_rank > 0 && !player->HasSpell(talentInfo->RankID[requested_rank-1])) - return; +void WorldSession::HandleLearnPreviewTalents(WorldPacket& recvPacket) +{ + sLog.outDebug("CMSG_LEARN_PREVIEW_TALENTS"); - // Check if it requires another talent - if (talentInfo->DependsOn > 0) - { - if(TalentEntry const *depTalentInfo = sTalentStore.LookupEntry(talentInfo->DependsOn)) - { - bool hasEnoughRank = false; - for (int i = talentInfo->DependsOnRank; i <= 4; i++) - { - if (depTalentInfo->RankID[i] != 0) - if (player->HasSpell(depTalentInfo->RankID[i])) - hasEnoughRank = true; - } - if (!hasEnoughRank) - return; - } - } + CHECK_PACKET_SIZE(recvPacket, 4); - // Check if it requires spell - if( talentInfo->DependsOnSpell && !player->HasSpell(talentInfo->DependsOnSpell) ) - return; + uint32 talentsCount; + recvPacket >> talentsCount; - // Find out how many points we have in this field - uint32 spentPoints = 0; + uint32 talentId, talentRank; - uint32 tTab = talentInfo->TalentTab; - if (talentInfo->Row > 0) + for(uint32 i = 0; i < talentsCount; ++i) { - unsigned int numRows = sTalentStore.GetNumRows(); - for (unsigned int i = 0; i < numRows; i++) // Loop through all talents. - { - // Someday, someone needs to revamp - const TalentEntry *tmpTalent = sTalentStore.LookupEntry(i); - if (tmpTalent) // the way talents are tracked - { - if (tmpTalent->TalentTab == tTab) - { - for (int j = 0; j <= 4; j++) - { - if (tmpTalent->RankID[j] != 0) - { - if (player->HasSpell(tmpTalent->RankID[j])) - { - spentPoints += j + 1; - } - } - } - } - } - } - } + CHECK_PACKET_SIZE(recvPacket, recvPacket.rpos()+4+4); - // not have required min points spent in talent tree - if(spentPoints < (talentInfo->Row * 5)) - return; + recvPacket >> talentId >> talentRank; - // spell not set in talent.dbc - uint32 spellid = talentInfo->RankID[requested_rank]; - if( spellid == 0 ) - { - sLog.outError("Talent.dbc have for talent: %u Rank: %u spell id = 0", talent_id, requested_rank); - return; + _player->LearnTalent(talentId, talentRank); } - // already known - if(GetPlayer( )->HasSpell(spellid)) - return; - - // learn! (other talent ranks will unlearned at learning) - GetPlayer( )->learnSpell(spellid); - sLog.outDetail("TalentID: %u Rank: %u Spell: %u\n", talent_id, requested_rank, spellid); - - // update free talent points - GetPlayer()->SetFreeTalentPoints(CurTalentPoints - 1); + _player->SendTalentsInfoData(false); } -void WorldSession::HandleTalentWipeOpcode( WorldPacket & recv_data ) +void WorldSession::HandleTalentWipeConfirmOpcode( WorldPacket & recv_data ) { CHECK_PACKET_SIZE(recv_data,8); @@ -148,16 +70,16 @@ void WorldSession::HandleTalentWipeOpcode( WorldPacket & recv_data ) uint64 guid; recv_data >> guid; - Creature *unit = ObjectAccessor::GetNPCIfCanInteractWith(*_player, guid,UNIT_NPC_FLAG_TRAINER); + Creature *unit = GetPlayer()->GetNPCIfCanInteractWith(guid,UNIT_NPC_FLAG_TRAINER); if (!unit) { - sLog.outDebug( "WORLD: HandleTalentWipeOpcode - Unit (GUID: %u) not found or you can't interact with him.", uint32(GUID_LOPART(guid)) ); + sLog.outDebug( "WORLD: HandleTalentWipeConfirmOpcode - Unit (GUID: %u) not found or you can't interact with him.", uint32(GUID_LOPART(guid)) ); return; } // remove fake death if(GetPlayer()->hasUnitState(UNIT_STAT_DIED)) - GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); + GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); if(!(_player->resetTalents())) { @@ -168,6 +90,7 @@ void WorldSession::HandleTalentWipeOpcode( WorldPacket & recv_data ) return; } + _player->SendTalentsInfoData(false); unit->CastSpell(_player, 14867, true); //spell: "Untalent Visual Effect" } |