mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-03-22 23:30:14 +00:00
physics: disable gravity when server sends SMSG_MOVE_GRAVITY_DISABLE
SMSG_MOVE_GRAVITY_DISABLE/ENABLE now correctly set/clear the LEVITATING movement flag instead of passing flag=0. GameHandler::isGravityDisabled() reads the LEVITATING bit and is synced to CameraController each frame. When gravity is disabled the physics loop bleeds off downward velocity and skips gravity accumulation, so Levitate and similar effects actually float the player rather than letting them fall through the world.
This commit is contained in:
parent
dd6f6d1174
commit
f2337aeaa7
5 changed files with 19 additions and 4 deletions
|
|
@ -1010,6 +1010,7 @@ void Application::update(float deltaTime) {
|
|||
if (renderer && gameHandler && renderer->getCameraController()) {
|
||||
renderer->getCameraController()->setRunSpeedOverride(gameHandler->getServerRunSpeed());
|
||||
renderer->getCameraController()->setMovementRooted(gameHandler->isPlayerRooted());
|
||||
renderer->getCameraController()->setGravityDisabled(gameHandler->isGravityDisabled());
|
||||
}
|
||||
|
||||
bool onTaxi = gameHandler &&
|
||||
|
|
|
|||
|
|
@ -5579,10 +5579,12 @@ void GameHandler::handlePacket(network::Packet& packet) {
|
|||
|
||||
// ---- Player movement flag changes (server-pushed) ----
|
||||
case Opcode::SMSG_MOVE_GRAVITY_DISABLE:
|
||||
handleForceMoveFlagChange(packet, "GRAVITY_DISABLE", Opcode::CMSG_MOVE_GRAVITY_DISABLE_ACK, 0, true);
|
||||
handleForceMoveFlagChange(packet, "GRAVITY_DISABLE", Opcode::CMSG_MOVE_GRAVITY_DISABLE_ACK,
|
||||
static_cast<uint32_t>(MovementFlags::LEVITATING), true);
|
||||
break;
|
||||
case Opcode::SMSG_MOVE_GRAVITY_ENABLE:
|
||||
handleForceMoveFlagChange(packet, "GRAVITY_ENABLE", Opcode::CMSG_MOVE_GRAVITY_ENABLE_ACK, 0, true);
|
||||
handleForceMoveFlagChange(packet, "GRAVITY_ENABLE", Opcode::CMSG_MOVE_GRAVITY_ENABLE_ACK,
|
||||
static_cast<uint32_t>(MovementFlags::LEVITATING), false);
|
||||
break;
|
||||
case Opcode::SMSG_MOVE_LAND_WALK:
|
||||
handleForceMoveFlagChange(packet, "LAND_WALK", Opcode::CMSG_MOVE_WATER_WALK_ACK, 0, false);
|
||||
|
|
|
|||
|
|
@ -717,8 +717,14 @@ void CameraController::update(float deltaTime) {
|
|||
jumpBufferTimer -= physicsDeltaTime;
|
||||
coyoteTimer -= physicsDeltaTime;
|
||||
|
||||
// Apply gravity
|
||||
verticalVelocity += gravity * physicsDeltaTime;
|
||||
// Apply gravity (skip when server has disabled gravity, e.g. Levitate spell)
|
||||
if (gravityDisabled_) {
|
||||
// Float in place: bleed off any downward velocity, allow upward to decay slowly
|
||||
if (verticalVelocity < 0.0f) verticalVelocity = 0.0f;
|
||||
else verticalVelocity *= std::max(0.0f, 1.0f - 3.0f * physicsDeltaTime);
|
||||
} else {
|
||||
verticalVelocity += gravity * physicsDeltaTime;
|
||||
}
|
||||
targetPos.z += verticalVelocity * physicsDeltaTime;
|
||||
}
|
||||
} else {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue