void ThreatManager::tauntApply(Unit* taunter) { HostileReference* ref = iThreatContainer.getReferenceByTarget(taunter); if (getCurrentVictim() && ref && (ref->getThreat() < getCurrentVictim()->getThreat())) { if (ref->getTempThreatModifier() == 0.0f) // Ok, temp threat is unused ref->setTempThreat(getCurrentVictim()->getThreat()); } }
float ThreatManager::getThreatWithoutTemp(Unit* victim, bool alsoSearchOfflineList) { float threat = 0.0f; HostileReference* ref = iThreatContainer.getReferenceByTarget(victim); if (!ref && alsoSearchOfflineList) ref = iThreatOfflineContainer.getReferenceByTarget(victim); if (ref) threat = ref->getThreat() - ref->getTempThreatModifier();; return threat; }
void HostileRefManager::addTempThreat(float threat, bool apply) { HostileReference* ref = getFirst(); while (ref) { if (apply) { if (ref->getTempThreatModifier() == 0.0f) ref->addTempThreat(threat); } else ref->resetTempThreat(); ref = ref->next(); } }
void InitializeAI() { CasterAI::InitializeAI(); Unit* owner = me->GetOwner(); if (!owner) return; // Clone Me! owner->CastSpell(me, SPELL_MAGE_CLONE_ME, true); // xinef: Glyph of Mirror Image (4th copy) float angle = 0.0f; switch (me->GetUInt32Value(UNIT_CREATED_BY_SPELL)) { case SPELL_SUMMON_MIRROR_IMAGE1: angle = 0.5f * M_PI; break; case SPELL_SUMMON_MIRROR_IMAGE2: angle = M_PI; break; case SPELL_SUMMON_MIRROR_IMAGE3: angle = 1.5f * M_PI; break; } ((Minion*)me)->SetFollowAngle(angle); if (owner->IsInCombat()) me->NearTeleportTo(me->GetPositionX() + cos(angle)*dist, me->GetPositionY() + sin(angle)*dist, me->GetPositionZ(), me->GetOrientation(), false, false, false, false); else me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, me->GetFollowAngle(), MOTION_SLOT_ACTIVE); me->SetReactState(REACT_DEFENSIVE); // Xinef: Inherit Master's Threat List (not yet implemented) //owner->CastSpell((Unit*)NULL, SPELL_MAGE_MASTERS_THREAT_LIST, true); HostileReference* ref = owner->getHostileRefManager().getFirst(); while (ref) { if (Unit* unit = ref->GetSource()->GetOwner()) unit->AddThreat(me, ref->getThreat() - ref->getTempThreatModifier()); ref = ref->next(); } _ebonGargoyleGUID = 0; // Xinef: copy caster auras Unit::VisibleAuraMap const* visibleAuraMap = owner->GetVisibleAuras(); for (Unit::VisibleAuraMap::const_iterator itr = visibleAuraMap->begin(); itr != visibleAuraMap->end(); ++itr) if (Aura* visAura = itr->second->GetBase()) { // Ebon Gargoyle if (visAura->GetId() == 49206 && me->GetUInt32Value(UNIT_CREATED_BY_SPELL) == SPELL_SUMMON_MIRROR_IMAGE1) { if (Unit* gargoyle = visAura->GetCaster()) _ebonGargoyleGUID = gargoyle->GetGUID(); continue; } SpellScriptsBounds bounds = sObjectMgr->GetSpellScriptsBounds(visAura->GetId()); if (bounds.first != bounds.second) continue; std::vector<int32> const* spellTriggered = sSpellMgr->GetSpellLinked(visAura->GetId() + SPELL_LINK_AURA); if (!spellTriggered || !spellTriggered->empty()) continue; if (Aura* newAura = me->AddAura(visAura->GetId(), me)) newAura->SetDuration(visAura->GetDuration()); } me->m_Events.AddEvent(new DeathEvent(*me), me->m_Events.CalculateTime(29500)); }