aboutsummaryrefslogtreecommitdiff
path: root/src/game/SkillHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/SkillHandler.cpp')
-rw-r--r--src/game/SkillHandler.cpp112
1 files changed, 5 insertions, 107 deletions
diff --git a/src/game/SkillHandler.cpp b/src/game/SkillHandler.cpp
index 973d0bf9c39..2e1f09aaf5a 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,107 +35,7 @@ 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;
-
- // prevent skip talent ranks (cheating)
- if(requested_rank > 0 && !player->HasSpell(talentInfo->RankID[requested_rank-1]))
- return;
-
- // 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 if it requires spell
- if( talentInfo->DependsOnSpell && !player->HasSpell(talentInfo->DependsOnSpell) )
- return;
-
- // Find out how many points we have in this field
- uint32 spentPoints = 0;
-
- uint32 tTab = talentInfo->TalentTab;
- if (talentInfo->Row > 0)
- {
- 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;
- }
- }
- }
- }
- }
- }
- }
-
- // not have required min points spent in talent tree
- if(spentPoints < (talentInfo->Row * 5))
- return;
-
- // 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;
- }
-
- // 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->LearnTalent(talent_id, requested_rank);
}
void WorldSession::HandleTalentWipeOpcode( WorldPacket & recv_data )
@@ -148,7 +46,7 @@ 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)) );
@@ -157,7 +55,7 @@ void WorldSession::HandleTalentWipeOpcode( WorldPacket & recv_data )
// remove fake death
if(GetPlayer()->hasUnitState(UNIT_STAT_DIED))
- GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH);
+ GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
if(!(_player->resetTalents()))
{