feat(movement): send jump packet to server (opcode 0xF61B)
Build and send GameAction(Jump) with extent + world-space launch velocity + sequence counters. Wire format from holtburger JumpActionData::pack. Server can now validate and replicate jumps to nearby clients. Also compute RunRate locally via PlayerWeenie.InqRunRate when running (server doesn't echo UpdateMotion ForwardSpeed to sender). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
bb7eced168
commit
5634e7114b
3 changed files with 74 additions and 6 deletions
|
|
@ -32,7 +32,8 @@ public readonly record struct MovementResult(
|
||||||
float? ForwardSpeed,
|
float? ForwardSpeed,
|
||||||
float? SidestepSpeed,
|
float? SidestepSpeed,
|
||||||
float? TurnSpeed,
|
float? TurnSpeed,
|
||||||
float? JumpExtent = null); // non-null when a jump was triggered this frame
|
float? JumpExtent = null, // non-null when a jump was triggered this frame
|
||||||
|
Vector3? JumpVelocity = null); // world-space launch velocity (sent in jump packet)
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Portal-space state for the player movement controller.
|
/// Portal-space state for the player movement controller.
|
||||||
|
|
@ -259,6 +260,7 @@ public sealed class PlayerMovementController
|
||||||
// Release to execute: jump(extent) validates + sets JumpExtent,
|
// Release to execute: jump(extent) validates + sets JumpExtent,
|
||||||
// then LeaveGround() applies the scaled velocity via get_leave_ground_velocity.
|
// then LeaveGround() applies the scaled velocity via get_leave_ground_velocity.
|
||||||
float? outJumpExtent = null;
|
float? outJumpExtent = null;
|
||||||
|
Vector3? outJumpVelocity = null;
|
||||||
|
|
||||||
if (input.Jump && _body.OnWalkable)
|
if (input.Jump && _body.OnWalkable)
|
||||||
{
|
{
|
||||||
|
|
@ -278,6 +280,7 @@ public sealed class PlayerMovementController
|
||||||
{
|
{
|
||||||
_motion.LeaveGround();
|
_motion.LeaveGround();
|
||||||
outJumpExtent = _jumpExtent;
|
outJumpExtent = _jumpExtent;
|
||||||
|
outJumpVelocity = _body.Velocity; // capture after LeaveGround applies it
|
||||||
}
|
}
|
||||||
_jumpCharging = false;
|
_jumpCharging = false;
|
||||||
_jumpExtent = 0f;
|
_jumpExtent = 0f;
|
||||||
|
|
@ -411,6 +414,7 @@ public sealed class PlayerMovementController
|
||||||
ForwardSpeed: outForwardSpeed,
|
ForwardSpeed: outForwardSpeed,
|
||||||
SidestepSpeed: outSidestepSpeed,
|
SidestepSpeed: outSidestepSpeed,
|
||||||
TurnSpeed: outTurnSpeed,
|
TurnSpeed: outTurnSpeed,
|
||||||
JumpExtent: outJumpExtent);
|
JumpExtent: outJumpExtent,
|
||||||
|
JumpVelocity: outJumpVelocity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1936,11 +1936,18 @@ public sealed class GameWindow : IDisposable
|
||||||
_liveSession.SendGameAction(body);
|
_liveSession.SendGameAction(body);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result.JumpExtent.HasValue)
|
if (result.JumpExtent.HasValue && result.JumpVelocity.HasValue)
|
||||||
{
|
{
|
||||||
// TODO: send jump packet to server (format needs research from holtburger).
|
var seq = _liveSession.NextGameActionSequence();
|
||||||
// Local jump physics work without server acknowledgment for now.
|
var jumpBody = AcDream.Core.Net.Messages.JumpAction.Build(
|
||||||
Console.WriteLine($"jump: extent={result.JumpExtent.Value:F2}");
|
gameActionSequence: seq,
|
||||||
|
extent: result.JumpExtent.Value,
|
||||||
|
velocity: result.JumpVelocity.Value,
|
||||||
|
instanceSequence: _liveSession.InstanceSequence,
|
||||||
|
serverControlSequence: _liveSession.ServerControlSequence,
|
||||||
|
teleportSequence: _liveSession.TeleportSequence,
|
||||||
|
forcePositionSequence: _liveSession.ForcePositionSequence);
|
||||||
|
_liveSession.SendGameAction(jumpBody);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
57
src/AcDream.Core.Net/Messages/JumpAction.cs
Normal file
57
src/AcDream.Core.Net/Messages/JumpAction.cs
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
using System.Numerics;
|
||||||
|
using AcDream.Core.Net.Packets;
|
||||||
|
|
||||||
|
namespace AcDream.Core.Net.Messages;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Outbound <c>GameAction(Jump)</c> message — opcode <c>0xF61B</c>.
|
||||||
|
/// Sent when the player releases the spacebar to jump. The server uses
|
||||||
|
/// the extent + velocity to validate the jump and replicate it to nearby
|
||||||
|
/// clients.
|
||||||
|
///
|
||||||
|
/// Wire layout (from holtburger JumpActionData::pack):
|
||||||
|
/// u32 0xF7B1 (GameAction envelope)
|
||||||
|
/// u32 sequence
|
||||||
|
/// u32 0xF61B (Jump sub-opcode)
|
||||||
|
/// f32 extent (0.0–1.0 charge power)
|
||||||
|
/// f32 velocity.x, f32 velocity.y, f32 velocity.z
|
||||||
|
/// u16 instanceSequence
|
||||||
|
/// u16 serverControlSequence
|
||||||
|
/// u16 teleportSequence
|
||||||
|
/// u16 forcePositionSequence
|
||||||
|
/// u32 objectGuid (0 for normal jump)
|
||||||
|
/// u32 spellId (0 for normal jump)
|
||||||
|
/// </summary>
|
||||||
|
public static class JumpAction
|
||||||
|
{
|
||||||
|
public const uint GameActionOpcode = 0xF7B1u;
|
||||||
|
public const uint JumpOpcode = 0xF61Bu;
|
||||||
|
|
||||||
|
public static byte[] Build(
|
||||||
|
uint gameActionSequence,
|
||||||
|
float extent,
|
||||||
|
Vector3 velocity,
|
||||||
|
ushort instanceSequence,
|
||||||
|
ushort serverControlSequence,
|
||||||
|
ushort teleportSequence,
|
||||||
|
ushort forcePositionSequence)
|
||||||
|
{
|
||||||
|
var w = new PacketWriter(48);
|
||||||
|
|
||||||
|
w.WriteUInt32(GameActionOpcode);
|
||||||
|
w.WriteUInt32(gameActionSequence);
|
||||||
|
w.WriteUInt32(JumpOpcode);
|
||||||
|
w.WriteFloat(extent);
|
||||||
|
w.WriteFloat(velocity.X);
|
||||||
|
w.WriteFloat(velocity.Y);
|
||||||
|
w.WriteFloat(velocity.Z);
|
||||||
|
w.WriteUInt16(instanceSequence);
|
||||||
|
w.WriteUInt16(serverControlSequence);
|
||||||
|
w.WriteUInt16(teleportSequence);
|
||||||
|
w.WriteUInt16(forcePositionSequence);
|
||||||
|
w.WriteUInt32(0); // objectGuid — 0 for normal jump
|
||||||
|
w.WriteUInt32(0); // spellId — 0 for normal jump
|
||||||
|
|
||||||
|
return w.ToArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue