mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-03-23 15:50:20 +00:00
physics: implement knockback simulation from SMSG_MOVE_KNOCK_BACK
Previously the handler ACKed with current position and ignored the velocity fields entirely (vcos/vsin/hspeed/vspeed were [[maybe_unused]]). The server expects the client to fly through the air on knockback — without simulation the player stays in place while the server models them as airborne, causing position desync and rubberbanding. Changes: - CameraController: add applyKnockBack(vcos, vsin, hspeed, vspeed) that sets knockbackHorizVel_ and launches verticalVelocity = -vspeed (server sends vspeed as negative for upward launches, matching TrinityCore) - Physics loop: each tick adds knockbackHorizVel_ to targetPos then applies exponential drag (KNOCKBACK_HORIZ_DRAG=4.5/s) until velocity < 0.05 u/s - GameHandler: parse all four fields, add KnockBackCallback, call it for the local player so the camera controller receives the impulse - Application: register the callback — routes server knockback to physics The existing ACK path is unchanged; the server gets position confirmation as before while the client now actually simulates the trajectory.
This commit is contained in:
parent
dd3f9e5b9e
commit
c622fde7be
5 changed files with 67 additions and 5 deletions
|
|
@ -11491,16 +11491,23 @@ void GameHandler::handleMoveKnockBack(network::Packet& packet) {
|
|||
? packet.readUInt64() : UpdateObjectParser::readPackedGuid(packet);
|
||||
if (packet.getSize() - packet.getReadPos() < 20) return; // counter(4) + vcos(4) + vsin(4) + hspeed(4) + vspeed(4)
|
||||
uint32_t counter = packet.readUInt32();
|
||||
[[maybe_unused]] float vcos = packet.readFloat();
|
||||
[[maybe_unused]] float vsin = packet.readFloat();
|
||||
[[maybe_unused]] float hspeed = packet.readFloat();
|
||||
[[maybe_unused]] float vspeed = packet.readFloat();
|
||||
float vcos = packet.readFloat();
|
||||
float vsin = packet.readFloat();
|
||||
float hspeed = packet.readFloat();
|
||||
float vspeed = packet.readFloat();
|
||||
|
||||
LOG_INFO("SMSG_MOVE_KNOCK_BACK: guid=0x", std::hex, guid, std::dec,
|
||||
" counter=", counter, " hspeed=", hspeed, " vspeed=", vspeed);
|
||||
" counter=", counter, " vcos=", vcos, " vsin=", vsin,
|
||||
" hspeed=", hspeed, " vspeed=", vspeed);
|
||||
|
||||
if (guid != playerGuid) return;
|
||||
|
||||
// Apply knockback physics locally so the player visually flies through the air.
|
||||
// The callback forwards to CameraController::applyKnockBack().
|
||||
if (knockBackCallback_) {
|
||||
knockBackCallback_(vcos, vsin, hspeed, vspeed);
|
||||
}
|
||||
|
||||
if (!socket) return;
|
||||
uint16_t ackWire = wireOpcode(Opcode::CMSG_MOVE_KNOCK_BACK_ACK);
|
||||
if (ackWire == 0xFFFF) return;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue