*Spell target selection update.

--HG--
branch : trunk
This commit is contained in:
megamage
2008-12-23 20:01:05 -06:00
parent 5154f51633
commit afc598bde2
6 changed files with 67 additions and 204 deletions
+4 -4
View File
@@ -813,7 +813,7 @@ enum Targets
TARGET_EFFECT_SELECT = 18, // highly depends on the spell effect TARGET_EFFECT_SELECT = 18, // highly depends on the spell effect
TARGET_DEST_CASTER_GROUND = 18, TARGET_DEST_CASTER_GROUND = 18,
TARGET_ALL_PARTY_AROUND_CASTER = 20, TARGET_ALL_PARTY_AROUND_CASTER = 20,
//TARGET_UNIT_PARTY_CASTER TARGET_UNIT_PARTY_CASTER = 20,
TARGET_SINGLE_FRIEND = 21, TARGET_SINGLE_FRIEND = 21,
TARGET_UNIT_TARGET_ALLY = 21, TARGET_UNIT_TARGET_ALLY = 21,
TARGET_ALL_AROUND_CASTER = 22, // used only in TargetA, target selection dependent from TargetB TARGET_ALL_AROUND_CASTER = 22, // used only in TargetA, target selection dependent from TargetB
@@ -837,14 +837,14 @@ enum Targets
TARGET_MINION = 32, TARGET_MINION = 32,
//TARGET_DEST_SUMMON //TARGET_DEST_SUMMON
TARGET_ALL_PARTY = 33, TARGET_ALL_PARTY = 33,
//TARGET_UNIT_AREA_PARTY TARGET_UNIT_AREA_PARTY = 33,
TARGET_ALL_PARTY_AROUND_CASTER_2 = 34, // used in Tranquility TARGET_ALL_PARTY_AROUND_CASTER_2 = 34, // used in Tranquility
//TARGET_UNIT_AREA_PARTY_GROUND TARGET_UNIT_AREA_PARTY_GROUND = 34,
TARGET_SINGLE_PARTY = 35, TARGET_SINGLE_PARTY = 35,
TARGET_UNIT_TARGET_PARTY = 35, TARGET_UNIT_TARGET_PARTY = 35,
TARGET_DEST_CASTER_RANDOM_UNKNOWN = 36, //unknown TARGET_DEST_CASTER_RANDOM_UNKNOWN = 36, //unknown
TARGET_AREAEFFECT_PARTY = 37, TARGET_AREAEFFECT_PARTY = 37,
//TARGET_UNIT_PARTY_TARGET TARGET_UNIT_PARTY_TARGET = 37,
TARGET_SCRIPT = 38, TARGET_SCRIPT = 38,
//TARGET_UNIT_NEARBY_ENTRY //TARGET_UNIT_NEARBY_ENTRY
TARGET_UNIT_CASTER_FISHING = 39, TARGET_UNIT_CASTER_FISHING = 39,
+12 -159
View File
@@ -1491,9 +1491,13 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
case TARGET_UNIT_TARGET_ALLY: case TARGET_UNIT_TARGET_ALLY:
case TARGET_UNIT_TARGET_RAID: case TARGET_UNIT_TARGET_RAID:
case TARGET_UNIT_TARGET_ANY: // SelectMagnetTarget()? case TARGET_UNIT_TARGET_ANY: // SelectMagnetTarget()?
case TARGET_UNIT_TARGET_PARTY:
case TARGET_UNIT_SINGLE_UNKNOWN: case TARGET_UNIT_SINGLE_UNKNOWN:
TagUnitMap.push_back(m_targets.getUnitTarget()); TagUnitMap.push_back(m_targets.getUnitTarget());
break; break;
case TARGET_UNIT_PARTY_TARGET:
m_caster->GetPartyMember(TagUnitMap, radius);
break;
case TARGET_UNIT_TARGET_ENEMY: case TARGET_UNIT_TARGET_ENEMY:
if(Unit* pUnitTarget = SelectMagnetTarget()) if(Unit* pUnitTarget = SelectMagnetTarget())
{ {
@@ -1748,170 +1752,18 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
break; break;
} }
case TARGET_ALL_PARTY_AROUND_CASTER: case TARGET_UNIT_AREA_PARTY_GROUND:
case TARGET_ALL_PARTY_AROUND_CASTER_2: m_targets.m_targetMask |= TARGET_FLAG_DEST_LOCATION;
case TARGET_ALL_PARTY: case TARGET_UNIT_PARTY_CASTER:
{ case TARGET_UNIT_AREA_PARTY:
Player *pTarget = m_caster->GetCharmerOrOwnerPlayerOrPlayerItself(); m_caster->GetPartyMember(TagUnitMap, radius);
Group *pGroup = pTarget ? pTarget->GetGroup() : NULL; break;
if(pGroup)
{
uint8 subgroup = pTarget->GetSubGroup();
for(GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
{
Player* Target = itr->getSource();
// IsHostileTo check duel and controlled by enemy
if( Target && Target->GetSubGroup()==subgroup && !m_caster->IsHostileTo(Target) )
{
if( m_caster->IsWithinDistInMap(Target, radius) )
TagUnitMap.push_back(Target);
if(Pet* pet = Target->GetPet())
if( m_caster->IsWithinDistInMap(pet, radius) )
TagUnitMap.push_back(pet);
}
}
}
else
{
Unit* ownerOrSelf = pTarget ? pTarget : m_caster->GetCharmerOrOwnerOrSelf();
if(ownerOrSelf==m_caster || m_caster->IsWithinDistInMap(ownerOrSelf, radius))
TagUnitMap.push_back(ownerOrSelf);
if(Pet* pet = ownerOrSelf->GetPet())
if( m_caster->IsWithinDistInMap(pet, radius) )
TagUnitMap.push_back(pet);
}
}break;
case TARGET_RANDOM_RAID_MEMBER: case TARGET_RANDOM_RAID_MEMBER:
{ {
if (m_caster->GetTypeId() == TYPEID_PLAYER) if (m_caster->GetTypeId() == TYPEID_PLAYER)
if(Player* target = ((Player*)m_caster)->GetNextRandomRaidMember(radius)) if(Player* target = ((Player*)m_caster)->GetNextRandomRaidMember(radius))
TagUnitMap.push_back(target); TagUnitMap.push_back(target);
}break; }break;
// TARGET_SINGLE_PARTY means that the spells can only be casted on a party member and not on the caster (some seals, fire shield from imp, etc..)
case TARGET_SINGLE_PARTY:
{
Unit *target = m_targets.getUnitTarget();
// Thoses spells apparently can't be casted on the caster.
if( target && target != m_caster)
{
// Can only be casted on group's members or its pets
Group *pGroup = NULL;
Unit* owner = m_caster->GetCharmerOrOwner();
Unit *targetOwner = target->GetCharmerOrOwner();
if(owner)
{
if(owner->GetTypeId() == TYPEID_PLAYER)
{
if( target == owner )
{
TagUnitMap.push_back(target);
break;
}
pGroup = ((Player*)owner)->GetGroup();
}
}
else if (m_caster->GetTypeId() == TYPEID_PLAYER)
{
if( targetOwner == m_caster && target->GetTypeId()==TYPEID_UNIT && ((Creature*)target)->isPet())
{
TagUnitMap.push_back(target);
break;
}
pGroup = ((Player*)m_caster)->GetGroup();
}
if(pGroup)
{
// Our target can also be a player's pet who's grouped with us or our pet. But can't be controlled player
if(targetOwner)
{
if( targetOwner->GetTypeId() == TYPEID_PLAYER &&
target->GetTypeId()==TYPEID_UNIT && (((Creature*)target)->isPet()) &&
target->GetOwnerGUID()==targetOwner->GetGUID() &&
pGroup->IsMember(((Player*)targetOwner)->GetGUID()))
{
TagUnitMap.push_back(target);
}
}
// 1Our target can be a player who is on our group
else if (target->GetTypeId() == TYPEID_PLAYER && pGroup->IsMember(((Player*)target)->GetGUID()))
{
TagUnitMap.push_back(target);
}
}
}
}break;
case TARGET_AREAEFFECT_PARTY:
{
Unit* owner = m_caster->GetCharmerOrOwner();
Player *pTarget = NULL;
if(owner)
{
TagUnitMap.push_back(m_caster);
if(owner->GetTypeId() == TYPEID_PLAYER)
pTarget = (Player*)owner;
}
else if (m_caster->GetTypeId() == TYPEID_PLAYER)
{
if(Unit* target = m_targets.getUnitTarget())
{
if( target->GetTypeId() != TYPEID_PLAYER)
{
if(((Creature*)target)->isPet())
{
Unit *targetOwner = target->GetOwner();
if(targetOwner->GetTypeId() == TYPEID_PLAYER)
pTarget = (Player*)targetOwner;
}
}
else
pTarget = (Player*)target;
}
}
Group* pGroup = pTarget ? pTarget->GetGroup() : NULL;
if(pGroup)
{
uint8 subgroup = pTarget->GetSubGroup();
for(GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
{
Player* Target = itr->getSource();
// IsHostileTo check duel and controlled by enemy
if(Target && Target->GetSubGroup()==subgroup && !m_caster->IsHostileTo(Target))
{
if( pTarget->IsWithinDistInMap(Target, radius) )
TagUnitMap.push_back(Target);
if(Pet* pet = Target->GetPet())
if( pTarget->IsWithinDistInMap(pet, radius) )
TagUnitMap.push_back(pet);
}
}
}
else if (owner)
{
if(m_caster->IsWithinDistInMap(owner, radius))
TagUnitMap.push_back(owner);
}
else if(pTarget)
{
TagUnitMap.push_back(pTarget);
if(Pet* pet = pTarget->GetPet())
if( m_caster->IsWithinDistInMap(pet, radius) )
TagUnitMap.push_back(pet);
}
}break;
case TARGET_CHAIN_HEAL: case TARGET_CHAIN_HEAL:
{ {
Unit* pUnitTarget = m_targets.getUnitTarget(); Unit* pUnitTarget = m_targets.getUnitTarget();
@@ -5445,9 +5297,10 @@ bool Spell::IsValidSingleTargetEffect(Unit const* target, Targets type) const
case TARGET_UNIT_TARGET_ENEMY: case TARGET_UNIT_TARGET_ENEMY:
return !m_caster->IsFriendlyTo(target); return !m_caster->IsFriendlyTo(target);
case TARGET_UNIT_TARGET_ALLY: case TARGET_UNIT_TARGET_ALLY:
case TARGET_UNIT_PARTY_TARGET:
return m_caster->IsFriendlyTo(target); return m_caster->IsFriendlyTo(target);
case TARGET_UNIT_TARGET_PARTY: case TARGET_UNIT_TARGET_PARTY:
return m_caster->IsInPartyWith(target); return m_caster != target && m_caster->IsInPartyWith(target);
case TARGET_UNIT_TARGET_RAID: case TARGET_UNIT_TARGET_RAID:
return m_caster->IsInRaidWith(target); return m_caster->IsInRaidWith(target);
} }
+6 -41
View File
@@ -596,66 +596,31 @@ void AreaAura::Update(uint32 diff)
if( !caster->hasUnitState(UNIT_STAT_ISOLATED) ) if( !caster->hasUnitState(UNIT_STAT_ISOLATED) )
{ {
Unit* owner = caster->GetCharmerOrOwner();
if (!owner)
owner = caster;
std::list<Unit *> targets; std::list<Unit *> targets;
switch(m_areaAuraType) switch(m_areaAuraType)
{ {
case AREA_AURA_PARTY: case AREA_AURA_PARTY:
{ caster->GetPartyMember(targets, m_radius);
Group *pGroup = NULL;
if (owner->GetTypeId() == TYPEID_PLAYER)
pGroup = ((Player*)owner)->GetGroup();
if( pGroup)
{
uint8 subgroup = ((Player*)owner)->GetSubGroup();
for(GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
{
Player* Target = itr->getSource();
if(Target && Target->isAlive() && Target->GetSubGroup()==subgroup && caster->IsFriendlyTo(Target))
{
if(caster->IsWithinDistInMap(Target, m_radius))
targets.push_back(Target);
Pet *pet = Target->GetPet();
if(pet && pet->isAlive() && caster->IsWithinDistInMap(pet, m_radius))
targets.push_back(pet);
}
}
}
else
{
// add owner
if( owner != caster && caster->IsWithinDistInMap(owner, m_radius) )
targets.push_back(owner);
// add caster's pet
Unit* pet = caster->GetPet();
if( pet && caster->IsWithinDistInMap(pet, m_radius))
targets.push_back(pet);
}
break; break;
}
case AREA_AURA_FRIEND: case AREA_AURA_FRIEND:
{ {
Trinity::AnyFriendlyUnitInObjectRangeCheck u_check(caster, owner, m_radius); Trinity::AnyFriendlyUnitInObjectRangeCheck u_check(caster, caster, m_radius);
Trinity::UnitListSearcher<Trinity::AnyFriendlyUnitInObjectRangeCheck> searcher(targets, u_check); Trinity::UnitListSearcher<Trinity::AnyFriendlyUnitInObjectRangeCheck> searcher(targets, u_check);
caster->GetMap()->VisitAll(caster->GetPositionX(), caster->GetPositionY(), m_radius, searcher); caster->VisitNearbyObject(m_radius, searcher);
break; break;
} }
case AREA_AURA_ENEMY: case AREA_AURA_ENEMY:
{ {
Trinity::AnyAoETargetUnitInObjectRangeCheck u_check(caster, owner, m_radius); // No GetCharmer in searcher Trinity::AnyAoETargetUnitInObjectRangeCheck u_check(caster, caster, m_radius); // No GetCharmer in searcher
Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck> searcher(targets, u_check); Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck> searcher(targets, u_check);
caster->GetMap()->VisitAll(caster->GetPositionX(), caster->GetPositionY(), m_radius, searcher); caster->VisitNearbyObject(m_radius, searcher);
break; break;
} }
case AREA_AURA_OWNER: case AREA_AURA_OWNER:
case AREA_AURA_PET: case AREA_AURA_PET:
{ {
if(owner != caster) if(Unit *owner = caster->GetCharmerOrOwner())
targets.push_back(owner); targets.push_back(owner);
break; break;
} }
+2
View File
@@ -88,6 +88,8 @@ SpellMgr::SpellMgr()
case TARGET_UNIT_TARGET_ANY: case TARGET_UNIT_TARGET_ANY:
case TARGET_UNIT_SINGLE_UNKNOWN: case TARGET_UNIT_SINGLE_UNKNOWN:
case TARGET_UNIT_TARGET_ENEMY: case TARGET_UNIT_TARGET_ENEMY:
case TARGET_UNIT_TARGET_PARTY:
case TARGET_UNIT_PARTY_TARGET:
SpellTargetType[i] = TARGET_TYPE_UNIT_TARGET; SpellTargetType[i] = TARGET_TYPE_UNIT_TARGET;
break; break;
case TARGET_UNIT_CHANNEL: case TARGET_UNIT_CHANNEL:
+41
View File
@@ -12943,6 +12943,47 @@ bool Unit::IsInRaidWith(Unit const *unit) const
return false; return false;
} }
void Unit::GetRaidMember(std::list<Unit*> &TagUnitMap, float radius)
{
}
void Unit::GetPartyMember(std::list<Unit*> &TagUnitMap, float radius)
{
Unit *owner = GetCharmerOrOwnerOrSelf();
Group *pGroup = NULL;
if (owner->GetTypeId() == TYPEID_PLAYER)
pGroup = ((Player*)owner)->GetGroup();
if(pGroup)
{
uint8 subgroup = ((Player*)owner)->GetSubGroup();
for(GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
{
Player* Target = itr->getSource();
// IsHostileTo check duel and controlled by enemy
if( Target && Target->GetSubGroup()==subgroup && !IsHostileTo(Target) )
{
if(Target->isAlive() && IsWithinDistInMap(Target, radius) )
TagUnitMap.push_back(Target);
if(Pet* pet = Target->GetPet())
if(pet->isAlive() && IsWithinDistInMap(pet, radius) )
TagUnitMap.push_back(pet);
}
}
}
else
{
if(owner->isAlive() && (owner == this || IsWithinDistInMap(owner, radius)))
TagUnitMap.push_back(owner);
if(Pet* pet = owner->GetPet())
if(pet->isAlive() && (pet == this && IsWithinDistInMap(pet, radius)))
TagUnitMap.push_back(pet);
}
}
void Unit::AddAura(uint32 spellId, Unit* target) void Unit::AddAura(uint32 spellId, Unit* target)
{ {
if(!target) if(!target)
+2
View File
@@ -875,6 +875,8 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
bool IsNeutralToAll() const; bool IsNeutralToAll() const;
bool IsInPartyWith(Unit const* unit) const; bool IsInPartyWith(Unit const* unit) const;
bool IsInRaidWith(Unit const* unit) const; bool IsInRaidWith(Unit const* unit) const;
void GetPartyMember(std::list<Unit*> &units, float dist);
void GetRaidMember(std::list<Unit*> &units, float dist);
bool IsContestedGuard() const bool IsContestedGuard() const
{ {
if(FactionTemplateEntry const* entry = getFactionTemplateEntry()) if(FactionTemplateEntry const* entry = getFactionTemplateEntry())