void DynamicObject::Update(uint32 p_time) { // caster can be not in world at time dynamic object update, but dynamic object not yet deleted in Unit destructor Unit* caster = GetCaster(); if(!caster) { Delete(); return; } bool deleteThis = false; if(m_aliveDuration > int32(p_time)) m_aliveDuration -= p_time; else deleteThis = true; if(m_effMask) { if(m_updateTimer < p_time) { Trinity::DynamicObjectUpdater notifier(*this,caster); VisitNearbyObject(GetRadius(), notifier); m_updateTimer = 500; // is this official-like? }else m_updateTimer -= p_time; } if(deleteThis) { caster->RemoveDynObjectWithGUID(GetGUID()); Delete(); } }
void DynamicObject::Update(uint32 p_time) { // caster can be not in world at time dynamic object update, but dynamic object not yet deleted in Unit destructor Unit* caster = GetCaster(); if (!caster) { Delete(); return; } bool deleteThis = false; if (m_aliveDuration > int32(p_time)) m_aliveDuration -= p_time; else deleteThis = true; if (m_effIndex < 4) { if (m_updateTimer < p_time) { Trinity::DynamicObjectUpdater notifier(*this, caster); VisitNearbyObject(GetRadius(), notifier); m_updateTimer = 500; // is this official-like? }else m_updateTimer -= p_time; } if (deleteThis) { caster->RemoveDynObjectWithGUID(GetGUID()); Delete(); } // Shifting naaru silver if (m_spellId == 45043) { if (GetDistance(caster) <= m_radius && !deleteThis) { if (!caster->HasAura(45044, 0 )) caster->CastSpell(caster, 45044, true); } else if (caster->HasAura(45044, 0)) caster->RemoveAurasDueToSpell(45044); } }
void AreaTrigger::Update(uint32 p_time) { if (GetDuration() > int32(p_time)) _duration -= p_time; else Remove(); // expired WorldObject::Update(p_time); SpellInfo const* m_spellInfo = sSpellMgr->GetSpellInfo(GetUInt32Value(AREATRIGGER_SPELLID)); if (!m_spellInfo) return; if (!GetCaster()) { Remove(); return; } Unit* caster = GetCaster(); float radius = 0.0f; // Custom MoP Script switch (m_spellInfo->Id) { case 102793:// Ursol's Vortex { std::list<Unit*> targetList; radius = 8.0f; SurgeCore::NearestAttackableUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::NearestAttackableUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); if (!targetList.empty()) for (auto itr : targetList) if (!itr->HasAura(127797)) caster->CastSpell(itr, 127797, true); break; } case 115460:// Healing Sphere { std::list<Unit*> targetList; radius = 1.0f; SurgeCore::AnyFriendlyUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::AnyFriendlyUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); if (!targetList.empty()) { for (auto itr : targetList) { caster->CastSpell(itr, 115464, true); // Healing Sphere heal SetDuration(0); return; } } break; } case 115817:// Cancel Barrier { std::list<Unit*> targetList; radius = 6.0f; SurgeCore::AnyFriendlyUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::AnyFriendlyUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); if (!targetList.empty()) for (auto itr : targetList) itr->CastSpell(itr, 115856, true); break; } case 116011:// Rune of Power { std::list<Unit*> targetList; bool affected = false; radius = 2.25f; SurgeCore::AnyFriendlyUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::AnyFriendlyUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); if (!targetList.empty()) { for (auto itr : targetList) { if (itr->GetGUID() == caster->GetGUID()) { caster->CastSpell(itr, 116014, true); // Rune of Power affected = true; if (caster->ToPlayer()) caster->ToPlayer()->UpdateManaRegen(); return; } } } if (!affected) caster->RemoveAura(116014); break; } case 116235:// Amethyst Pool { std::list<Unit*> targetList; radius = 10.0f; SurgeCore::NearestAttackableUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::NearestAttackableUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); if (!targetList.empty()) { for (auto itr : targetList) { // Amethyst Pool - Periodic Damage if (itr->GetDistance(this) > 3.5f) itr->RemoveAura(130774); else if (!itr->HasAura(130774)) caster->CastSpell(itr, 130774, true); } } break; } case 116546:// Draw Power { std::list<Unit*> targetList; radius = 30.0f; SurgeCore::NearestAttackableUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::NearestAttackableUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); for (auto itr : targetList) { if (itr->IsInAxe(caster, this, 2.0f)) { if (!itr->HasAura(116663)) caster->AddAura(116663, itr); } else itr->RemoveAurasDueToSpell(116663); } break; } case 117032:// Healing Sphere (Afterlife) { std::list<Unit*> targetList; radius = 1.0f; SurgeCore::AnyFriendlyUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::AnyFriendlyUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); if (!targetList.empty()) { for (auto itr : targetList) { if (itr->GetGUID() == caster->GetGUID()) { caster->CastSpell(itr, 125355, true); // Heal for 15% of life SetDuration(0); return; } } } break; } case 119031:// Gift of the Serpent (Mastery) { std::list<Unit*> targetList; radius = 1.0f; SurgeCore::AnyFriendlyUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::AnyFriendlyUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); if (!targetList.empty()) { for (auto itr : targetList) { caster->CastSpell(itr, 124041, true); // Gift of the Serpent heal SetDuration(0); return; } } break; } case 121286:// Chi Sphere (Afterlife) { std::list<Unit*> targetList; radius = 1.0f; SurgeCore::AnyFriendlyUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::AnyFriendlyUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); if (!targetList.empty()) { for (auto itr : targetList) { if (itr->GetGUID() == caster->GetGUID()) { caster->CastSpell(itr, 121283, true); // Restore 1 Chi SetDuration(0); return; } } } break; } case 121536:// Angelic Feather { std::list<Unit*> targetList; radius = 1.0f; SurgeCore::AnyFriendlyUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::AnyFriendlyUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); if (!targetList.empty()) { for (auto itr : targetList) { caster->CastSpell(itr, 121557, true); // Angelic Feather increase speed SetDuration(0); return; } } break; } case 122035:// Path of Blossom { std::list<Unit*> targetList; radius = 1.0f; SurgeCore::NearestAttackableUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::NearestAttackableUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); if (!targetList.empty()) { for (auto itr : targetList) { caster->CastSpell(itr, 122036, true); // Path of Blossom damage SetDuration(0); return; } } break; } case 124503:// Gift of the Ox case 124506:// Gift of the Ox² { std::list<Unit*> targetList; radius = 1.0f; SurgeCore::AnyFriendlyUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::AnyFriendlyUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); for (auto itr : targetList) { if (itr->GetGUID() != caster->GetGUID()) continue; caster->CastSpell(itr, 124507, true); // Gift of the Ox - Heal SetDuration(0); return; } break; } default: break; } }