import struct from game_server.net.cmd_id import CmdID class Packet: def __init__(self, buf: bytes): self.raw = buf self.head_magic = buf[:4] self.user_id = struct.unpack('>I', buf[12:16])[0] self.cmd_id = struct.unpack('>I', buf[24:28])[0] self.header_len = struct.unpack('>H', buf[28:30])[0] self.body_len = struct.unpack('>I', buf[30:34])[0] self.body = buf[34 + self.header_len:34 + self.header_len + self.body_len] self.tail_magic = buf[-4:] @staticmethod def send_packet(body): cmdid = CmdID[body.__class__.__name__] data = body.SerializeToString() buf = bytearray(38 + len(data)) struct.pack_into('>I', buf, 0, 0x01234567) struct.pack_into('>H', buf, 4, 1) struct.pack_into('>H', buf, 6, 0) struct.pack_into('>I', buf, 8, 0) struct.pack_into('>I', buf, 12, 0) struct.pack_into('>I', buf, 16, 0) struct.pack_into('>I', buf, 20, 0) struct.pack_into('>I', buf, 24, cmdid) struct.pack_into('>H', buf, 28, 0) struct.pack_into('>I', buf, 30, len(data)) buf[34:34 + len(data)] = data struct.pack_into('>I', buf, 34 + len(data), 0x89ABCDEF) return Packet(bytes(buf))