diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Object/Position.cpp | 19 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Position.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 15 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 2 | ||||
-rw-r--r-- | src/server/game/Movement/MotionMaster.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Movement/MotionMaster.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 10 | ||||
-rw-r--r-- | src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp | 2 | ||||
-rw-r--r-- | src/server/scripts/Northrend/zone_grizzly_hills.cpp | 2 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_generic.cpp | 2 |
10 files changed, 23 insertions, 37 deletions
diff --git a/src/server/game/Entities/Object/Position.cpp b/src/server/game/Entities/Object/Position.cpp index dc8c24c78b0..b969a5492a9 100644 --- a/src/server/game/Entities/Object/Position.cpp +++ b/src/server/game/Entities/Object/Position.cpp @@ -62,25 +62,6 @@ Position Position::GetPositionWithOffset(Position const& offset) const return ret; } -void Position::GetSinCos(const float x, const float y, float &vsin, float &vcos) const -{ - float dx = GetPositionX() - x; - float dy = GetPositionY() - y; - - if (std::fabs(dx) < 0.001f && std::fabs(dy) < 0.001f) - { - float o = NormalizeOrientation(GetOrientation() - M_PI); - vcos = std::cos(o); - vsin = std::sin(o); - } - else - { - float dist = std::sqrt((dx*dx) + (dy*dy)); - vcos = dx / dist; - vsin = dy / dist; - } -} - bool Position::IsWithinBox(Position const& center, float xradius, float yradius, float zradius) const { // rotate the WorldObject position instead of rotating the whole cube, that way we can make a simplified diff --git a/src/server/game/Entities/Object/Position.h b/src/server/game/Entities/Object/Position.h index b082e661d51..0954169e756 100644 --- a/src/server/game/Entities/Object/Position.h +++ b/src/server/game/Entities/Object/Position.h @@ -138,8 +138,6 @@ public: float GetRelativeAngle(Position const& pos) const { return ToRelativeAngle(GetAbsoluteAngle(pos)); } float GetRelativeAngle(Position const* pos) const { return ToRelativeAngle(GetAbsoluteAngle(pos)); } - void GetSinCos(float x, float y, float &vsin, float &vcos) const; - bool IsInDist2d(float x, float y, float dist) const { return GetExactDist2dSq(x, y) < dist * dist; } bool IsInDist2d(Position const* pos, float dist) const { return GetExactDist2dSq(pos) < dist * dist; } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index ef3e30948f1..3659f304091 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -11526,7 +11526,7 @@ void Unit::SendMoveKnockBack(Player* player, float speedXY, float speedZ, float player->GetSession()->SendPacket(moveKnockBack.Write()); } -void Unit::KnockbackFrom(float x, float y, float speedXY, float speedZ, Movement::SpellEffectExtraData const* spellEffectExtraData /*= nullptr*/) +void Unit::KnockbackFrom(Position const& origin, float speedXY, float speedZ, Movement::SpellEffectExtraData const* spellEffectExtraData /*= nullptr*/) { Player* player = ToPlayer(); if (!player) @@ -11540,11 +11540,18 @@ void Unit::KnockbackFrom(float x, float y, float speedXY, float speedZ, Movement } if (!player) - GetMotionMaster()->MoveKnockbackFrom(x, y, speedXY, speedZ, spellEffectExtraData); + GetMotionMaster()->MoveKnockbackFrom(origin, speedXY, speedZ, spellEffectExtraData); else { - float vcos, vsin; - GetSinCos(x, y, vsin, vcos); + float o = GetPosition() == origin ? GetOrientation() + M_PI : origin.GetRelativeAngle(this); + if (speedXY < 0) + { + speedXY = -speedXY; + o = o - M_PI; + } + + float vcos = std::cos(o); + float vsin = std::sin(o); SendMoveKnockBack(player, speedXY, -speedZ, vcos, vsin); } } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index b05419ead5f..71bd838afd2 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1185,7 +1185,7 @@ class TC_GAME_API Unit : public WorldObject void UpdateHeight(float newZ); void SendMoveKnockBack(Player* player, float speedXY, float speedZ, float vcos, float vsin); - void KnockbackFrom(float x, float y, float speedXY, float speedZ, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr); + void KnockbackFrom(Position const& origin, float speedXY, float speedZ, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr); void JumpTo(float speedXY, float speedZ, bool forward = true); void JumpTo(WorldObject* obj, float speedZ, bool withOrientation = false); diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index b03fbd08497..b7c76bd4431 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -728,7 +728,7 @@ void MotionMaster::MoveCharge(PathGenerator const& path, float speed /*= SPEED_C init.Launch(); } -void MotionMaster::MoveKnockbackFrom(float srcX, float srcY, float speedXY, float speedZ, Movement::SpellEffectExtraData const* spellEffectExtraData /*= nullptr*/) +void MotionMaster::MoveKnockbackFrom(Position const& origin, float speedXY, float speedZ, Movement::SpellEffectExtraData const* spellEffectExtraData /*= nullptr*/) { // This function may make players fall below map if (_owner->GetTypeId() == TYPEID_PLAYER) @@ -742,7 +742,7 @@ void MotionMaster::MoveKnockbackFrom(float srcX, float srcY, float speedXY, floa float dist = 2 * moveTimeHalf * speedXY; float max_height = -Movement::computeFallElevation(moveTimeHalf, false, -speedZ); - _owner->GetNearPoint(_owner, x, y, z, dist, _owner->GetAbsoluteAngle(srcX, srcY) + float(M_PI)); + _owner->GetNearPoint(_owner, x, y, z, dist, _owner->GetAbsoluteAngle(origin) + float(M_PI)); Movement::MoveSplineInit init(_owner); init.MoveTo(x, y, z); diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h index c02c71d3b53..3414be5a750 100644 --- a/src/server/game/Movement/MotionMaster.h +++ b/src/server/game/Movement/MotionMaster.h @@ -157,7 +157,7 @@ class TC_GAME_API MotionMaster void MoveTakeoff(uint32 id, Position const& pos); void MoveCharge(float x, float y, float z, float speed = SPEED_CHARGE, uint32 id = EVENT_CHARGE, bool generatePath = false, Unit const* target = nullptr, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr); void MoveCharge(PathGenerator const& path, float speed = SPEED_CHARGE, Unit const* target = nullptr, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr); - void MoveKnockbackFrom(float srcX, float srcY, float speedXY, float speedZ, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr); + void MoveKnockbackFrom(Position const& origin, float speedXY, float speedZ, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr); void MoveJumpTo(float angle, float speedXY, float speedZ); void MoveJump(Position const& pos, float speedXY, float speedZ, uint32 id = EVENT_JUMP, bool hasOrientation = false, JumpArrivalCastArgs const* arrivalCast = nullptr, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr); void MoveJump(float x, float y, float z, float o, float speedXY, float speedZ, uint32 id = EVENT_JUMP, bool hasOrientation = false, JumpArrivalCastArgs const* arrivalCast = nullptr, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 26b0f405ec4..2bd443d295d 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -4276,18 +4276,18 @@ void Spell::EffectKnockBack() if (speedxy < 0.01f && speedz < 0.01f) return; - float x, y; + Position origin; if (effectInfo->Effect == SPELL_EFFECT_KNOCK_BACK_DEST) { if (m_targets.HasDst()) - destTarget->GetPosition(x, y); + origin = destTarget->GetPosition(); else return; } - else //if (m_spellInfo->Effects[i].Effect == SPELL_EFFECT_KNOCK_BACK) - m_caster->GetPosition(x, y); + else //if (effectInfo->Effect == SPELL_EFFECT_KNOCK_BACK) + origin = m_caster->GetPosition(); - unitTarget->KnockbackFrom(x, y, speedxy, speedz); + unitTarget->KnockbackFrom(origin, speedxy, speedz); } void Spell::EffectLeapBack() diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp index c704265493a..2ffe1b86b5e 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp @@ -777,7 +777,7 @@ class boss_flame_leviathan_overload_device : public CreatureScript if (Unit* player = me->GetVehicle()->GetPassenger(SEAT_PLAYER)) { me->GetVehicleBase()->CastSpell(player, SPELL_SMOKE_TRAIL, true); - player->GetMotionMaster()->MoveKnockbackFrom(me->GetVehicleBase()->GetPositionX(), me->GetVehicleBase()->GetPositionY(), 30, 30); + player->GetMotionMaster()->MoveKnockbackFrom(me->GetVehicleBase()->GetPosition(), 30, 30); player->ExitVehicle(); } } diff --git a/src/server/scripts/Northrend/zone_grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp index 3dff0fff0ba..50c141f3a43 100644 --- a/src/server/scripts/Northrend/zone_grizzly_hills.cpp +++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp @@ -1012,7 +1012,7 @@ public: player->ExitVehicle(); float horizontalSpeed = 3.0f; float verticalSpeed = 40.0f; - player->KnockbackFrom(caster->GetPositionX(), caster->GetPositionY(), horizontalSpeed, verticalSpeed); + player->KnockbackFrom(caster->GetPosition(), horizontalSpeed, verticalSpeed); caster->CastSpell(player, SPELL_PARACHUTE, true); std::list<Creature*> explosionBunnys; diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 83436b4986e..48fdc440b97 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -1400,7 +1400,7 @@ class spell_gen_ds_flush_knockback : public SpellScript float verticalSpeed = 8.0f; // This method relies on the Dalaran Sewer map disposition and Water Spout position // What we do is knock the player from a position exactly behind him and at the end of the pipe - player->KnockbackFrom(target->GetPositionX(), player->GetPositionY(), horizontalSpeed, verticalSpeed); + player->KnockbackFrom(target->GetPosition(), horizontalSpeed, verticalSpeed); } } } |