feat: 实现地面技能智能释放、极速交互完成与雇员探险一键重派三项业务扩展
This commit is contained in:
@@ -160,6 +160,31 @@ public static class AuditedPacketEncoder
|
||||
: null);
|
||||
}
|
||||
|
||||
public static EncodedGamePacket EncodeActionSendPos(OpcodeMap map, string version, uint actionId, byte actionKind,
|
||||
ushort requestId, System.Numerics.Vector3 position, ushort facing = 0, ushort targetFacing = 0)
|
||||
{
|
||||
RequireAuditedVersion(version);
|
||||
if (actionId == 0) throw new ArgumentException("技能 ID 不能为 0", nameof(actionId));
|
||||
if (requestId == 0) throw new ArgumentException("请求序号 RequestId 必须大于 0", nameof(requestId));
|
||||
if (!float.IsFinite(position.X) || !float.IsFinite(position.Y) || !float.IsFinite(position.Z))
|
||||
throw new ArgumentException("地面目标坐标包含无效浮点数", nameof(position));
|
||||
var opcode = RequireOpcode(map, version, PacketDirection.Up, "UP_ActionSendPos");
|
||||
var responseOpcode = map.ResolveOpcode(version, PacketDirection.Down, "DOWN_Effect");
|
||||
var payload = new byte[0x18];
|
||||
BinaryPrimitives.WriteUInt32LittleEndian(payload.AsSpan(0, 4), actionId);
|
||||
payload[5] = actionKind;
|
||||
BinaryPrimitives.WriteUInt16LittleEndian(payload.AsSpan(6, 2), requestId);
|
||||
BinaryPrimitives.WriteUInt16LittleEndian(payload.AsSpan(8, 2), facing);
|
||||
BinaryPrimitives.WriteUInt16LittleEndian(payload.AsSpan(10, 2), targetFacing);
|
||||
BinaryPrimitives.WriteSingleLittleEndian(payload.AsSpan(12, 4), position.X);
|
||||
BinaryPrimitives.WriteSingleLittleEndian(payload.AsSpan(16, 4), position.Y);
|
||||
BinaryPrimitives.WriteSingleLittleEndian(payload.AsSpan(20, 4), position.Z);
|
||||
return new("UP_ActionSendPos", opcode, payload, NativeSendPacket.BuildBuffer(opcode, payload), responseOpcode,
|
||||
responseOpcode.HasValue
|
||||
? p => p.Length == 0x7C && BinaryPrimitives.ReadUInt16LittleEndian(p.Slice(0x18, 2)) == requestId
|
||||
: null);
|
||||
}
|
||||
|
||||
private static (string Name, int Capacity, int Length) SelectEventTier(string prefix, int argCount) => argCount switch
|
||||
{
|
||||
< 0 or > 255 => throw new ArgumentOutOfRangeException(nameof(argCount), "事件参数数量超出 0..255 范围"),
|
||||
|
||||
Reference in New Issue
Block a user