diff options
| author | Spp <spp@jorge.gr> | 2011-12-27 10:05:49 +0100 |
|---|---|---|
| committer | Spp <spp@jorge.gr> | 2011-12-27 10:15:27 +0100 |
| commit | fa9daaf95b9f09f3a442087cbc59abc782814c63 (patch) | |
| tree | c24fe99837993c101de77df1416fde629c993817 /src/server/game/Spells | |
| parent | 8323027e0c15e97e5da5ec0948c447273321d43f (diff) | |
| parent | 317628902462c371dc29ec984803fbfb6412402c (diff) | |
Merge branch 'master' into 4.x and some warning fixes
Diffstat (limited to 'src/server/game/Spells')
| -rwxr-xr-x | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 20 | ||||
| -rwxr-xr-x | src/server/game/Spells/Auras/SpellAuras.cpp | 1 | ||||
| -rwxr-xr-x | src/server/game/Spells/Spell.cpp | 44 | ||||
| -rwxr-xr-x | src/server/game/Spells/Spell.h | 2 | ||||
| -rwxr-xr-x | src/server/game/Spells/SpellEffects.cpp | 30 | ||||
| -rwxr-xr-x | src/server/game/Spells/SpellMgr.cpp | 7 |
6 files changed, 60 insertions, 44 deletions
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 9c4341ec59a..916fca7e1ce 100755 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -2821,7 +2821,7 @@ void AuraEffect::HandleAuraMounted(AuraApplication const* aurApp, uint8 mode, bo } else { - target->Unmount(); + target->Dismount(); //some mounts like Headless Horseman's Mount or broom stick are skill based spell // need to remove ALL arura related to mounts, this will stop client crash with broom stick // and never endless flying after using Headless Horseman's Mount @@ -4784,10 +4784,13 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool break; case 63322: // Saronite Vapors { - int32 mana = int32(GetAmount() * pow(2.0f, GetBase()->GetStackAmount())); // mana restore - bp * 2^stackamount - int32 damage = mana * 2; // damage - caster->CastCustomSpell(target, 63337, &mana, NULL, NULL, true); - caster->CastCustomSpell(target, 63338, &damage, NULL, NULL, true); + if (caster) + { + int32 mana = int32(GetAmount() * pow(2.0f, GetBase()->GetStackAmount())); // mana restore - bp * 2^stackamount + int32 damage = mana * 2; // damage + caster->CastCustomSpell(target, 63337, &mana, NULL, NULL, true); + caster->CastCustomSpell(target, 63338, &damage, NULL, NULL, true); + } break; } case 71563: @@ -4795,9 +4798,8 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool newAura->SetStackAmount(newAura->GetSpellInfo()->StackAmount); break; case 59628: // Tricks of the Trade - if (!caster->GetMisdirectionTarget()) - break; - target->SetReducedThreatPercent(100,caster->GetMisdirectionTarget()->GetGUID()); + if (caster && caster->GetMisdirectionTarget()) + target->SetReducedThreatPercent(100, caster->GetMisdirectionTarget()->GetGUID()); break; } } @@ -5198,7 +5200,7 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool if (!(mode & AURA_EFFECT_HANDLE_REAL)) break; // Sentry Totem - if (GetId() == 6495 && caster->GetTypeId() == TYPEID_PLAYER) + if (GetId() == 6495 && caster && caster->GetTypeId() == TYPEID_PLAYER) { if (apply) { diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index ffe3b0084a9..66fd5177654 100755 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -1342,6 +1342,7 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b if (removeMode != AURA_REMOVE_BY_EXPIRE) break; target->CastSpell(target, 32612, true, NULL, GetEffect(1)); + target->CombatStop(); break; case 74396: // Fingers of Frost // Remove the IGNORE_AURASTATE aura diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 7ac3e04bc3b..3ce6a398a46 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2034,7 +2034,7 @@ uint32 Spell::SelectEffectTargets(uint32 i, SpellImplicitTargetInfo const& cur) float max_dis = m_spellInfo->GetMaxRange(true); float dis = (float)rand_norm() * (max_dis - min_dis) + min_dis; float x, y, z, angle; - angle = (float)rand_norm() * static_cast<float>(M_PI * 70.0f / 180.0f) - static_cast<float>(M_PI * 35.0f / 180.0f); + angle = (float)rand_norm() * static_cast<float>(M_PI * 35.0f / 180.0f) - static_cast<float>(M_PI * 17.5f / 180.0f); m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE, dis, angle); m_targets.SetDst(x, y, z, m_caster->GetOrientation()); break; @@ -3255,6 +3255,12 @@ void Spell::handle_immediate() m_caster->AddInterruptMask(m_spellInfo->ChannelInterruptFlags); SendChannelStart(duration); } + else if (duration == -1) + { + m_spellState = SPELL_STATE_CASTING; + m_caster->AddInterruptMask(m_spellInfo->ChannelInterruptFlags); + SendChannelStart(duration); + } } PrepareTargetProcessing(); @@ -3280,7 +3286,6 @@ void Spell::handle_immediate() if (m_spellInfo->IsRangedWeaponSpell() && m_spellInfo->IsChanneled()) TakeAmmo(); - if (m_spellState != SPELL_STATE_CASTING) finish(true); // successfully finish spell cast (not last in case autorepeat or channel spell) } @@ -3479,9 +3484,9 @@ void Spell::update(uint32 difftime) { case SPELL_STATE_PREPARING: { - if (m_timer) + if (m_timer > 0) { - if (difftime >= m_timer) + if (difftime >= (uint32)m_timer) m_timer = 0; else m_timer -= difftime; @@ -3490,10 +3495,11 @@ void Spell::update(uint32 difftime) if (m_timer == 0 && !IsNextMeleeSwingSpell() && !IsAutoRepeat()) // don't CheckCast for instant spells - done in spell::prepare, skip duplicate checks, needed for range checks for example cast(!m_casttime); - } break; + break; + } case SPELL_STATE_CASTING: { - if (m_timer > 0) + if (m_timer) { // check if there are alive targets left if (!UpdateChanneledTargetList()) @@ -3503,10 +3509,13 @@ void Spell::update(uint32 difftime) finish(); } - if (difftime >= m_timer) - m_timer = 0; - else - m_timer -= difftime; + if (m_timer > 0) + { + if (difftime >= (uint32)m_timer) + m_timer = 0; + else + m_timer -= difftime; + } } if (m_timer == 0) @@ -3548,10 +3557,10 @@ void Spell::update(uint32 difftime) finish(); } - } break; + break; + } default: - { - }break; + break; } } @@ -3783,7 +3792,7 @@ void Spell::SendSpellStart() data << uint8(m_cast_count); // pending spell cast? data << uint32(m_spellInfo->Id); // spellId data << uint32(castFlags); // cast flags - data << uint32(m_timer); // delay? + data << int32(m_timer); // delay? m_targets.Write(data); @@ -5607,7 +5616,8 @@ SpellCastResult Spell::CheckRange(bool strict) if (m_spellInfo->RangeEntry) { - // self cast is used for triggered spells, no range checking needed + // check needed by 68766 51693 - both spells are cast on enemies and have 0 max range + // these are triggered by other spells - possibly we should omit range check in that case? if (m_spellInfo->RangeEntry->ID == 1) return SPELL_CAST_OK; @@ -6184,7 +6194,7 @@ void Spell::Delayed() // only called in DealDamage() AddPctN(delaytime, -delayReduce); - if (int32(m_timer) + delaytime > m_casttime) + if (m_timer + delaytime > m_casttime) { delaytime = m_casttime - m_timer; m_timer = m_casttime; @@ -6219,7 +6229,7 @@ void Spell::DelayedChannel() AddPctN(delaytime, -delayReduce); - if (int32(m_timer) <= delaytime) + if (m_timer <= delaytime) { delaytime = m_timer; m_timer = 0; diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index f9a48bf6a87..b3357783477 100755 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -646,7 +646,7 @@ class Spell // ------------------------------------------- uint32 m_spellState; - uint32 m_timer; + int32 m_timer; TriggerCastFlags _triggeredCastFlags; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index be8db537065..d0518191bb3 100755 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -2176,19 +2176,9 @@ void Spell::EffectSendEvent(SpellEffIndex effIndex) && effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - //! it's possible for spells with this spell effect to either have a target or no target - //! in case of a target, we will execute this handler on SPELL_EFFECT_HANDLE_HIT_TARGET - //! with all relevant variables, and we will skip SPELL_EFFECT_HANDLE_HIT - if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT) - { - if (GetSpellInfo()->Effects[effIndex].TargetA.GetTarget() != 0 || - GetSpellInfo()->Effects[effIndex].TargetB.GetTarget() != 0) - return; - } - WorldObject* target = NULL; - // call events for target if present + // call events for object target if present if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT_TARGET) { if (unitTarget) @@ -2196,9 +2186,15 @@ void Spell::EffectSendEvent(SpellEffIndex effIndex) else if (gameObjTarget) target = gameObjTarget; } - // call event with no target or focus target when no targets could be found due to no dbc entry - else if (!m_spellInfo->Effects[effIndex].GetProvidedTargetMask()) + else // if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT) { + // let's prevent executing effect handler twice in case when spell effect is capable of targeting an object + // this check was requested by scripters, but it has some downsides: + // now it's impossible to script (using sEventScripts) a cast which misses all targets + // or to have an ability to script the moment spell hits dest (in a case when there are object targets present) + if (m_spellInfo->Effects[effIndex].GetProvidedTargetMask() & (TARGET_FLAG_UNIT_MASK | TARGET_FLAG_GAMEOBJECT_MASK)) + return; + // some spells have no target entries in dbc and they use focus target if (focusObject) target = focusObject; // TODO: there should be a possibility to pass dest target to event script @@ -2619,8 +2615,8 @@ void Spell::EffectPersistentAA(SpellEffIndex effIndex) // Caster not in world, might be spell triggered from aura removal if (!caster->IsInWorld()) return; - DynamicObject* dynObj = new DynamicObject(); - if (!dynObj->CreateDynamicObject(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), caster, m_spellInfo->Id, *m_targets.GetDst(), radius, false, DYNAMIC_OBJECT_AREA_SPELL)) + DynamicObject* dynObj = new DynamicObject(false); + if (!dynObj->CreateDynamicObject(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), caster, m_spellInfo->Id, *m_targets.GetDst(), radius, DYNAMIC_OBJECT_AREA_SPELL)) { delete dynObj; return; @@ -3468,8 +3464,8 @@ void Spell::EffectAddFarsight(SpellEffIndex effIndex) if (!m_caster->IsInWorld()) return; - DynamicObject* dynObj = new DynamicObject(); - if (!dynObj->CreateDynamicObject(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), m_caster, m_spellInfo->Id, *m_targets.GetDst(), radius, true, DYNAMIC_OBJECT_FARSIGHT_FOCUS)) + DynamicObject* dynObj = new DynamicObject(true); + if (!dynObj->CreateDynamicObject(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), m_caster, m_spellInfo->Id, *m_targets.GetDst(), radius, DYNAMIC_OBJECT_FARSIGHT_FOCUS)) { delete dynObj; return; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 21c32ca57b2..dde8c6869e4 100755 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3149,6 +3149,9 @@ void SpellMgr::LoadDbcDataCorrections() case 64904: // Hymn of Hope spellInfo->EffectApplyAuraName[EFFECT_1] = SPELL_AURA_MOD_INCREASE_ENERGY_PERCENT; break; + case 19465: // Improved Stings (Rank 2) + spellInfo->EffectImplicitTargetA[EFFECT_2] = TARGET_UNIT_CASTER; + break; case 30421: // Nether Portal - Perseverence spellInfo->EffectBasePoints[2] += 30000; break; @@ -3227,6 +3230,10 @@ void SpellMgr::LoadDbcDataCorrections() // this needs research on modifier applying rules, does not seem to be in Attributes fields spellInfo->EffectSpellClassMask[0] = flag96(0x00000040, 0x00000000, 0x00000000); break; + case 63163: // Apply Enchanted Bridle (Argent Tournament) + spellInfo->EffectDieSides[0] = 0; // was 1, that should probably mean seat 0, but instead it's treated as spell 1 + spellInfo->EffectBasePoints[0] = 52391; // Ride Vehicle (forces seat 0) + break; case 19970: // Entangling Roots (Rank 6) -- Nature's Grasp Proc case 19971: // Entangling Roots (Rank 5) -- Nature's Grasp Proc case 19972: // Entangling Roots (Rank 4) -- Nature's Grasp Proc |
