def handle_set_shard_callback(self, do_id, old_parent_id, old_zone_id, new_parent_id, new_zone_id): datagram = io.NetworkDatagram() datagram.add_uint16(types.CLIENT_GET_STATE_RESP) self.handle_send_datagram(datagram)
def __handle_set_name_pattern_resp(self, avatar_id): datagram = io.NetworkDatagram() datagram.add_uint16(types.CLIENT_SET_NAME_PATTERN_ANSWER) datagram.add_uint32(avatar_id) datagram.add_uint8(0) self.handle_send_datagram(datagram)
def handle_get_shard_list_resp(self, di): datagram = io.NetworkDatagram() datagram.add_uint16(types.CLIENT_GET_SHARD_LIST_RESP) datagram.append_data(di.get_remaining_bytes()) self.handle_send_datagram(datagram)
def handle_get_shard_list(self): datagram = io.NetworkDatagram() datagram.add_header(types.STATESERVER_CHANNEL, self.channel, types.STATESERVER_GET_SHARD_ALL) self.network.handle_send_connection_datagram(datagram)
def handle_object_get_all(self, sender, di): context = di.get_uint32() do_id = di.get_uint32() file_object = self._backend.open_file( self._backend.get_filename(do_id)) if not file_object: self.notify.warning( 'Failed to get fields for object: %d context: %d, unknown object!' % (do_id, context)) return dc_name = file_object.get_value('dclass') dc_class = self.dc_loader.dclasses_by_name.get(dc_name) if not dc_class: self.notify.warning( 'Failed to query object: %d context: %d, unknown dclass: %s!' % (do_id, context, dc_name)) return fields = file_object.get_value('fields') if not fields: self.notify.warning( 'Failed to query object: %d context %d, invalid fields!' % (do_id, context)) return datagram = io.NetworkDatagram() datagram.add_header(sender, self.channel, types.DBSERVER_OBJECT_GET_ALL_RESP) datagram.add_uint32(context) datagram.add_uint8(1) field_packer = DCPacker() field_count = 0 for field_name, field_args in fields.items(): field = dc_class.get_field_by_name(field_name) if not field: self.notify.warning( 'Failed to query object %d context: %d, unknown field: %s' % (do_id, context, field_name)) return field_packer.raw_pack_uint16(field.get_number()) field_packer.begin_pack(field) field.pack_args(field_packer, field_args) field_packer.end_pack() field_count += 1 self._backend.close_file(file_object) datagram.add_uint16(dc_class.get_number()) datagram.add_uint16(field_count) datagram.append_data(field_packer.get_string()) self.handle_send_connection_datagram(datagram)
def handle_create_object(self, sender, di): context = di.get_uint32() dc_id = di.get_uint16() field_count = di.get_uint16() dc_class = self.dc_loader.dclasses_by_number.get(dc_id) if not dc_class: self.notify.error( 'Failed to create object: %d context: %d, unknown dclass!' % (dc_id, context)) do_id = self._backend.allocator.allocate() file_object = self._backend.open_file( self._backend.get_filename(do_id)) file_object.set_value('dclass', dc_class.get_name()) file_object.set_value('do_id', do_id) fields = {} field_packer = DCPacker() field_packer.set_unpack_data(di.get_remaining_bytes()) for _ in xrange(field_count): field_id = field_packer.raw_unpack_uint16() field = dc_class.get_field_by_index(field_id) if not field: self.notify.error( 'Failed to unpack field: %d dclass: %s, invalid field!' % (field_id, dc_class.get_name())) field_packer.begin_unpack(field) field_args = field.unpack_args(field_packer) field_packer.end_unpack() if not field_args: self.notify.error( 'Failed to unpack field args for field: %d dclass: %s, invalid result!' % (field.get_name(), dc_class.get_name())) fields[field.get_name()] = field_args for index in xrange(dc_class.get_num_inherited_fields()): field_packer = DCPacker() field = dc_class.get_inherited_field(index) if not field: continue if field.get_name() in fields: continue if not field.is_db() or not field.has_default_value(): continue field_packer.set_unpack_data(field.get_default_value()) field_packer.begin_unpack(field) field_args = field.unpack_args(field_packer) field_packer.end_unpack() if not field_args: self.notify.error( 'Failed to unpack field args for field: %d dclass: %s, invalid result!' % (field.get_name(), dc_class.get_name())) fields[field.get_name()] = field_args file_object.set_value('fields', fields) self._backend.close_file(file_object) self._backend.tracker.set_value('next', do_id + 1) datagram = io.NetworkDatagram() datagram.add_header(sender, self.channel, types.DBSERVER_CREATE_OBJECT_RESP) datagram.add_uint32(context) datagram.add_uint32(do_id) self.handle_send_connection_datagram(datagram)