*Allow pets to cast devour magic on both friends and enemies.
--HG-- branch : trunk
This commit is contained in:
@@ -788,7 +788,7 @@ enum Targets
|
||||
TARGET_PET = 5,
|
||||
//TARGET_UNIT_PET
|
||||
TARGET_CHAIN_DAMAGE = 6,
|
||||
//TARGET_UNIT_TARGET_ENEMY
|
||||
TARGET_UNIT_TARGET_ENEMY = 6,
|
||||
TARGET_UNIT_AREA_ENTRY = 7,
|
||||
TARGET_AREAEFFECT_CUSTOM = 8,
|
||||
//TARGET_UNIT_AREA_ENTRY_GROUND
|
||||
@@ -806,7 +806,7 @@ enum Targets
|
||||
TARGET_ALL_PARTY_AROUND_CASTER = 20,
|
||||
//TARGET_UNIT_PARTY_CASTER
|
||||
TARGET_SINGLE_FRIEND = 21,
|
||||
//TARGET_UNIT_TARGET_ALLY
|
||||
TARGET_UNIT_TARGET_ALLY = 21,
|
||||
TARGET_ALL_AROUND_CASTER = 22, // used only in TargetA, target selection dependent from TargetB
|
||||
//TARGET_DEST_CASTER
|
||||
TARGET_GAMEOBJECT = 23,
|
||||
@@ -833,7 +833,7 @@ enum Targets
|
||||
TARGET_ALL_PARTY_AROUND_CASTER_2 = 34, // used in Tranquility
|
||||
//TARGET_UNIT_AREA_PARTY_GROUND
|
||||
TARGET_SINGLE_PARTY = 35,
|
||||
//TARGET_UNIT_TARGET_PARTY
|
||||
TARGET_UNIT_TARGET_PARTY = 35,
|
||||
TARGET_DEST_CASTER_RANDOM_UNKNOWN = 36, //unknown
|
||||
TARGET_AREAEFFECT_PARTY = 37,
|
||||
//TARGET_UNIT_PARTY_TARGET
|
||||
@@ -864,7 +864,7 @@ enum Targets
|
||||
TARGET_RANDOM_RAID_MEMBER = 56,
|
||||
//TARGET_UNIT_AREA_RAID
|
||||
TARGET_SINGLE_FRIEND_2 = 57,
|
||||
//TARGET_UNIT_TARGET_RAID
|
||||
TARGET_UNIT_TARGET_RAID = 57,
|
||||
TARGET_UNIT_CONE_ALLY = 59,
|
||||
TARGET_UNIT_AREA_SCRIPT = 60,
|
||||
TARGET_AREAEFFECT_PARTY_AND_CLASS = 61,
|
||||
|
||||
+31
-20
@@ -4496,26 +4496,8 @@ int16 Spell::PetCanCast(Unit* target)
|
||||
if(!_target->isAlive())
|
||||
return SPELL_FAILED_BAD_TARGETS;
|
||||
|
||||
if(IsPositiveSpell(m_spellInfo->Id))
|
||||
{
|
||||
if(m_caster->IsHostileTo(_target))
|
||||
return SPELL_FAILED_BAD_TARGETS;
|
||||
}
|
||||
else
|
||||
{
|
||||
bool duelvsplayertar = false;
|
||||
for(int j=0;j<3;j++)
|
||||
{
|
||||
//TARGET_DUELVSPLAYER is positive AND negative
|
||||
duelvsplayertar |= (m_spellInfo->EffectImplicitTargetA[j] == TARGET_DUELVSPLAYER);
|
||||
}
|
||||
// AoE spells have the caster as their target
|
||||
// AOE spells should not have target
|
||||
if(m_caster->IsFriendlyTo(target) /*&& m_caster != target*/ && !duelvsplayertar)
|
||||
{
|
||||
return SPELL_FAILED_BAD_TARGETS;
|
||||
}
|
||||
}
|
||||
if(!IsValidSingleTargetSpell(_target))
|
||||
return SPELL_FAILED_BAD_TARGETS;
|
||||
}
|
||||
//cooldown
|
||||
if(((Creature*)m_caster)->HasSpellCooldown(m_spellInfo->Id))
|
||||
@@ -5553,3 +5535,32 @@ bool SpellEvent::IsDeletable() const
|
||||
{
|
||||
return m_Spell->IsDeletable();
|
||||
}
|
||||
|
||||
bool Spell::IsValidSingleTargetEffect(Unit const* target, Targets type) const
|
||||
{
|
||||
switch(type)
|
||||
{
|
||||
case TARGET_UNIT_TARGET_ENEMY:
|
||||
return !m_caster->IsFriendlyTo(target);
|
||||
case TARGET_UNIT_TARGET_ALLY:
|
||||
return m_caster->IsFriendlyTo(target);
|
||||
case TARGET_UNIT_TARGET_PARTY:
|
||||
return m_caster->IsInPartyWith(target);
|
||||
case TARGET_UNIT_TARGET_RAID:
|
||||
return m_caster->IsInRaidWith(target);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Spell::IsValidSingleTargetSpell(Unit const* target) const
|
||||
{
|
||||
for(int i = 0; i < 3; ++i)
|
||||
{
|
||||
if(!IsValidSingleTargetEffect(target, Targets(m_spellInfo->EffectImplicitTargetA[i])))
|
||||
return false;
|
||||
// Need to check B?
|
||||
//if(!IsValidSingleTargetEffect(m_spellInfo->EffectImplicitTargetB[i], target)
|
||||
// return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -537,6 +537,8 @@ class Spell
|
||||
SpellTargets TargetType, uint32 entry = 0);
|
||||
Unit* SearchNearbyTarget(float radius, SpellTargets TargetType, uint32 entry = 0);
|
||||
void SearchChainTarget(std::list<Unit*> &data, Unit* pUnitTarget, float max_range, uint32 unMaxTargets);
|
||||
bool IsValidSingleTargetEffect(Unit const* target, Targets type) const;
|
||||
bool IsValidSingleTargetSpell(Unit const* target) const;
|
||||
// -------------------------------------------
|
||||
|
||||
//List For Triggered Spells
|
||||
|
||||
+21
-1
@@ -8303,7 +8303,7 @@ Unit *Unit::GetCharmer() const
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Player* Unit::GetCharmerOrOwnerPlayerOrPlayerItself()
|
||||
Player* Unit::GetCharmerOrOwnerPlayerOrPlayerItself() const
|
||||
{
|
||||
uint64 guid = GetCharmerOrOwnerGUID();
|
||||
if(IS_PLAYER_GUID(guid))
|
||||
@@ -12834,4 +12834,24 @@ void Unit::SetConfused(bool apply)
|
||||
|
||||
if(GetTypeId() == TYPEID_PLAYER)
|
||||
((Player*)this)->SetClientControl(this, !apply);
|
||||
}
|
||||
|
||||
bool Unit::IsInPartyWith(Unit const *unit) const
|
||||
{
|
||||
const Player *p1 = GetCharmerOrOwnerPlayerOrPlayerItself();
|
||||
const Player *p2 = unit->GetCharmerOrOwnerPlayerOrPlayerItself();
|
||||
if(p1 && p2)
|
||||
return p1->IsInSameGroupWith(p2);
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Unit::IsInRaidWith(Unit const *unit) const
|
||||
{
|
||||
const Player *p1 = GetCharmerOrOwnerPlayerOrPlayerItself();
|
||||
const Player *p2 = unit->GetCharmerOrOwnerPlayerOrPlayerItself();
|
||||
if(p1 && p2)
|
||||
return p1->IsInSameRaidWith(p2);
|
||||
else
|
||||
return false;
|
||||
}
|
||||
+3
-1
@@ -871,6 +871,8 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
|
||||
bool IsHostileToPlayers() const;
|
||||
bool IsFriendlyTo(Unit const* unit) const;
|
||||
bool IsNeutralToAll() const;
|
||||
bool IsInPartyWith(Unit const* unit) const;
|
||||
bool IsInRaidWith(Unit const* unit) const;
|
||||
bool IsContestedGuard() const
|
||||
{
|
||||
if(FactionTemplateEntry const* entry = getFactionTemplateEntry())
|
||||
@@ -1055,7 +1057,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
|
||||
|
||||
return this;
|
||||
}
|
||||
Player* GetCharmerOrOwnerPlayerOrPlayerItself();
|
||||
Player* GetCharmerOrOwnerPlayerOrPlayerItself() const;
|
||||
|
||||
void SetPet(Pet* pet);
|
||||
void SetCharm(Unit* pet);
|
||||
|
||||
Reference in New Issue
Block a user