diff options
-rw-r--r-- | sql/FULL/world_spell_full.sql | 3 | ||||
-rw-r--r-- | sql/updates/4509_world_spell_linked_spell.sql | 1 | ||||
-rw-r--r-- | src/game/MovementHandler.cpp | 9 | ||||
-rw-r--r-- | src/game/SharedDefines.h | 4 | ||||
-rw-r--r-- | src/game/SpellAuras.cpp | 100 | ||||
-rw-r--r-- | src/game/SpellAuras.h | 1 | ||||
-rw-r--r-- | src/game/SpellMgr.cpp | 6 | ||||
-rw-r--r-- | src/game/Unit.cpp | 4 |
8 files changed, 115 insertions, 13 deletions
diff --git a/sql/FULL/world_spell_full.sql b/sql/FULL/world_spell_full.sql index c7391c34d35..adc11d4dc82 100644 --- a/sql/FULL/world_spell_full.sql +++ b/sql/FULL/world_spell_full.sql @@ -33,9 +33,6 @@ INSERT INTO `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comm (-49011, 49009, 0, 'Wyvern Sting'), (-49012, 49010, 0, 'Wyvern Sting'), ( 47585, 60069, 0, 'Dispersion (transform/regen)'), -( 48265, 49772, 2, 'Unholy Presence'), -( 49772, 55222, 2, 'Unholy Presence'), -( 48263, 61261, 2, 'Frost Presence'), ( 61847, 61848, 2, 'Aspect of te dragonhawk'), ( 61846, 61848, 2, 'Aspect of te dragonhawk'), ( 47988, 54501, 2, 'Consume Shadows - Rank 9'), diff --git a/sql/updates/4509_world_spell_linked_spell.sql b/sql/updates/4509_world_spell_linked_spell.sql new file mode 100644 index 00000000000..d672b2a564a --- /dev/null +++ b/sql/updates/4509_world_spell_linked_spell.sql @@ -0,0 +1 @@ +DELETE FROM `spell_linked_spell` WHERE `spell_trigger` IN (48265, 49772, 48263); diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index 58bc5004e1f..18e84092ddf 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -70,11 +70,14 @@ void WorldSession::HandleMoveWorldportAckOpcode() Map * newMap = MapManager::Instance().CreateMap(loc.mapid, GetPlayer()); if (!newMap) { - sLog.outCrash("map %d could not be created for player "UI64FMTD, loc.mapid, GetPlayer()->GetGUID()); - assert (false); + sLog.outError("Map %d could not be created for player %d, porting player to homebind", loc.mapid, GetPlayer()->GetGUIDLow()); + GetPlayer()->RelocateToHomebind(); + newMap = MapManager::Instance().CreateMap(GetPlayer()->GetMapId(), GetPlayer()); } + else + GetPlayer()->Relocate(loc.coord_x, loc.coord_y, loc.coord_z, loc.orientation); + GetPlayer()->SetMap(newMap); - GetPlayer()->Relocate(loc.coord_x, loc.coord_y, loc.coord_z, loc.orientation); GetPlayer()->SendInitialPacketsBeforeAddToMap(); // the CanEnter checks are done in TeleporTo but conditions may change diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h index 1a9d5e470a4..748e81e89e0 100644 --- a/src/game/SharedDefines.h +++ b/src/game/SharedDefines.h @@ -2270,7 +2270,9 @@ enum CorpseDynFlags #define SPELL_ID_WEAPON_SWITCH_COOLDOWN_1_0s 6123 #define SPELL_ID_AUTOSHOT 75 // used for checks in other spells interruption #define SPELL_ID_SHADOWMELD 58984 // used for check ignore stealth stance state - +#define SPELL_ID_BLOOD_PRESENCE 48266 // Blood Presence +#define SPELL_ID_FROST_PRESENCE 48263 // Frost Presence +#define SPELL_ID_UNHOLY_PRESENCE 48265 // Unholy Presence enum WeatherType { WEATHER_TYPE_FINE = 0, diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 0338bb01ff6..3e9324366a4 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -944,6 +944,101 @@ void Aura::ApplyAllModifiers(bool apply, bool Real) m_partAuras[i]->ApplyModifier(apply, Real); } +void Aura::HandleAuraSpecificMods(bool apply) +{ + if (GetSpellSpecific(m_spellProto->Id) == SPELL_PRESENCE) + { + AuraEffect *bloodPresenceAura=0; // healing by damage done + AuraEffect *frostPresenceAura=0; // increased health + AuraEffect *unholyPresenceAura=0; // increased movement speed, faster rune recovery + + // Improved Presences + Unit::AuraEffectList const& vDummyAuras = m_target->GetAurasByType(SPELL_AURA_DUMMY); + for(Unit::AuraEffectList::const_iterator itr = vDummyAuras.begin(); itr != vDummyAuras.end(); ++itr) + { + switch((*itr)->GetId()) + { + // Improved Blood Presence + case 50365: + case 50371: + { + bloodPresenceAura = (*itr); + break; + } + // Improved Frost Presence + case 50384: + case 50385: + { + frostPresenceAura = (*itr); + break; + } + // Improved Unholy Presence + case 50391: + case 50392: + { + unholyPresenceAura = (*itr); + break; + } + } + } + + uint32 presence=GetId(); + if (apply) + { + // Blood Presence bonus + if (presence == SPELL_ID_BLOOD_PRESENCE) + m_target->CastSpell(m_target,63611,true); + else if (bloodPresenceAura) + { + int32 basePoints1=bloodPresenceAura->GetAmount(); + m_target->CastCustomSpell(m_target,63611,NULL,&basePoints1,NULL,true,0,bloodPresenceAura); + } + // Frost Presence bonus + if (presence == SPELL_ID_FROST_PRESENCE) + m_target->CastSpell(m_target,61261,true); + else if (frostPresenceAura) + { + int32 basePoints0=frostPresenceAura->GetAmount(); + m_target->CastCustomSpell(m_target,61261,&basePoints0,NULL,NULL,true,0,frostPresenceAura); + } + // Unholy Presence bonus + if (presence == SPELL_ID_UNHOLY_PRESENCE) + { + if(unholyPresenceAura) + { + // Not listed as any effect, only base points set + int32 basePoints0 = unholyPresenceAura->GetSpellProto()->EffectBasePoints[1]; + //m_target->CastCustomSpell(m_target,63622,&basePoints0 ,NULL,NULL,true,0,unholyPresenceAura); + m_target->CastCustomSpell(m_target,65095,&basePoints0 ,NULL,NULL,true,0,unholyPresenceAura); + } + m_target->CastSpell(m_target,49772, true); + } + else if (unholyPresenceAura) + { + int32 basePoints0=unholyPresenceAura->GetAmount(); + m_target->CastCustomSpell(m_target,49772,&basePoints0,NULL,NULL,true,0,unholyPresenceAura); + } + } + else + { + // Remove passive auras + if (presence == SPELL_ID_BLOOD_PRESENCE || bloodPresenceAura) + m_target->RemoveAurasDueToSpell(63611); + if (presence == SPELL_ID_FROST_PRESENCE || frostPresenceAura) + m_target->RemoveAurasDueToSpell(61261); + if (presence == SPELL_ID_UNHOLY_PRESENCE || unholyPresenceAura) + { + if(presence == SPELL_ID_UNHOLY_PRESENCE && unholyPresenceAura) + { + //m_target->RemoveAurasDueToSpell(63622); + m_target->RemoveAurasDueToSpell(65095); + } + m_target->RemoveAurasDueToSpell(49772); + } + } + } +} + void Aura::SendAuraUpdate() { if (m_auraSlot>=MAX_AURAS) @@ -1155,6 +1250,8 @@ void Aura::_AddAura() } m_target->ApplyModFlag(UNIT_FIELD_AURASTATE, GetAuraStateMask(), true); + + HandleAuraSpecificMods(true); } bool Aura::SetPartAura(AuraEffect* aurEff, uint8 effIndex) @@ -1283,6 +1380,7 @@ void Aura::_RemoveAura() caster->ProcDamageAndSpell(m_target,ProcCaster, ProcVictim, procEx, m_procDamage, BASE_ATTACK, m_spellProto); } } + HandleAuraSpecificMods(false); } void Aura::SetStackAmount(uint8 stackAmount, bool applied) @@ -2504,7 +2602,7 @@ void AuraEffect::HandleAuraDummy(bool apply, bool Real, bool changeAmount) m_spellProto->SpellFamilyFlags[0] & 0x4) { // Must be casting target - if (!m_target->IsNonMeleeSpellCasted(false)) + if (!m_target->IsNonMeleeSpellCasted(false, false, true)) return; if (AuraEffect * aurEff = caster->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_WARRIOR, 2775, 0)) { diff --git a/src/game/SpellAuras.h b/src/game/SpellAuras.h index 4c37eeb121f..942d0c574b3 100644 --- a/src/game/SpellAuras.h +++ b/src/game/SpellAuras.h @@ -119,6 +119,7 @@ class TRINITY_DLL_SPEC Aura m_target->HandleAuraEffect(m_partAuras[i], apply); } void ApplyAllModifiers(bool apply, bool Real=false); + void HandleAuraSpecificMods(bool apply); void Update(uint32 diff); diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index 7b32cf729b7..75482eb44a8 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -452,8 +452,8 @@ SpellSpecific GetSpellSpecific(uint32 spellId) if (spellInfo->SpellFamilyFlags[0] & 0x11010002) return SPELL_BLESSING; - - if ((spellInfo->SpellFamilyFlags[1] & 0x000008 || spellInfo->SpellFamilyFlags[0] & 0x20180400) && (spellInfo->AttributesEx3 & 0x200)) + // Judgement of Wisdom, Judgement of Light, Judgement of Justice + if (spellInfo->Id == 20184 || spellInfo->Id == 20185 || spellInfo->Id == 20186) return SPELL_JUDGEMENT; for (int i = 0; i < 3; ++i) @@ -476,7 +476,7 @@ SpellSpecific GetSpellSpecific(uint32 spellId) return spellmgr.GetSpellElixirSpecific(spellInfo->Id); case SPELLFAMILY_DEATHKNIGHT: - if ((spellInfo->Attributes & 0x10) && (spellInfo->AttributesEx2 & 0x10) && (spellInfo->AttributesEx4 & 0x200000)) + if (spellInfo->Id == SPELL_ID_BLOOD_PRESENCE || spellInfo->Id == SPELL_ID_FROST_PRESENCE || spellInfo->Id == SPELL_ID_UNHOLY_PRESENCE) return SPELL_PRESENCE; break; } diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index a4bb8ecdeaf..69e22885691 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -7531,8 +7531,8 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, AuraEffect* trig return false; } } - // Blood Presence - else if (auraSpellInfo->Id == 48266) + // Blood Presence (Improved) + else if (auraSpellInfo->Id == 63611) { if (GetTypeId() != TYPEID_PLAYER) return false; |