aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/SharedDefines.h8
-rw-r--r--src/game/Spell.cpp51
-rw-r--r--src/game/Spell.h2
-rw-r--r--src/game/Unit.cpp22
-rw-r--r--src/game/Unit.h4
5 files changed, 61 insertions, 26 deletions
diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h
index 3f04e510b20..3edc724b7a8 100644
--- a/src/game/SharedDefines.h
+++ b/src/game/SharedDefines.h
@@ -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,
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index 916bc984883..53009674d9d 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -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;
+} \ No newline at end of file
diff --git a/src/game/Spell.h b/src/game/Spell.h
index 79cfe0a2a62..3d9494f8a36 100644
--- a/src/game/Spell.h
+++ b/src/game/Spell.h
@@ -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
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 51fb5262855..ec3f687f0e6 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -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;
} \ No newline at end of file
diff --git a/src/game/Unit.h b/src/game/Unit.h
index 9113ed7bae0..258c4f0ffd7 100644
--- a/src/game/Unit.h
+++ b/src/game/Unit.h
@@ -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);