mirror of
https://github.com/mangosfour/server.git
synced 2025-12-28 04:37:04 +00:00
Note: all spells with effect expect additional code for redirection reset. Until code adding redirection work longer that expected. Signed-off-by: VladimirMangos <vladimir@getmangos.com> Patch partly rewrited with move new data into HostileRefManager and added redirection to threatAssist. Also bug fixed with redirection threat to unit not in hostile list yet.
194 lines
5.6 KiB
C++
194 lines
5.6 KiB
C++
/*
|
|
* Copyright (C) 2005-2010 MaNGOS <http://getmangos.com/>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#include "HostileRefManager.h"
|
|
#include "ThreatManager.h"
|
|
#include "Unit.h"
|
|
#include "DBCStructure.h"
|
|
#include "SpellMgr.h"
|
|
#include "Map.h"
|
|
|
|
HostileRefManager::HostileRefManager( Unit *pOwner ) : iOwner(pOwner), m_redirectionMod(0.0f)
|
|
{
|
|
|
|
}
|
|
|
|
HostileRefManager::~HostileRefManager()
|
|
{
|
|
deleteReferences();
|
|
}
|
|
|
|
//=================================================
|
|
// send threat to all my hateres for the pVictim
|
|
// The pVictim is hated than by them as well
|
|
// use for buffs and healing threat functionality
|
|
|
|
void HostileRefManager::threatAssist(Unit *pVictim, float pThreat, SpellEntry const *pThreatSpell, bool pSingleTarget)
|
|
{
|
|
float redirectedMod = pVictim->getHostileRefManager().GetThreatRedirectionMod();
|
|
Unit* redirectedTarget = redirectedMod ? pVictim->getHostileRefManager().GetThreatRedirectionTarget() : NULL;
|
|
|
|
uint32 size = pSingleTarget ? 1 : getSize(); // if pSingleTarget do not devide threat
|
|
HostileReference* ref = getFirst();
|
|
while(ref != NULL)
|
|
{
|
|
float threat = ThreatCalcHelper::calcThreat(pVictim, iOwner, pThreat, false, (pThreatSpell ? GetSpellSchoolMask(pThreatSpell) : SPELL_SCHOOL_MASK_NORMAL), pThreatSpell);
|
|
|
|
if (threat > 0.0f)
|
|
{
|
|
if (redirectedTarget && redirectedTarget != ref->getTarget() && redirectedTarget->isAlive())
|
|
{
|
|
float redirectedThreat = threat * redirectedMod;
|
|
threat -= redirectedThreat;
|
|
|
|
if(redirectedTarget == getOwner()) // It is faster to modify the threat durectly if possible
|
|
ref->addThreat(float (threat) / size);
|
|
else
|
|
ref->getSource()->addThreat(redirectedTarget, redirectedThreat);
|
|
}
|
|
}
|
|
|
|
if (pVictim == getOwner())
|
|
ref->addThreat(float (threat) / size); // It is faster to modify the threat durectly if possible
|
|
else
|
|
ref->getSource()->addThreat(pVictim, float (threat) / size);
|
|
|
|
ref = ref->next();
|
|
}
|
|
}
|
|
|
|
//=================================================
|
|
|
|
void HostileRefManager::addThreatPercent(int32 pValue)
|
|
{
|
|
HostileReference* ref;
|
|
|
|
ref = getFirst();
|
|
while(ref != NULL)
|
|
{
|
|
ref->addThreatPercent(pValue);
|
|
ref = ref->next();
|
|
}
|
|
}
|
|
|
|
//=================================================
|
|
// The online / offline status is given to the method. The calculation has to be done before
|
|
|
|
void HostileRefManager::setOnlineOfflineState(bool pIsOnline)
|
|
{
|
|
HostileReference* ref;
|
|
|
|
ref = getFirst();
|
|
while(ref != NULL)
|
|
{
|
|
ref->setOnlineOfflineState(pIsOnline);
|
|
ref = ref->next();
|
|
}
|
|
}
|
|
|
|
//=================================================
|
|
// The online / offline status is calculated and set
|
|
|
|
void HostileRefManager::updateThreatTables()
|
|
{
|
|
HostileReference* ref = getFirst();
|
|
while(ref)
|
|
{
|
|
ref->updateOnlineStatus();
|
|
ref = ref->next();
|
|
}
|
|
}
|
|
|
|
//=================================================
|
|
// The references are not needed anymore
|
|
// tell the source to remove them from the list and free the mem
|
|
|
|
void HostileRefManager::deleteReferences()
|
|
{
|
|
HostileReference* ref = getFirst();
|
|
while(ref)
|
|
{
|
|
HostileReference* nextRef = ref->next();
|
|
ref->removeReference();
|
|
delete ref;
|
|
ref = nextRef;
|
|
}
|
|
}
|
|
|
|
//=================================================
|
|
// delete one reference, defined by faction
|
|
|
|
void HostileRefManager::deleteReferencesForFaction(uint32 faction)
|
|
{
|
|
HostileReference* ref = getFirst();
|
|
while(ref)
|
|
{
|
|
HostileReference* nextRef = ref->next();
|
|
if(ref->getSource()->getOwner()->getFactionTemplateEntry()->faction == faction)
|
|
{
|
|
ref->removeReference();
|
|
delete ref;
|
|
}
|
|
ref = nextRef;
|
|
}
|
|
}
|
|
|
|
//=================================================
|
|
// delete one reference, defined by Unit
|
|
|
|
void HostileRefManager::deleteReference(Unit *pCreature)
|
|
{
|
|
HostileReference* ref = getFirst();
|
|
while(ref)
|
|
{
|
|
HostileReference* nextRef = ref->next();
|
|
if(ref->getSource()->getOwner() == pCreature)
|
|
{
|
|
ref->removeReference();
|
|
delete ref;
|
|
break;
|
|
}
|
|
ref = nextRef;
|
|
}
|
|
}
|
|
|
|
//=================================================
|
|
// set state for one reference, defined by Unit
|
|
|
|
void HostileRefManager::setOnlineOfflineState(Unit *pCreature,bool pIsOnline)
|
|
{
|
|
HostileReference* ref = getFirst();
|
|
while(ref)
|
|
{
|
|
HostileReference* nextRef = ref->next();
|
|
if(ref->getSource()->getOwner() == pCreature)
|
|
{
|
|
ref->setOnlineOfflineState(pIsOnline);
|
|
break;
|
|
}
|
|
ref = nextRef;
|
|
}
|
|
}
|
|
|
|
Unit* HostileRefManager::GetThreatRedirectionTarget() const
|
|
{
|
|
return !m_redirectionTargetGuid.IsEmpty() ? iOwner->GetMap()->GetUnit(m_redirectionTargetGuid) : NULL;
|
|
}
|
|
|
|
|
|
//=================================================
|