HostilReference* ThreatContainer::addThreat(Unit* pVictim, float pThreat) { HostilReference* ref = getReferenceByTarget(pVictim); if(ref) ref->addThreat(pThreat); return ref; }
void ThreatManager::addThreat(Unit* pVictim, float pThreat, SpellSchools pSchool, SpellEntry const *pThreatSpell) { //function deals with adding threat and adding players and pets into ThreatList //mobs, NPCs, guards have ThreatList and HateOfflineList //players and pets have only InHateListOf //HateOfflineList is used co contain unattackable victims (in-flight, in-water, GM etc.) if (pVictim == getOwner()) // only for same creatures :) return; if(!pVictim || (pVictim->GetTypeId() == TYPEID_PLAYER && ((Player*)pVictim)->isGameMaster()) ) return; assert(getOwner()->GetTypeId()== TYPEID_UNIT); float threat = ThreatCalcHelper::calcThreat(pVictim, iOwner, pThreat, pSchool, pThreatSpell); HostilReference* ref = iThreatContainer.addThreat(pVictim, threat); // Ref is not in the online refs, search the offline refs next if(!ref) ref = iThreatOfflineContainer.addThreat(pVictim, threat); if(!ref) // there was no ref => create a new one { // threat has to be 0 here HostilReference* hostilReference = new HostilReference(pVictim, this, 0); iThreatContainer.addReference(hostilReference); hostilReference->addThreat(threat); // now we add the real threat if(pVictim->GetTypeId() == TYPEID_PLAYER && ((Player*)pVictim)->isGameMaster()) hostilReference->setOnlineOfflineState(false); // GM is always offline } }
void HostilRefManager::threatAssist(Unit *pVictim, float fThreat, SpellEntry const *pThreatSpell, bool pSingleTarget) { HostilReference* ref; float size = pSingleTarget ? 1.0f : getSize(); // if pSingleTarget do not divide threat ref = getFirst(); while(ref != NULL) { float threat = ThreatCalcHelper::calcThreat(pVictim, iOwner, fThreat, (pThreatSpell ? GetSpellSchoolMask(pThreatSpell) : SPELL_SCHOOL_MASK_NORMAL), pThreatSpell); if(pVictim == getOwner()) ref->addThreat(threat / size); // It is faster to modify the threat durectly if possible else ref->getSource()->addThreat(pVictim, threat / size); ref = ref->next(); } }
void ThreatManager::_addThreat(Unit *pVictim, float threat) { HostilReference* ref = iThreatContainer.addThreat(pVictim, threat); // Ref is not in the online refs, search the offline refs next if(!ref) ref = iThreatOfflineContainer.addThreat(pVictim, threat); if(!ref) // there was no ref => create a new one { // threat has to be 0 here HostilReference* hostilReference = new HostilReference(pVictim, this, 0); iThreatContainer.addReference(hostilReference); hostilReference->addThreat(threat); // now we add the real threat if(pVictim->GetTypeId() == TYPEID_PLAYER && ((Player*)pVictim)->isGameMaster()) hostilReference->setOnlineOfflineState(false); // GM is always offline } }
void HostilRefManager::threatAssist(Unit *pVictim, float pThreat, SpellEntry const *pThreatSpell, bool pSingleTarget) { if (iOwner->hasUnitState(UNIT_STAT_IGNORE_ATTACKERS)) return; HostilReference* ref; uint32 size = pSingleTarget ? 1 : getSize(); // if pSingleTarget do not divide threat ref = getFirst(); while (ref != NULL) { float threat = ThreatCalcHelper::calcThreat(pVictim, iOwner, pThreat, (pThreatSpell ? SpellMgr::GetSpellSchoolMask(pThreatSpell) : SPELL_SCHOOL_MASK_NORMAL), pThreatSpell); if (pVictim == getOwner()) ref->addThreat(float (threat) / size); // It is faster to modify the threat directly if possible else ref->getSource()->addThreat(pVictim, float (threat) / size); ref = ref->next(); } }