mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 04:37:00 +00:00
[7077] Implement support castable trainer spells for profession ranks.
This commit is contained in:
parent
fa9daa3fb7
commit
5b50e2f9e8
8 changed files with 262 additions and 23 deletions
|
|
@ -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';
|
||||
|
||||
--
|
||||
|
|
|
|||
214
sql/updates/7077_01_characters_character_spell.sql
Normal file
214
sql/updates/7077_01_characters_character_spell.sql
Normal file
|
|
@ -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;
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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<TrainerSpell*> TrainerSpellList;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#ifndef __REVISION_NR_H__
|
||||
#define __REVISION_NR_H__
|
||||
#define REVISION_NR "7076"
|
||||
#define REVISION_NR "7077"
|
||||
#endif // __REVISION_NR_H__
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue