using System.Numerics; using AcDream.Core.Net.Packets; namespace AcDream.Core.Net.Messages; /// /// Outbound GameAction(Jump) message — opcode 0xF61B. /// 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) /// 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(); } }