void ThreatManager::processThreatEvent(ThreatRefStatusChangeEvent* threatRefStatusChangeEvent) { threatRefStatusChangeEvent->setThreatManager(this); // now we can set the threat manager HostileReference* hostileReference = threatRefStatusChangeEvent->getReference(); switch(threatRefStatusChangeEvent->getType()) { case UEV_THREAT_REF_THREAT_CHANGE: if((getCurrentVictim() == hostileReference && threatRefStatusChangeEvent->getFValue()<0.0f) || (getCurrentVictim() != hostileReference && threatRefStatusChangeEvent->getFValue()>0.0f)) setDirty(true); // the order in the threat list might have changed break; case UEV_THREAT_REF_ONLINE_STATUS: if(!hostileReference->isOnline()) { if (hostileReference == getCurrentVictim()) { setCurrentVictim(NULL); setDirty(true); } if (getOwner() && getOwner()->IsInWorld()) if (Unit* target = ObjectAccessor::GetUnit(*getOwner(), hostileReference->getUnitGuid())) if (getOwner()->IsInMap(target)) getOwner()->SendThreatRemove(hostileReference); iThreatContainer.remove(hostileReference); iUpdateNeed = true; iThreatOfflineContainer.addReference(hostileReference); } else { if(getCurrentVictim() && hostileReference->getThreat() > (1.1f * getCurrentVictim()->getThreat())) setDirty(true); iThreatContainer.addReference(hostileReference); iUpdateNeed = true; iThreatOfflineContainer.remove(hostileReference); } break; case UEV_THREAT_REF_REMOVE_FROM_LIST: if (hostileReference == getCurrentVictim()) { setCurrentVictim(NULL); setDirty(true); } if(hostileReference->isOnline()) { if (getOwner() && getOwner()->IsInWorld()) if (Unit* target = ObjectAccessor::GetUnit(*getOwner(), hostileReference->getUnitGuid())) if (getOwner()->IsInMap(target)) getOwner()->SendThreatRemove(hostileReference); iThreatContainer.remove(hostileReference); iUpdateNeed = true; } else iThreatOfflineContainer.remove(hostileReference); break; } }
void ThreatManager::processThreatEvent(ThreatRefStatusChangeEvent* threatRefStatusChangeEvent) { threatRefStatusChangeEvent->setThreatManager(this); // now we can set the threat manager HostileReference* hostileReference = threatRefStatusChangeEvent->getReference(); switch (threatRefStatusChangeEvent->getType()) { case UEV_THREAT_REF_THREAT_CHANGE: if ((getCurrentVictim() == hostileReference && threatRefStatusChangeEvent->getFValue() < 0.0f) || (getCurrentVictim() != hostileReference && threatRefStatusChangeEvent->getFValue() > 0.0f)) { setDirty(true); // the order in the threat list might have changed } break; case UEV_THREAT_REF_ONLINE_STATUS: if (!hostileReference->isOnline()) { if (hostileReference == getCurrentVictim()) { setCurrentVictim(NULL); setDirty(true); } iThreatContainer.remove(hostileReference); iThreatOfflineContainer.addReference(hostileReference); } else { if (getCurrentVictim() && hostileReference->getThreat() > (1.1f * getCurrentVictim()->getThreat())) { setDirty(true); } iThreatContainer.addReference(hostileReference); iThreatOfflineContainer.remove(hostileReference); } break; case UEV_THREAT_REF_REMOVE_FROM_LIST: if (hostileReference == getCurrentVictim()) { setCurrentVictim(NULL); setDirty(true); } if (hostileReference->isOnline()) { iThreatContainer.remove(hostileReference); } else { iThreatOfflineContainer.remove(hostileReference); } break; } }
bool ThreatManager::processThreatEvent(const UnitBaseEvent* pUnitBaseEvent) { bool consumed = false; ThreatRefStatusChangeEvent* threatRefStatusChangeEvent; HostilReference* hostilReference; threatRefStatusChangeEvent = (ThreatRefStatusChangeEvent*) pUnitBaseEvent; threatRefStatusChangeEvent->setThreatManager(this); // now we can set the threat manager hostilReference = threatRefStatusChangeEvent->getReference(); switch(pUnitBaseEvent->getType()) { case UEV_THREAT_REF_THREAT_CHANGE: if((getCurrentVictim() == hostilReference && threatRefStatusChangeEvent->getFValue()<0.0f) || (getCurrentVictim() != hostilReference && threatRefStatusChangeEvent->getFValue()>0.0f)) setDirty(true); // the order in the threat list might have changed break; case UEV_THREAT_REF_ONLINE_STATUS: if(!hostilReference->isOnline()) { if (hostilReference == getCurrentVictim()) { setCurrentVictim(NULL); setDirty(true); } iThreatContainer.remove(hostilReference); iThreatOfflineContainer.addReference(hostilReference); } else { if(getCurrentVictim() && hostilReference->getThreat() > (1.1f * getCurrentVictim()->getThreat())) setDirty(true); iThreatContainer.addReference(hostilReference); iThreatOfflineContainer.remove(hostilReference); } break; case UEV_THREAT_REF_REMOVE_FROM_LIST: if (hostilReference == getCurrentVictim()) { setCurrentVictim(NULL); setDirty(true); } if(hostilReference->isOnline()) iThreatContainer.remove(hostilReference); else iThreatOfflineContainer.remove(hostilReference); break; } return consumed; }
Unit* ThreatManager::getHostileTarget() { iThreatContainer.update(); HostileReference* nextVictim = iThreatContainer.selectNextVictim((Creature*) getOwner(), getCurrentVictim()); setCurrentVictim(nextVictim); return getCurrentVictim() != nullptr ? getCurrentVictim()->getTarget() : nullptr; }
Unit* ThreatManager::getHostilTarget() { iThreatContainer.update(); HostileReference* nextVictim = iThreatContainer.selectNextVictim(getOwner()->ToCreature(), getCurrentVictim()); setCurrentVictim(nextVictim); return getCurrentVictim() != NULL ? getCurrentVictim()->getTarget() : NULL; }
void ThreatManager::_addThreat(Unit* victim, float threat) { HostileReference* ref = iThreatContainer.addThreat(victim, threat); // Ref is not in the online refs, search the offline refs next if (!ref) ref = iThreatOfflineContainer.addThreat(victim, threat); if (!ref) // there was no ref => create a new one { bool isFirst = iThreatContainer.empty(); // threat has to be 0 here HostileReference* hostileRef = new HostileReference(victim, this, 0); iThreatContainer.addReference(hostileRef); hostileRef->addThreat(threat); // now we add the real threat if (victim->GetTypeId() == TYPEID_PLAYER && victim->ToPlayer()->IsGameMaster()) hostileRef->setOnlineOfflineState(false); // GM is always offline else if (isFirst) setCurrentVictim(hostileRef); } }
void ThreatManager::setCurrentVictimByTarget(Unit* target) { if (HostileReference* ref = iThreatContainer.getReferenceByTarget(target)) setCurrentVictim(ref); }