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>
57 lines
1.8 KiB
C#
57 lines
1.8 KiB
C#
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();
|
||
}
|
||
}
|