diff options
-rw-r--r-- | src/game/SharedDefines.h | 8 | ||||
-rw-r--r-- | src/game/Spell.cpp | 51 | ||||
-rw-r--r-- | src/game/Spell.h | 2 | ||||
-rw-r--r-- | src/game/Unit.cpp | 22 | ||||
-rw-r--r-- | src/game/Unit.h | 4 |
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); |