aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKito <kito@vortexirc.com>2016-03-31 16:21:50 +0200
committerShauren <shauren.trinity@gmail.com>2016-07-16 16:57:43 +0200
commit86275a397a478a30dad7e00af73029e2b15d4668 (patch)
tree3ddf7fa6955bf29d8fbc68c3117180ef88003fb3 /src
parent64f0691a27d6ef818a612913dde405ae90d9b4bc (diff)
Game/Entities: Players can attack targets when they are not facing them as long as they are in boundaryradius, this also applies for cone effect spells
Signed-off-by: Shauren <shauren.trinity@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp10
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp10
-rw-r--r--src/server/game/Entities/Unit/Unit.h2
-rw-r--r--src/server/game/Spells/Spell.cpp8
4 files changed, 23 insertions, 7 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index afcb58b3c42..83577b00283 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -1107,8 +1107,8 @@ void Player::Update(uint32 p_time)
m_swingErrorMsg = 1;
}
}
- //120 degrees of radiant range
- else if (!HasInArc(2 * float(M_PI) / 3, victim))
+ //120 degrees of radiant range, if player is not in boundary radius
+ else if (!IsWithinBoundaryRadius(victim) && !HasInArc(2 * float(M_PI) / 3, victim))
{
setAttackTimer(BASE_ATTACK, 100);
if (m_swingErrorMsg != 2) // send single time (client auto repeat)
@@ -1136,8 +1136,10 @@ void Player::Update(uint32 p_time)
{
if (!IsWithinMeleeRange(victim))
setAttackTimer(OFF_ATTACK, 100);
- else if (!HasInArc(2 * float(M_PI) / 3, victim))
- setAttackTimer(OFF_ATTACK, 100);
+ else if (!IsWithinBoundaryRadius(victim) && !HasInArc(2 * float(M_PI) / 3, victim))
+ {
+ setAttackTimer(BASE_ATTACK, 100);
+ }
else
{
// prevent base and off attack in same time, delay attack at 0.2 sec
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index f7e5fe94ac5..4fa16a53624 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -514,6 +514,16 @@ bool Unit::IsWithinMeleeRange(Unit const* obj) const
return distsq <= maxdist * maxdist;
}
+bool Unit::IsWithinBoundaryRadius(const Unit* obj) const
+{
+ if (!obj || !IsInMap(obj) || !IsInPhase(obj))
+ return false;
+
+ float objBoundaryRadius = std::max(obj->GetBoundaryRadius(), MIN_MELEE_REACH);
+
+ return IsInDist(obj, objBoundaryRadius);
+}
+
void Unit::GetRandomContactPoint(const Unit* obj, float &x, float &y, float &z, float distance2dMin, float distance2dMax) const
{
float combat_reach = GetCombatReach();
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 8f50f242e8e..3827b35451a 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1365,8 +1365,10 @@ class TC_GAME_API Unit : public WorldObject
bool CanDualWield() const { return m_canDualWield; }
virtual void SetCanDualWield(bool value) { m_canDualWield = value; }
float GetCombatReach() const { return m_floatValues[UNIT_FIELD_COMBATREACH]; }
+ float GetBoundaryRadius() const { return m_floatValues[UNIT_FIELD_BOUNDINGRADIUS]; }
bool IsWithinCombatRange(const Unit* obj, float dist2compare) const;
bool IsWithinMeleeRange(Unit const* obj) const;
+ bool IsWithinBoundaryRadius(const Unit* obj) const;
void GetRandomContactPoint(const Unit* target, float &x, float &y, float &z, float distance2dMin, float distance2dMax) const;
uint32 m_extraAttacks;
bool m_canDualWield;
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 976038a9408..56784c0a086 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -5995,7 +5995,8 @@ SpellCastResult Spell::CheckRange(bool strict)
return !(_triggeredCastFlags & TRIGGERED_DONT_REPORT_CAST_ERROR) ? SPELL_FAILED_OUT_OF_RANGE : SPELL_FAILED_DONT_REPORT;
if (m_caster->GetTypeId() == TYPEID_PLAYER &&
- (m_spellInfo->FacingCasterFlags & SPELL_FACING_FLAG_INFRONT) && !m_caster->HasInArc(static_cast<float>(M_PI), target))
+ (((m_spellInfo->FacingCasterFlags & SPELL_FACING_FLAG_INFRONT) && !m_caster->HasInArc(static_cast<float>(M_PI), target))
+ && !m_caster->IsWithinBoundaryRadius(target)))
return !(_triggeredCastFlags & TRIGGERED_DONT_REPORT_CAST_ERROR) ? SPELL_FAILED_UNIT_NOT_INFRONT : SPELL_FAILED_DONT_REPORT;
}
@@ -7650,8 +7651,9 @@ bool WorldObjectSpellConeTargetCheck::operator()(WorldObject* target)
}
else
{
- if (!_caster->isInFront(target, _coneAngle))
- return false;
+ if (!_caster->IsWithinBoundaryRadius(target->ToUnit()))
+ if (!_caster->isInFront(target, _coneAngle))
+ return false;
}
return WorldObjectSpellAreaTargetCheck::operator ()(target);
}