From 70375d9bd7856de517ca1da9e4ea77b21270a0cf Mon Sep 17 00:00:00 2001 From: Sylvania Date: Wed, 24 Jun 2026 07:06:55 +0000 Subject: [PATCH] Fix: vehicules pilotes figes par un changement de vitesse (Foncer/Hot Rod) SetSpeedRate envoyait SMSG_MOVE_SPLINE_SET_RUN_SPEED pour toute creature car GetPlayerBeingMoved() ne resout que les unites Player. Un vehicule pilote par un joueur recevait donc un override spline -> le client croit que le serveur reprend le controle et fige le vehicule (ex: Punch It / Foncer +50% vitesse, quete 14071 Rolling with my Homies, Hot Rod 34840). Prouve par capture opcode en jeu. Fix: fallback sur GetPlayerMovingMe() (m_playerMovingMe, renseigne pour le controle client direct: vehicules/possession) -> le paquet part en SMSG_MOVE_SET_*_SPEED vers le pilote. Aucune incidence sur les PNJ IA. Co-Authored-By: Claude Opus 4.8 --- src/server/game/Entities/Unit/Unit.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 8676efb..a2830e9 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -8870,7 +8870,17 @@ void Unit::SetSpeedRate(UnitMoveType mtype, float rate) } } - if (Player* playerMover = GetPlayerBeingMoved()) // unit controlled by a player. + // Sylvania fix (Foncer/Hot Rod, quete 14071 Rolling with my Homies): route speed changes of a + // player-driven creature/vehicle to the controlling player via SMSG_MOVE_SET_*_SPEED instead of + // a spline override. GetPlayerBeingMoved() only resolves for actual Player units, so a driven + // vehicle would otherwise get SMSG_MOVE_SPLINE_SET_RUN_SPEED, which the client treats as the + // server seizing spline control -> the vehicle freezes (e.g. "Punch It" +50% speed aura). + // m_playerMovingMe (GetPlayerMovingMe) is set exactly for direct client control: vehicles/possess. + Player* playerMover = GetPlayerBeingMoved(); + if (!playerMover) + playerMover = GetPlayerMovingMe(); // player-driven vehicle / possessed unit + + if (playerMover) // unit controlled by a player. { // Send notification to self WorldPackets::Movement::MoveSetSpeed selfpacket(moveTypeToOpcode[mtype][1]);