diff --git a/sql/characters.sql b/sql/characters.sql index 701a2cee8..da43adaf7 100644 --- a/sql/characters.sql +++ b/sql/characters.sql @@ -21,7 +21,7 @@ DROP TABLE IF EXISTS `character_db_version`; CREATE TABLE `character_db_version` ( - `required_7075_01_characters_character_spell` bit(1) default NULL + `required_7077_01_characters_character_spell` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB'; -- diff --git a/sql/updates/7077_01_characters_character_spell.sql b/sql/updates/7077_01_characters_character_spell.sql new file mode 100644 index 000000000..b68f99b1d --- /dev/null +++ b/sql/updates/7077_01_characters_character_spell.sql @@ -0,0 +1,214 @@ +ALTER TABLE character_db_version CHANGE COLUMN required_7075_01_characters_character_spell required_7077_01_characters_character_spell bit; + +UPDATE IGNORE character_spell SET spell = 2018 WHERE spell = 2020; +DELETE FROM character_spell WHERE spell = 2020; + +UPDATE IGNORE character_spell SET spell = 2018 WHERE spell = 2020; +DELETE FROM character_spell WHERE spell = 2020; + +UPDATE IGNORE character_spell SET spell = 3100 WHERE spell = 2021; +DELETE FROM character_spell WHERE spell = 2021; + +UPDATE IGNORE character_spell SET spell = 3104 WHERE spell = 2154; +DELETE FROM character_spell WHERE spell = 2154; + +UPDATE IGNORE character_spell SET spell = 2108 WHERE spell = 2155; +DELETE FROM character_spell WHERE spell = 2155; + +UPDATE IGNORE character_spell SET spell = 2259 WHERE spell = 2275; +DELETE FROM character_spell WHERE spell = 2275; + +UPDATE IGNORE character_spell SET spell = 3101 WHERE spell = 2280; +DELETE FROM character_spell WHERE spell = 2280; + +UPDATE IGNORE character_spell SET spell = 2366 WHERE spell = 2372; +DELETE FROM character_spell WHERE spell = 2372; + +UPDATE IGNORE character_spell SET spell = 2368 WHERE spell = 2373; +DELETE FROM character_spell WHERE spell = 2373; + +UPDATE IGNORE character_spell SET spell = 2550 WHERE spell = 2551; +DELETE FROM character_spell WHERE spell = 2551; + +UPDATE IGNORE character_spell SET spell = 2575 WHERE spell = 2581; +DELETE FROM character_spell WHERE spell = 2581; + +UPDATE IGNORE character_spell SET spell = 2576 WHERE spell = 2582; +DELETE FROM character_spell WHERE spell = 2582; + +UPDATE IGNORE character_spell SET spell = 3273 WHERE spell = 3279; +DELETE FROM character_spell WHERE spell = 3279; + +UPDATE IGNORE character_spell SET spell = 3274 WHERE spell = 3280; +DELETE FROM character_spell WHERE spell = 3280; + +UPDATE IGNORE character_spell SET spell = 3102 WHERE spell = 3412; +DELETE FROM character_spell WHERE spell = 3412; + +UPDATE IGNORE character_spell SET spell = 3464 WHERE spell = 3465; +DELETE FROM character_spell WHERE spell = 3465; + +UPDATE IGNORE character_spell SET spell = 3538 WHERE spell = 3539; +DELETE FROM character_spell WHERE spell = 3539; + +UPDATE IGNORE character_spell SET spell = 3564 WHERE spell = 3568; +DELETE FROM character_spell WHERE spell = 3568; + +UPDATE IGNORE character_spell SET spell = 3570 WHERE spell = 3571; +DELETE FROM character_spell WHERE spell = 3571; + +UPDATE IGNORE character_spell SET spell = 3811 WHERE spell = 3812; +DELETE FROM character_spell WHERE spell = 3812; + +UPDATE IGNORE character_spell SET spell = 3908 WHERE spell = 3911; +DELETE FROM character_spell WHERE spell = 3911; + +UPDATE IGNORE character_spell SET spell = 3909 WHERE spell = 3912; +DELETE FROM character_spell WHERE spell = 3912; + +UPDATE IGNORE character_spell SET spell = 3910 WHERE spell = 3913; +DELETE FROM character_spell WHERE spell = 3913; + +UPDATE IGNORE character_spell SET spell = 4036 WHERE spell = 4039; +DELETE FROM character_spell WHERE spell = 4039; + +UPDATE IGNORE character_spell SET spell = 4037 WHERE spell = 4040; +DELETE FROM character_spell WHERE spell = 4040; + +UPDATE IGNORE character_spell SET spell = 4038 WHERE spell = 4041; +DELETE FROM character_spell WHERE spell = 4041; + +UPDATE IGNORE character_spell SET spell = 7620 WHERE spell = 7733; +DELETE FROM character_spell WHERE spell = 7733; + +UPDATE IGNORE character_spell SET spell = 7731 WHERE spell = 7734; +DELETE FROM character_spell WHERE spell = 7734; + +UPDATE IGNORE character_spell SET spell = 8613 WHERE spell = 8615; +DELETE FROM character_spell WHERE spell = 8615; + +UPDATE IGNORE character_spell SET spell = 8617 WHERE spell = 8619; +DELETE FROM character_spell WHERE spell = 8619; + +UPDATE IGNORE character_spell SET spell = 8618 WHERE spell = 8620; +DELETE FROM character_spell WHERE spell = 8620; + +UPDATE IGNORE character_spell SET spell = 9785 WHERE spell = 9786; +DELETE FROM character_spell WHERE spell = 9786; + +UPDATE IGNORE character_spell SET spell = 10248 WHERE spell = 10249; +DELETE FROM character_spell WHERE spell = 10249; + +UPDATE IGNORE character_spell SET spell = 10662 WHERE spell = 10663; +DELETE FROM character_spell WHERE spell = 10663; + +UPDATE IGNORE character_spell SET spell = 10768 WHERE spell = 10769; +DELETE FROM character_spell WHERE spell = 10769; + +UPDATE IGNORE character_spell SET spell = 11611 WHERE spell = 11612; +DELETE FROM character_spell WHERE spell = 11612; + +UPDATE IGNORE character_spell SET spell = 11993 WHERE spell = 11994; +DELETE FROM character_spell WHERE spell = 11994; + +UPDATE IGNORE character_spell SET spell = 12180 WHERE spell = 12181; +DELETE FROM character_spell WHERE spell = 12181; + +UPDATE IGNORE character_spell SET spell = 12656 WHERE spell = 12657; +DELETE FROM character_spell WHERE spell = 12657; + +UPDATE IGNORE character_spell SET spell = 25229 WHERE spell = 25245; +DELETE FROM character_spell WHERE spell = 25245; + +UPDATE IGNORE character_spell SET spell = 25230 WHERE spell = 25246; +DELETE FROM character_spell WHERE spell = 25246; + +UPDATE IGNORE character_spell SET spell = 26790 WHERE spell = 26791; +DELETE FROM character_spell WHERE spell = 26791; + +UPDATE IGNORE character_spell SET spell = 28596 WHERE spell = 28597; +DELETE FROM character_spell WHERE spell = 28597; + +UPDATE IGNORE character_spell SET spell = 28695 WHERE spell = 28696; +DELETE FROM character_spell WHERE spell = 28696; + +UPDATE IGNORE character_spell SET spell = 28894 WHERE spell = 28896; +DELETE FROM character_spell WHERE spell = 28896; + +UPDATE IGNORE character_spell SET spell = 28895 WHERE spell = 28899; +DELETE FROM character_spell WHERE spell = 28899; + +UPDATE IGNORE character_spell SET spell = 28897 WHERE spell = 28901; +DELETE FROM character_spell WHERE spell = 28901; + +UPDATE IGNORE character_spell SET spell = 29354 WHERE spell = 29355; +DELETE FROM character_spell WHERE spell = 29355; + +UPDATE IGNORE character_spell SET spell = 29844 WHERE spell = 29845; +DELETE FROM character_spell WHERE spell = 29845; + +UPDATE IGNORE character_spell SET spell = 30350 WHERE spell = 30351; +DELETE FROM character_spell WHERE spell = 30351; + +UPDATE IGNORE character_spell SET spell = 32549 WHERE spell = 32550; +DELETE FROM character_spell WHERE spell = 32550; + +UPDATE IGNORE character_spell SET spell = 32678 WHERE spell = 32679; +DELETE FROM character_spell WHERE spell = 32679; + +UPDATE IGNORE character_spell SET spell = 45357 WHERE spell = 45375; +DELETE FROM character_spell WHERE spell = 45375; + +UPDATE IGNORE character_spell SET spell = 45358 WHERE spell = 45376; +DELETE FROM character_spell WHERE spell = 45376; + +UPDATE IGNORE character_spell SET spell = 45359 WHERE spell = 45377; +DELETE FROM character_spell WHERE spell = 45377; + +UPDATE IGNORE character_spell SET spell = 45360 WHERE spell = 45378; +DELETE FROM character_spell WHERE spell = 45378; + +UPDATE IGNORE character_spell SET spell = 45361 WHERE spell = 45379; +DELETE FROM character_spell WHERE spell = 45379; + +UPDATE IGNORE character_spell SET spell = 45363 WHERE spell = 45380; +DELETE FROM character_spell WHERE spell = 45380; + +UPDATE IGNORE character_spell SET spell = 45542 WHERE spell = 50299; +DELETE FROM character_spell WHERE spell = 50299; + +UPDATE IGNORE character_spell SET spell = 50305 WHERE spell = 50307; +DELETE FROM character_spell WHERE spell = 50307; + +UPDATE IGNORE character_spell SET spell = 50310 WHERE spell = 50309; +DELETE FROM character_spell WHERE spell = 50309; + +UPDATE IGNORE character_spell SET spell = 51294 WHERE spell = 51293; +DELETE FROM character_spell WHERE spell = 51293; + +UPDATE IGNORE character_spell SET spell = 51296 WHERE spell = 51295; +DELETE FROM character_spell WHERE spell = 51295; + +UPDATE IGNORE character_spell SET spell = 51300 WHERE spell = 51298; +DELETE FROM character_spell WHERE spell = 51298; + +UPDATE IGNORE character_spell SET spell = 51302 WHERE spell = 51301; +DELETE FROM character_spell WHERE spell = 51301; + +UPDATE IGNORE character_spell SET spell = 51304 WHERE spell = 51303; +DELETE FROM character_spell WHERE spell = 51303; + +UPDATE IGNORE character_spell SET spell = 51306 WHERE spell = 51305; +DELETE FROM character_spell WHERE spell = 51305; + +UPDATE IGNORE character_spell SET spell = 51309 WHERE spell = 51308; +DELETE FROM character_spell WHERE spell = 51308; + +UPDATE IGNORE character_spell SET spell = 51311 WHERE spell = 51310; +DELETE FROM character_spell WHERE spell = 51310; + +UPDATE IGNORE character_spell SET spell = 51313 WHERE spell = 51312; +DELETE FROM character_spell WHERE spell = 51312; + +UPDATE IGNORE character_spell SET spell = 33095 WHERE spell = 54084; +DELETE FROM character_spell WHERE spell = 54084; diff --git a/sql/updates/Makefile.am b/sql/updates/Makefile.am index 33bc07947..1c9424256 100644 --- a/sql/updates/Makefile.am +++ b/sql/updates/Makefile.am @@ -135,6 +135,7 @@ pkgdata_DATA = \ 7074_01_mangos_playercreateinfo_spell.sql \ 7075_01_characters_character_spell.sql \ 7075_02_mangos_spell_learn_spell.sql \ + 7077_01_characters_character_spell.sql \ README ## Additional files to include when running 'make dist' @@ -250,4 +251,5 @@ EXTRA_DIST = \ 7074_01_mangos_playercreateinfo_spell.sql \ 7075_01_characters_character_spell.sql \ 7075_02_mangos_spell_learn_spell.sql \ + 7077_01_characters_character_spell.sql \ README diff --git a/src/game/Creature.h b/src/game/Creature.h index 8bb1f868d..3dec7c603 100644 --- a/src/game/Creature.h +++ b/src/game/Creature.h @@ -364,6 +364,10 @@ struct TrainerSpell uint32 reqskill; uint32 reqskillvalue; uint32 reqlevel; + uint32 learned_spell; + + // helpers + bool IsCastable() const { return learned_spell != spell; } }; typedef std::vector TrainerSpellList; diff --git a/src/game/NPCHandler.cpp b/src/game/NPCHandler.cpp index 498902ebe..5e3580088 100644 --- a/src/game/NPCHandler.cpp +++ b/src/game/NPCHandler.cpp @@ -164,16 +164,16 @@ void WorldSession::SendTrainerList( uint64 guid, const std::string& strTitle ) { TrainerSpell const* tSpell = *itr; - if(!_player->IsSpellFitByClassAndRace(tSpell->spell)) + if(!_player->IsSpellFitByClassAndRace(tSpell->learned_spell)) continue; ++count; - bool primary_prof_first_rank = spellmgr.IsPrimaryProfessionFirstRankSpell(tSpell->spell); + bool primary_prof_first_rank = spellmgr.IsPrimaryProfessionFirstRankSpell(tSpell->learned_spell); - SpellChainNode const* chain_node = spellmgr.GetSpellChainNode(tSpell->spell); + SpellChainNode const* chain_node = spellmgr.GetSpellChainNode(tSpell->learned_spell); - data << uint32(tSpell->spell); + data << uint32(tSpell->spell); // learned spell (or cast-spell in profession case) data << uint8(_player->GetTrainerSpellState(tSpell)); data << uint32(floor(tSpell->spellcost * fDiscountMod)); @@ -238,21 +238,27 @@ void WorldSession::HandleTrainerBuySpellOpcode( WorldPacket & recv_data ) if(_player->GetMoney() < nSpellCost ) return; - WorldPacket data(SMSG_PLAY_SPELL_VISUAL, 12); // visual effect on trainer - data << uint64(guid) << uint32(0xB3); - SendPacket(&data); - - data.Initialize(SMSG_PLAY_SPELL_IMPACT, 12); // visual effect on player - data << uint64(_player->GetGUID()) << uint32(0x016A); - SendPacket(&data); - _player->ModifyMoney( -int32(nSpellCost) ); - // learn explicitly to prevent lost money at lags, learning spell will be only show spell animation - _player->learnSpell(trainer_spell->spell); + // learn explicitly or cast explicitly + if(trainer_spell->IsCastable ()) + //FIXME: prof. spell entry in trainer list not marked gray until list re-open. + unit->CastSpell(_player,trainer_spell->spell,true); + else + { + WorldPacket data(SMSG_PLAY_SPELL_VISUAL, 12); // visual effect on trainer + data << uint64(guid) << uint32(0xB3); + SendPacket(&data); - data.Initialize(SMSG_TRAINER_BUY_SUCCEEDED, 12); - data << uint64(guid) << uint32(spellId); + data.Initialize(SMSG_PLAY_SPELL_IMPACT, 12); // visual effect on player + data << uint64(_player->GetGUID()) << uint32(0x016A); + SendPacket(&data); + + _player->learnSpell(spellId); + } + + WorldPacket data(SMSG_TRAINER_BUY_SUCCEEDED, 12); + data << uint64(guid) << uint32(trainer_spell->spell); SendPacket(&data); } diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index 4566bf2a6..202abd374 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -7040,6 +7040,19 @@ void ObjectMgr::LoadTrainerSpell() if(!pTrainerSpell->reqlevel) pTrainerSpell->reqlevel = spellinfo->spellLevel; + // calculate learned spell for profession case when stored cast-spell + pTrainerSpell->learned_spell = spell; + for(int i = 0; i <3; ++i) + { + if(spellinfo->Effect[i]!=SPELL_EFFECT_LEARN_SPELL) + continue; + + if(SpellMgr::IsProfessionSpell(spellinfo->EffectTriggerSpell[i])) + { + pTrainerSpell->learned_spell = spellinfo->EffectTriggerSpell[i]; + break; + } + } TrainerSpellData& data = m_mCacheTrainerSpellMap[entry]; diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 5893d43ed..4c8398b9e 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -3451,22 +3451,22 @@ TrainerSpellState Player::GetTrainerSpellState(TrainerSpell const* trainer_spell if (!trainer_spell) return TRAINER_SPELL_RED; - if (!trainer_spell->spell) + if (!trainer_spell->learned_spell) return TRAINER_SPELL_RED; // known spell - if(HasSpell(trainer_spell->spell)) + if(HasSpell(trainer_spell->learned_spell)) return TRAINER_SPELL_GRAY; // check race/class requirement - if(!IsSpellFitByClassAndRace(trainer_spell->spell)) + if(!IsSpellFitByClassAndRace(trainer_spell->learned_spell)) return TRAINER_SPELL_RED; // check level requirement if(getLevel() < trainer_spell->reqlevel) return TRAINER_SPELL_RED; - if(SpellChainNode const* spell_chain = spellmgr.GetSpellChainNode(trainer_spell->spell)) + if(SpellChainNode const* spell_chain = spellmgr.GetSpellChainNode(trainer_spell->learned_spell)) { // check prev.rank requirement if(spell_chain->prev && !HasSpell(spell_chain->prev)) @@ -3482,7 +3482,7 @@ TrainerSpellState Player::GetTrainerSpellState(TrainerSpell const* trainer_spell return TRAINER_SPELL_RED; // exist, already checked at loading - SpellEntry const* spell = sSpellStore.LookupEntry(trainer_spell->spell); + SpellEntry const* spell = sSpellStore.LookupEntry(trainer_spell->learned_spell); // secondary prof. or not prof. spell uint32 skill = spell->EffectMiscValue[1]; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index f80374027..4a909f0aa 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7076" + #define REVISION_NR "7077" #endif // __REVISION_NR_H__