From 493dfc2ea08bf315dfe67358d330ca9fb2d09587 Mon Sep 17 00:00:00 2001 From: Reamer Date: Thu, 23 Aug 2012 13:01:29 +0200 Subject: [PATCH] [12111] Add Unit::KnockBackWithAngle function Also wrap up the packet sending for a knockbacked player to WorldSession::SendKnockBack Signed-off-by: Schmoozerd --- src/game/MovementHandler.cpp | 15 +++++++++++++++ src/game/Unit.cpp | 17 +++++++---------- src/game/Unit.h | 1 + src/game/WorldSession.h | 1 + src/shared/revision_nr.h | 2 +- 5 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index d0f3c311e01..ff6127213fb 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -450,6 +450,21 @@ void WorldSession::HandleMoveKnockBackAck(WorldPacket& recv_data) mover->SendMessageToSetExcept(&data, _player); } +void WorldSession::SendKnockBack(float angle, float horizontalSpeed, float verticalSpeed) +{ + float vsin = sin(angle); + float vcos = cos(angle); + + WorldPacket data(SMSG_MOVE_KNOCK_BACK, 9 + 4 + 4 + 4 + 4 + 4); + data << GetPlayer()->GetPackGUID(); + data << uint32(0); // Sequence + data << float(vcos); // x direction + data << float(vsin); // y direction + data << float(horizontalSpeed); // Horizontal speed + data << float(-verticalSpeed); // Z Movement speed (vertical) + SendPacket(&data); +} + void WorldSession::HandleMoveHoverAck(WorldPacket& recv_data) { DEBUG_LOG("CMSG_MOVE_HOVER_ACK"); diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 942e48cc93b..7cc7b90ce73 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -10675,22 +10675,19 @@ void Unit::SetFFAPvP(bool state) void Unit::KnockBackFrom(Unit* target, float horizontalSpeed, float verticalSpeed) { float angle = this == target ? GetOrientation() + M_PI_F : target->GetAngle(this); - float vsin = sin(angle); - float vcos = cos(angle); + KnockBackWithAngle(angle, horizontalSpeed, verticalSpeed); +} +void Unit::KnockBackWithAngle(float angle, float horizontalSpeed, float verticalSpeed) +{ if (GetTypeId() == TYPEID_PLAYER) { - WorldPacket data(SMSG_MOVE_KNOCK_BACK, 9 + 4 + 4 + 4 + 4 + 4); - data << GetPackGUID(); - data << uint32(0); // Sequence - data << float(vcos); // x direction - data << float(vsin); // y direction - data << float(horizontalSpeed); // Horizontal speed - data << float(-verticalSpeed); // Z Movement speed (vertical) - ((Player*)this)->GetSession()->SendPacket(&data); + ((Player*)this)->GetSession()->SendKnockBack(angle, horizontalSpeed, verticalSpeed); } else { + float vsin = sin(angle); + float vcos = cos(angle); float moveTimeHalf = verticalSpeed / Movement::gravity; float max_height = -Movement::computeFallElevation(moveTimeHalf, false, -verticalSpeed); diff --git a/src/game/Unit.h b/src/game/Unit.h index f08d094db8d..29b2a63d617 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -1853,6 +1853,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject void SetSpeedRate(UnitMoveType mtype, float rate, bool forced = false); void KnockBackFrom(Unit* target, float horizontalSpeed, float verticalSpeed); + void KnockBackWithAngle(float angle, float horizontalSpeed, float verticalSpeed); void _RemoveAllAuraMods(); void _ApplyAllAuraMods(); diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h index 35735f96837..a2123183bb6 100644 --- a/src/game/WorldSession.h +++ b/src/game/WorldSession.h @@ -441,6 +441,7 @@ class MANGOS_DLL_SPEC WorldSession // Knockback void HandleMoveKnockBackAck(WorldPacket& recvPacket); + void SendKnockBack(float angle, float horizontalSpeed, float verticalSpeed); void HandleMoveTeleportAckOpcode(WorldPacket& recvPacket); void HandleForceSpeedChangeAckOpcodes(WorldPacket& recv_data); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 2f2a19daf8b..4691ed209d3 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "12110" + #define REVISION_NR "12111" #endif // __REVISION_NR_H__