async def send_login_result(self, user_id): stream = streams.BitStreamOut(">") stream.bits(1, 32) stream.bits(0, 8) stream.bits(len(user_id), 16) stream.ascii(user_id) await self.send(PacketType.LOGIN_RESULT, stream.get())
async def send_all_nodes(self, node_ids): stream = streams.BitStreamOut(">") stream.bits(4, 8) for i in range(M): stream.bit(i in node_ids) stream.bits(int(time.monotonic() * 1000), 64) await self.send(PacketType.NODE_NOTICE, stream.get())
async def send_pong(self, client_time): server_time = int(time.monotonic() * 1000) stream = streams.BitStreamOut(">") stream.bits(server_time, 64) stream.bits(client_time, 64) await self.send(PacketType.PONG, stream.get())
def test_tellbits(self): stream = streams.BitStreamOut("<") assert stream.tellbits() == 0 stream.bits(15, 4) assert stream.tellbits() == 4 stream.u8(1) assert stream.tellbits() == 12
def test_bit(self): stream = streams.BitStreamOut("<") stream.bit(0) stream.bit(1) stream.bit(0) stream.bit(1) assert stream.get() == b"\x50"
def test_bytealign(self): stream = streams.BitStreamOut("<") assert stream.tellbits() == 0 stream.bytealign() assert stream.tellbits() == 0 stream.bit(1) stream.bytealign() assert stream.tellbits() == 8
async def send(self, type, payload, source=0): logger.debug("Sending packet: source=%i type=%i size=%i", source, type, len(payload)) stream = streams.BitStreamOut(">") stream.bits(0, 2) stream.bits(type, 8) stream.bits(source, N) stream.bytealign() stream.write(payload) try: await self.client.send(stream.get()) except util.StreamError: await self.server.remove_node(self)
async def send_counter(self, client, index): stream = streams.BitStreamOut(">") stream.bits(index, 8) stream.bits(self.counters[index], 64) stream.bits(0, 16) # Unknown await client.send_rpc(0, 16, stream.get())
async def send_rpc(self, source_id, rpc_id, payload): stream = streams.BitStreamOut(">") stream.bits(int(time.monotonic() * 1000), 64) stream.write(payload) await self.send(rpc_id, stream.get(), source_id)
async def send_node_removed(self, node_id): stream = streams.BitStreamOut(">") stream.bits(3, 8) stream.bits(node_id, 16) stream.bits(int(time.monotonic() * 1000), 64) await self.send(PacketType.NODE_NOTICE, stream.get())
async def send_accepted(self): stream = streams.BitStreamOut(">") stream.bits(self.node_id, 16) stream.bits(int(time.monotonic() * 1000), 64) await self.send(PacketType.ACCEPTED, stream.get())
def encode(self, outstream): stream = streams.BitStreamOut(">") #FFLiMiiDataCore stream.bits(self.birth_platform, 4) stream.bits(self.unk1, 4) stream.bits(self.unk2, 4) stream.bits(self.unk3, 4) stream.bits(self.font_region, 4) stream.bits(self.region_move, 2) stream.bit(self.unk4) stream.bit(self.copyable) stream.u8(self.mii_version) stream.repeat(self.author_id, stream.u8) stream.repeat(self.mii_id, stream.u8) stream.write(self.unk5) stream.bit(self.unk6) stream.bit(self.unk7) stream.bits(self.color, 4) stream.bits(self.birth_day, 5) stream.bits(self.birth_month, 4) stream.bit(self.gender) stream.wchars(self.mii_name + "\0" * (10 - len(self.mii_name))) stream.u8(self.size) stream.u8(self.fatness) stream.bits(self.blush_type, 4) stream.bits(self.face_style, 4) stream.bits(self.face_color, 3) stream.bits(self.face_type, 4) stream.bit(self.local_only) stream.bits(self.hair_mirrored, 5) stream.bits(self.hair_color, 3) stream.u8(self.hair_type) stream.bits(self.eye_thickness, 3) stream.bits(self.eye_scale, 4) stream.bits(self.eye_color, 3) stream.bits(self.eye_type, 6) stream.bits(self.eye_height, 7) stream.bits(self.eye_distance, 4) stream.bits(self.eye_rotation, 5) stream.bits(self.eyebrow_thickness, 4) stream.bits(self.eyebrow_scale, 4) stream.bits(self.eyebrow_color, 3) stream.bits(self.eyebrow_type, 5) stream.bits(self.eyebrow_height, 7) stream.bits(self.eyebrow_distance, 4) stream.bits(self.eyebrow_rotation, 5) stream.bits(self.nose_height, 7) stream.bits(self.nose_scale, 4) stream.bits(self.nose_type, 5) stream.bits(self.mouth_thickness, 3) stream.bits(self.mouth_scale, 4) stream.bits(self.mouth_color, 3) stream.bits(self.mouth_type, 6) stream.u8(self.unk34) stream.bits(self.mustache_type, 3) stream.bits(self.mouth_height, 5) stream.bits(self.mustache_height, 6) stream.bits(self.mustache_scale, 4) stream.bits(self.beard_color, 3) stream.bits(self.beard_type, 3) stream.bits(self.glass_height, 5) stream.bits(self.glass_scale, 4) stream.bits(self.glass_color, 3) stream.bits(self.glass_type, 4) stream.bit(self.unk43) stream.bits(self.mole_ypos, 5) stream.bits(self.mole_xpos, 5) stream.bits(self.mole_scale, 4) stream.bit(self.mole_enabled) #FFLiMiiDataOfficial stream.wchars(self.creator_name + "\0" * (10 - len(self.creator_name))) #FFLStoreData stream.write(self.unk48) data = self.swap_endian(stream.get()) outstream.write(data) outstream.u16(crc16(data + b"\0\0"))
def test_seekbits(self): stream = streams.BitStreamOut("<") stream.seekbits(100) assert stream.tellbits() == 100 assert stream.get() == bytes(13)
def test_bits(self): stream = streams.BitStreamOut("<") stream.bits(15, 4) stream.u8(15) stream.bits(1, 4) assert stream.get() == b"\xF0\xF1"