def write_data(self, stream): stream.write(c_bit(self.stats)) if self.stats: stream.write(c_uint32(self.health)) stream.write(c_float(self.max_health)) stream.write(c_uint32(self.armor)) stream.write(c_float(self.max_armor)) stream.write(c_uint32(self.imagination)) stream.write(c_float(self.max_imagination)) stream.write(c_uint32(0)) # NOTE: unknown stream.write(c_bit(True)) stream.write(c_bit(False)) stream.write(c_bit(False)) stream.write(c_float(self.max_health)) stream.write(c_float(self.max_armor)) stream.write(c_float(self.max_imagination)) stream.write(c_uint32(len(self.factions))) for faction_id in self.factions: stream.write(c_int32(faction_id)) stream.write(c_bit(self.smashable))
def serialize(self, stream): """ Serializes the packet """ super().serialize(stream) stream.write(c_uint32(self.game_version)) stream.write(c_uint32(self.unknown)) stream.write(c_uint32(self.remote_conn_type)) stream.write(c_uint32(self.process_id)) stream.write(self.local_ip, allocated_length=33)
def serialize(self, stream): stream.write(c_bit(True)) stream.write(c_uint32(0)) stream.write(c_bit(True)) stream.write(c_uint32(self.state)) stream.write(c_bit(self.success)) stream.write(c_bit(self.enabled)) stream.write(c_float(self.start)) stream.write(c_float(self.paused))
def write_construction(self, stream): stream.write(c_bit(self.jetpack)) if self.jetpack: stream.write(c_uint32(self.jetpack_effect)) stream.write(c_bit(False)) stream.write(c_bit(True)) # NOTE: flag is unknown for _ in range(7): stream.write(c_uint32(0)) self.write_data(stream)
def serialize(self, stream): """ Serializes the packet """ super().serialize(stream) stream.write(c_uint16(self.zone_id)) stream.write(c_uint16(self.map_instance)) stream.write(c_uint32(self.map_clone)) stream.write(c_uint32(self.map_checksum)) stream.write(c_uint16(self.unknown1)) stream.write(c_float(self.pos.x)) stream.write(c_float(self.pos.y)) stream.write(c_float(self.pos.z)) stream.write(c_uint32(self.is_activity))
def serialize(self, stream): stream.write(c_uint8(len(self.key) * 2)) for char in self.key: stream.write(char.encode('latin1')) stream.write(b'\0') if not self.data_num: if isinstance(self.data, ElementTree.Element): stream.write(c_uint8(13)) txt = b'<?xml version="1.0">' + ElementTree.tostring(self.data) stream.write(c_uint32(len(txt))) stream.write(txt) else: stream.write(c_uint8(LEGO_DATA_TYPES[self.data_type])) if self.data_type == str: stream.write(self.data, length_type=c_uint) else: stream.write(self.data_type(self.data)) else: stream.write(c_uint8(self.data_num)) stream.write(self.data)
def serialize(self, stream): super().serialize(stream) stream.write(c_uint32(len(self.keys))) for key in self.keys: key.serialize(stream)
def serialize(self, stream: WriteStream): """ Serializes the packet """ super().serialize(stream) stream.write(c_uint8(self.auth_status_code)) stream.write(CString(self.unknown, allocated_length=33)) stream.write(CString(self.unknown1, allocated_length=33*7)) stream.write(self.client_version) stream.write(self.auth_token, allocated_length=33) stream.write(CString(self.char_ip, allocated_length=33)) stream.write(CString(self.chat_ip, allocated_length=33)) stream.write(c_uint16(self.char_port)) stream.write(c_uint16(self.chat_port)) stream.write(CString(self.unknown2, allocated_length=33)) stream.write(CString(self.unknown3, allocated_length=37)) stream.write(c_uint32(self.unknown4)) stream.write(CString(self.localization, allocated_length=3)) stream.write(c_bool(self.new_subscriber)) stream.write(c_bool(self.is_ftp)) stream.write(c_uint64(self.unknown5)) stream.write(self.permission_error, length_type=c_uint16) # TODO: Implement stamps stream.write(c_uint32(4))
def write_construction(self, stream): stream.write(c_bit(True)) # NOTE: unknown for _ in range(9): stream.write(c_uint32(0)) self.write_data(stream) if self.stats: stream.write(c_bit(False)) # NOTE: unknown(?) stream.write(c_bit(False)) # NOTE: same as above if self.smashable: stream.write(c_bit(False)) # NOTE: unknown stream.write(c_bit(False)) # NOTE: same as above stream.write(c_bit(True)) stream.write(c_bit(False))
def post_creation(self, stream): """ Writes part 2 of data """ stream.write(c_bit(True)) stream.write(c_bit(self.pvp)) stream.write(c_bit(self.gm)) stream.write(c_uint8(self.gmlevel)) stream.write(c_bit(False)) # NOTE: unknown stream.write(c_uint8(0)) # NOTE: unknown stream.write(c_bit(True)) stream.write(c_uint32(1 if self.glowing_head else 0)) stream.write(c_bit(self.guild)) if self.guild: stream.write(c_int64(self.guild_id)) stream.write(self.guild_name, allocated_length=33) stream.write(c_bit(True)) # NOTE: unknown stream.write(c_int32(-1)) # NOTE: unknown
def pre_creation(self, stream): """ Writes part 1 of data """ stream.write(c_bit(True)) stream.write(c_bit(self.vehicle)) if self.vehicle: stream.write(c_int64(self.vehicle_id)) stream.write(c_uint8(0)) # NOTE: unknown stream.write(c_bit(self.level)) if self.level: stream.write(c_uint32(self.level_num)) stream.write(c_bit(True)) stream.write(c_bit(False)) stream.write(c_bit(True))
def serialize(self, stream): """ Serializes the component """ stream.write(c_bit(True)) stream.write(c_float(self.pos.x)) stream.write(c_float(self.pos.y)) stream.write(c_float(self.pos.z)) stream.write(c_float(self.rot.x)) stream.write(c_float(self.rot.y)) stream.write(c_float(self.rot.z)) stream.write(c_float(self.rot.w)) stream.write(c_bit(True)) stream.write(c_bit(self.effect)) if self.effect: stream.write(c_uint32(self.effect_type)) stream.write(c_float(self.effect_amount)) stream.write(c_bit(False)) stream.write(c_bit(True)) stream.write(c_float(self.effect_direction.x)) stream.write(c_float(self.effect_direction.y)) stream.write(c_float(self.effect_direction.z))
def write_construction(self, stream): self.pre_creation(stream) stream.write(c_bit(False)) # NOTE: unknown flag(?) stream.write(c_bit(False)) # NOTE: unknown flag stream.write(c_bit(False)) # NOTE: same as above stream.write(c_bit(False)) # NOTE: same here stream.write(c_uint32(self.hair_color)) stream.write(c_uint32(self.hair_style)) stream.write(c_uint32(0)) # NOTE: unknown(?) stream.write(c_uint32(self.shirt_color)) stream.write(c_uint32(self.pants_color)) stream.write(c_uint32(0)) # NOTE: unknown(?) stream.write(c_uint32(0)) # NOTE: unknown(?) stream.write(c_uint32(self.eyebrows)) stream.write(c_uint32(self.eyes)) stream.write(c_uint32(self.mouth)) stream.write(c_uint64(self.account_id)) stream.write(c_uint64(self.llog)) stream.write(c_uint64(0)) # NOTE: unknown stream.write(c_uint64(self.lego_score)) stream.write(c_bit(self.free_to_play)) stream.write(c_uint64(self.currency_collected)) stream.write(c_uint64(self.bricks_collected)) stream.write(c_uint64(self.smashables_smashed)) stream.write(c_uint64(self.quick_builds)) stream.write(c_uint64(self.enemies_smashed)) stream.write(c_uint64(self.rockets_used)) stream.write(c_uint64(self.missions_completed)) stream.write(c_uint64(self.pets_tamed)) stream.write(c_uint64(self.imagination_powerups)) stream.write(c_uint64(self.life_powerups)) stream.write(c_uint64(self.armor_powerups)) stream.write(c_uint64(self.distance_traveled)) stream.write(c_uint64(self.times_smashed)) stream.write(c_uint64(self.damage_taken)) stream.write(c_uint64(self.damage_healed)) stream.write(c_uint64(self.armor_repaired)) stream.write(c_uint64(self.imagination_restored)) stream.write(c_uint64(self.imagination_used)) stream.write(c_uint64(self.distance_driven)) stream.write(c_uint64(self.airborne_time_race_car)) stream.write(c_uint64(self.racing_imagination_powerups)) stream.write(c_uint64(self.racing_imagination_crates_smashed)) stream.write(c_uint64(self.race_car_boosts)) stream.write(c_uint64(self.race_car_wrecks)) stream.write(c_uint64(self.racing_smashables_smashed)) stream.write(c_uint64(self.races_finished)) stream.write(c_uint64(self.first_place_finishes)) stream.write(c_bit(False)) # NOTE: unknown(?) stream.write(c_bit(self.rocket)) if self.rocket: stream.write(c_uint16(self.rocket_characters)) # TODO: LDF rocket info self.post_creation(stream)
def serialize(self, stream): """ Serializes the packet """ super().serialize(stream) # TODO: Make this stuff dynamic instead of just empty ldf = LegoData() ldf.write('accountID', self.account_id, data_type=c_int64) ldf.write('chatmode', 0, data_type=c_int32) ldf.write('editor_enabled', False, data_type=c_bool) ldf.write('editor_level', 0, data_type=c_int32) ldf.write('gmlevel', 0, data_type=c_int32) ldf.write('levelid', self.zone_id, data_type=c_int64) ldf.write('objid', self.objid, data_type=c_int64, data_num=9) ldf.write('reputation', 100, data_type=c_int64) ldf.write('template', 1, data_type=c_int32) xml = ElementTree.TreeBuilder() xml.start('obj', {'v': '1'}) xml.start('buff', {}) xml.end('buff') xml.start('skill', {}) xml.end('skill') xml.start('inv', {}) xml.start('bag', {}) xml.start('b', {'t': '0', 'm': str(self.inventory_space)}) xml.end('b') xml.end('bag') xml.start('items', {}) xml.start('in', {}) # TODO: inventory stuff here xml.end('in') xml.end('items') xml.end('inv') xml.start('mf', {}) xml.end('mf') xml.start('char', {'cc': str(self.currency)}) xml.end('char') xml.start('lvl', {'l': str(self.level)}) xml.end('lvl') xml.start('flag', {}) xml.end('flag') xml.start('pet', {}) xml.end('pet') xml.start('mis', {}) xml.start('cur', {}) for mission in [ mission for mission in self.missions if mission.state == 2 ]: xml.start('m', {'id': str(mission.mission), 'o': '1'}) xml.start('sv', {'v': str(mission.progress)}) xml.end('sv') xml.end('m') xml.end('cur') xml.start('done', {}) for mission in [ mission for mission in self.missions if mission.state == 8 ]: xml.start( 'm', { 'cct': str(mission.times_completed), 'id': str(mission.mission), 'cts': str(mission.last_completion) }) xml.end('m') xml.end('done') xml.end('mis') xml.start('mnt', {}) xml.end('mnt') xml.start('dest', {}) xml.end('dest') xml.end('obj') ldf.write('xmlData', xml.close()) ldf.write('name', self.name, data_type=str) ldf_stream = WriteStream() ldf_stream.write(ldf) ldf_bytes = bytes(ldf_stream) compressed = zlib.compress(ldf_bytes) stream.write(c_uint32(len(compressed) + 9)) stream.write(c_bool(True)) stream.write(c_uint32(len(ldf_bytes))) stream.write(c_uint32(len(compressed))) stream.write(compressed)
def write_construction(self, stream): """ Writes construction data """ if not self.disabled: stream.write(c_uint32(0)) # TODO: add a var for this
def serialize(self, stream): """ Serializes the packet """ stream.write(c_int64(self.objid)) stream.write(c_uint32(self.unknown1)) stream.write(self.character_name, allocated_length=33) stream.write(self.character_unapproved_name, allocated_length=33) stream.write(c_bool(self.is_name_rejected)) stream.write(c_bool(self.free_to_play)) stream.write(self.unknown2) stream.write(c_uint32(self.shirt_color)) stream.write(c_uint32(self.shirt_style)) stream.write(c_uint32(self.pants_color)) stream.write(c_uint32(self.hair_style)) stream.write(c_uint32(self.hair_color)) stream.write(c_uint32(self.lh)) stream.write(c_uint32(self.rh)) stream.write(c_uint32(self.eyebrows)) stream.write(c_uint32(self.eyes)) stream.write(c_uint32(self.mouth)) stream.write(c_uint32(self.unknown3)) stream.write(c_uint16(self.last_zone)) stream.write(c_uint16(self.last_instance)) stream.write(c_uint32(self.last_clone)) stream.write(c_uint64(self.last_login)) stream.write(c_uint16(len(self.equipped_items))) for item in self.equipped_items: stream.write(c_uint32(item))
def serialize(self, stream): stream.write(c_uint8(0x53)) stream.write(c_uint16(self.remote_conn_id)) stream.write(c_uint32(self.packet_id)) stream.write(c_uint8(0x00))