From baa3e199d299449f4c5eb79bb52bf71a554a5561 Mon Sep 17 00:00:00 2001 From: NoFantasy Date: Thu, 30 Apr 2009 21:24:59 +0400 Subject: [PATCH 1/5] [7739] Implement boss spell 38441. Signed-off-by: VladimirMangos --- src/game/SpellEffects.cpp | 4 ++++ src/shared/revision_nr.h | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index 216b018d3..30d2c62c1 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -349,6 +349,10 @@ void Spell::EffectSchoolDMG(uint32 effect_idx) damage+= uint32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.12f); break; } + // Cataclysmic Bolt + case 38441: + damage = unitTarget->GetMaxHealth() / 2; + break; } break; } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 6944268d7..e8eddda82 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 "7738" + #define REVISION_NR "7739" #endif // __REVISION_NR_H__ From 8e2a664fadecb0c08adc6f2f76fd100cddc5c7a8 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Fri, 1 May 2009 03:58:51 +0400 Subject: [PATCH 2/5] [7740] More correct flags in trainer list data for profession ranks. Note: this is not fix problem with gren show recently learned non-first rank of primary profession. Thanks to Seizerkiller for help in reseach. --- src/game/NPCHandler.cpp | 16 +++++++++------- src/game/Player.cpp | 2 +- src/game/Player.h | 3 ++- src/shared/revision_nr.h | 2 +- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/game/NPCHandler.cpp b/src/game/NPCHandler.cpp index ad63584b1..05b77b4b4 100644 --- a/src/game/NPCHandler.cpp +++ b/src/game/NPCHandler.cpp @@ -155,6 +155,7 @@ void WorldSession::SendTrainerList( uint64 guid, const std::string& strTitle ) // reputation discount float fDiscountMod = _player->GetReputationPriceDiscount(unit); + bool can_learn_primary_prof = GetPlayer()->GetFreePrimaryProffesionPoints() > 0; uint32 count = 0; for(TrainerSpellMap::const_iterator itr = trainer_spells->spellList.begin(); itr != trainer_spells->spellList.end(); ++itr) @@ -164,24 +165,25 @@ void WorldSession::SendTrainerList( uint64 guid, const std::string& strTitle ) if(!_player->IsSpellFitByClassAndRace(tSpell->learnedSpell)) continue; - ++count; - bool primary_prof_first_rank = spellmgr.IsPrimaryProfessionFirstRankSpell(tSpell->learnedSpell); - SpellChainNode const* chain_node = spellmgr.GetSpellChainNode(tSpell->learnedSpell); + TrainerSpellState state = _player->GetTrainerSpellState(tSpell); data << uint32(tSpell->spell); // learned spell (or cast-spell in profession case) - data << uint8(_player->GetTrainerSpellState(tSpell)); + data << uint8(state==TRAINER_SPELL_GREEN_DISABLED ? TRAINER_SPELL_GREEN : state); data << uint32(floor(tSpell->spellCost * fDiscountMod)); - data << uint32(primary_prof_first_rank ? 1 : 0); // primary prof. learn confirmation dialog + data << uint32(primary_prof_first_rank && can_learn_primary_prof ? 1 : 0); + // primary prof. learn confirmation dialog data << uint32(primary_prof_first_rank ? 1 : 0); // must be equal prev. field to have learn button in enabled state data << uint8(tSpell->reqLevel); data << uint32(tSpell->reqSkill); data << uint32(tSpell->reqSkillValue); - data << uint32(chain_node ? (chain_node->prev ? chain_node->prev : chain_node->req) : 0); - data << uint32(chain_node && chain_node->prev ? chain_node->req : 0); + data << uint32(!tSpell->IsCastable() && chain_node ? (chain_node->prev ? chain_node->prev : chain_node->req) : 0); + data << uint32(!tSpell->IsCastable() && chain_node && chain_node->prev ? chain_node->req : 0); data << uint32(0); + + ++count; } data << strTitle; diff --git a/src/game/Player.cpp b/src/game/Player.cpp index f5f72e1c6..fa8d925c1 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -3705,7 +3705,7 @@ TrainerSpellState Player::GetTrainerSpellState(TrainerSpell const* trainer_spell // check primary prof. limit if(spellmgr.IsPrimaryProfessionFirstRankSpell(spell->Id) && GetFreePrimaryProffesionPoints() == 0) - return TRAINER_SPELL_RED; + return TRAINER_SPELL_GREEN_DISABLED; return TRAINER_SPELL_GREEN; } diff --git a/src/game/Player.h b/src/game/Player.h index 4eabfb5d5..04cd287fa 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -121,7 +121,8 @@ enum TrainerSpellState { TRAINER_SPELL_GREEN = 0, TRAINER_SPELL_RED = 1, - TRAINER_SPELL_GRAY = 2 + TRAINER_SPELL_GRAY = 2, + TRAINER_SPELL_GREEN_DISABLED = 10 // custom value, not send to client: formally green but learn not allowed }; enum ActionButtonUpdateState diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index e8eddda82..48b563913 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 "7739" + #define REVISION_NR "7740" #endif // __REVISION_NR_H__ From 8e39ea0151d1d85e6b92e985757b754d527552ae Mon Sep 17 00:00:00 2001 From: ApoC Date: Fri, 1 May 2009 23:03:39 +0200 Subject: [PATCH 3/5] [7741] Allow pets/charmed NPCs to count master's spell cast conditions in quests. Signed-off-by: ApoC --- src/game/Spell.cpp | 53 +++++++++++++++++++++++----------------- src/game/Spell.h | 11 +++++++++ src/shared/revision_nr.h | 2 +- 3 files changed, 43 insertions(+), 23 deletions(-) diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index c3af8e2d9..36edd0105 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -748,7 +748,7 @@ void Spell::prepareDataForTriggerSystem() { //========================================================================================== // Now fill data for trigger system, need know: - // Ņan spell trigger another or not ( m_canTrigger ) + // an spell trigger another or not ( m_canTrigger ) // Create base triggers flags for Attacker and Victim ( m_procAttacker and m_procVictim) //========================================================================================== // Fill flag can spell trigger or not @@ -1091,8 +1091,11 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target) { // cast at creature (or GO) quest objectives update at successful cast finished (+channel finished) // ignore pets or autorepeat/melee casts for speed (not exist quest for spells (hm... ) - if( !((Creature*)unit)->isPet() && m_caster->GetTypeId() == TYPEID_PLAYER && !IsAutoRepeat() && !IsNextMeleeSwingSpell() && !IsChannelActive() ) - ((Player*)m_caster)->CastedCreatureOrGO(unit->GetEntry(),unit->GetGUID(),m_spellInfo->Id); + if( !((Creature*)unit)->isPet() && !IsAutoRepeat() && !IsNextMeleeSwingSpell() && !IsChannelActive() ) + { + if ( Player* p = GetPlayerForCastQuestCond() ) + p->CastedCreatureOrGO(unit->GetEntry(),unit->GetGUID(),m_spellInfo->Id); + } if(((Creature*)unit)->AI()) ((Creature*)unit)->AI()->SpellHit(m_caster ,m_spellInfo); @@ -1237,8 +1240,11 @@ void Spell::DoAllEffectOnTarget(GOTargetInfo *target) // cast at creature (or GO) quest objectives update at successful cast finished (+channel finished) // ignore autorepeat/melee casts for speed (not exist quest for spells (hm... ) - if( m_caster->GetTypeId() == TYPEID_PLAYER && !IsAutoRepeat() && !IsNextMeleeSwingSpell() && !IsChannelActive() ) - ((Player*)m_caster)->CastedCreatureOrGO(go->GetEntry(),go->GetGUID(),m_spellInfo->Id); + if( !IsAutoRepeat() && !IsNextMeleeSwingSpell() && !IsChannelActive() ) + { + if ( Player* p = GetPlayerForCastQuestCond() ) + p->CastedCreatureOrGO(go->GetEntry(),go->GetGUID(),m_spellInfo->Id); + } } void Spell::DoAllEffectOnTarget(ItemTargetInfo *target) @@ -2691,30 +2697,33 @@ void Spell::update(uint32 difftime) // channeled spell processed independently for quest targeting // cast at creature (or GO) quest objectives update at successful cast channel finished // ignore autorepeat/melee casts for speed (not exist quest for spells (hm... ) - if( m_caster->GetTypeId() == TYPEID_PLAYER && !IsAutoRepeat() && !IsNextMeleeSwingSpell() ) + if( !IsAutoRepeat() && !IsNextMeleeSwingSpell() ) { - for(std::list::iterator ihit= m_UniqueTargetInfo.begin();ihit != m_UniqueTargetInfo.end();++ihit) + if ( Player* p = GetPlayerForCastQuestCond() ) { - TargetInfo* target = &*ihit; - if(!IS_CREATURE_GUID(target->targetGUID)) - continue; + for(std::list::iterator ihit= m_UniqueTargetInfo.begin();ihit != m_UniqueTargetInfo.end();++ihit) + { + TargetInfo* target = &*ihit; + if(!IS_CREATURE_GUID(target->targetGUID)) + continue; - Unit* unit = m_caster->GetGUID()==target->targetGUID ? m_caster : ObjectAccessor::GetUnit(*m_caster,target->targetGUID); - if (unit==NULL) - continue; + Unit* unit = m_caster->GetGUID()==target->targetGUID ? m_caster : ObjectAccessor::GetUnit(*m_caster,target->targetGUID); + if (unit==NULL) + continue; - ((Player*)m_caster)->CastedCreatureOrGO(unit->GetEntry(),unit->GetGUID(),m_spellInfo->Id); - } + p->CastedCreatureOrGO(unit->GetEntry(),unit->GetGUID(),m_spellInfo->Id); + } - for(std::list::iterator ihit= m_UniqueGOTargetInfo.begin();ihit != m_UniqueGOTargetInfo.end();++ihit) - { - GOTargetInfo* target = &*ihit; + for(std::list::iterator ihit= m_UniqueGOTargetInfo.begin();ihit != m_UniqueGOTargetInfo.end();++ihit) + { + GOTargetInfo* target = &*ihit; - GameObject* go = m_caster->GetMap()->GetGameObject(target->targetGUID); - if(!go) - continue; + GameObject* go = m_caster->GetMap()->GetGameObject(target->targetGUID); + if(!go) + continue; - ((Player*)m_caster)->CastedCreatureOrGO(go->GetEntry(),go->GetGUID(),m_spellInfo->Id); + p->CastedCreatureOrGO(go->GetEntry(),go->GetGUID(),m_spellInfo->Id); + } } } diff --git a/src/game/Spell.h b/src/game/Spell.h index fc2eb2314..877a909bf 100644 --- a/src/game/Spell.h +++ b/src/game/Spell.h @@ -434,6 +434,17 @@ class Spell CurrentSpellTypes GetCurrentContainer(); + Player* GetPlayerForCastQuestCond() + { + if ( m_caster->GetTypeId() == TYPEID_PLAYER ) + return (Player*)m_caster; + + if ( Unit* u = m_caster->GetCharmerOrOwner() ) + if ( u->GetTypeId() == TYPEID_PLAYER ) + return (Player*)u; + + return NULL; + } Unit* GetCaster() const { return m_caster; } Unit* GetOriginalCaster() const { return m_originalCaster; } int32 GetPowerCost() const { return m_powerCost; } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 48b563913..bef2ee330 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 "7740" + #define REVISION_NR "7741" #endif // __REVISION_NR_H__ From 8168b0f2ebc575c25e5ccf163157bf950a017832 Mon Sep 17 00:00:00 2001 From: ApoC Date: Sat, 2 May 2009 00:26:42 +0200 Subject: [PATCH 4/5] [7742] Fix my prev. commit Use already defined method for getting charmer or owner player or player itself. Signed-off-by: ApoC --- src/game/Spell.cpp | 6 +++--- src/game/Spell.h | 11 ----------- src/shared/revision_nr.h | 2 +- 3 files changed, 4 insertions(+), 15 deletions(-) diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 36edd0105..41d7d2088 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -1093,7 +1093,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target) // ignore pets or autorepeat/melee casts for speed (not exist quest for spells (hm... ) if( !((Creature*)unit)->isPet() && !IsAutoRepeat() && !IsNextMeleeSwingSpell() && !IsChannelActive() ) { - if ( Player* p = GetPlayerForCastQuestCond() ) + if ( Player* p = m_caster->GetCharmerOrOwnerPlayerOrPlayerItself() ) p->CastedCreatureOrGO(unit->GetEntry(),unit->GetGUID(),m_spellInfo->Id); } @@ -1242,7 +1242,7 @@ void Spell::DoAllEffectOnTarget(GOTargetInfo *target) // ignore autorepeat/melee casts for speed (not exist quest for spells (hm... ) if( !IsAutoRepeat() && !IsNextMeleeSwingSpell() && !IsChannelActive() ) { - if ( Player* p = GetPlayerForCastQuestCond() ) + if ( Player* p = m_caster->GetCharmerOrOwnerPlayerOrPlayerItself() ) p->CastedCreatureOrGO(go->GetEntry(),go->GetGUID(),m_spellInfo->Id); } } @@ -2699,7 +2699,7 @@ void Spell::update(uint32 difftime) // ignore autorepeat/melee casts for speed (not exist quest for spells (hm... ) if( !IsAutoRepeat() && !IsNextMeleeSwingSpell() ) { - if ( Player* p = GetPlayerForCastQuestCond() ) + if ( Player* p = m_caster->GetCharmerOrOwnerPlayerOrPlayerItself() ) { for(std::list::iterator ihit= m_UniqueTargetInfo.begin();ihit != m_UniqueTargetInfo.end();++ihit) { diff --git a/src/game/Spell.h b/src/game/Spell.h index 877a909bf..fc2eb2314 100644 --- a/src/game/Spell.h +++ b/src/game/Spell.h @@ -434,17 +434,6 @@ class Spell CurrentSpellTypes GetCurrentContainer(); - Player* GetPlayerForCastQuestCond() - { - if ( m_caster->GetTypeId() == TYPEID_PLAYER ) - return (Player*)m_caster; - - if ( Unit* u = m_caster->GetCharmerOrOwner() ) - if ( u->GetTypeId() == TYPEID_PLAYER ) - return (Player*)u; - - return NULL; - } Unit* GetCaster() const { return m_caster; } Unit* GetOriginalCaster() const { return m_originalCaster; } int32 GetPowerCost() const { return m_powerCost; } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index bef2ee330..c192d31ba 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 "7741" + #define REVISION_NR "7742" #endif // __REVISION_NR_H__ From 434cbc2150c09e52585b9234bb81f51a49effc7d Mon Sep 17 00:00:00 2001 From: ApoC Date: Sat, 2 May 2009 00:08:38 +0200 Subject: [PATCH 5/5] [7743] Coding style fix. Signed-off-by: ApoC --- src/game/Unit.cpp | 7 +++---- src/shared/revision_nr.h | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index a2928a43e..c5cd3e97e 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -7344,10 +7344,9 @@ void Unit::ModifyAuraState(AuraState flag, bool apply) Unit *Unit::GetOwner() const { - uint64 ownerid = GetOwnerGUID(); - if(!ownerid) - return NULL; - return ObjectAccessor::GetUnit(*this, ownerid); + if(uint64 ownerid = GetOwnerGUID()) + return ObjectAccessor::GetUnit(*this, ownerid); + return NULL; } Unit *Unit::GetCharmer() const diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index c192d31ba..0ead86321 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 "7742" + #define REVISION_NR "7743" #endif // __REVISION_NR_H__