def _build_interaction_msg(interaction_info, msg): if not interaction_info: logger.debug('Why am I here with no interaction info???') logger.debug(' _build_interaction_msg({0})', interaction_info.interaction_id) msg.interaction_id = interaction_info.interaction_id msg.insert_after_id = interaction_info.insert_after_id msg.super_id = interaction_info.super_id if interaction_info.icon_info: build_icon_info_msg(interaction_info.icon_info, interaction_info.display_name, msg.icon_info) if interaction_info.target is not None and interaction_info.target.id is not None: msg.target_manager_object_id.object_id = interaction_info.target.id if interaction_info.target is not None: msg.target_manager_object_id.manager_id = interaction_info.target.manager_id for participant in interaction_info.participants: while participant is not None: with ProtocolBufferRollback(msg.participant_manager_object_ids) as participant_msg: participant_msg.manager_id = participant.manager_id participant_msg.object_id = participant.id msg.canceled = interaction_info.canceled msg.cancelable = interaction_info.user_cancelable msg.visual_type = interaction_info.ui_visual_type msg.queue_ui_state = interaction_info.ui_state (super_name, super_icon_info) = interaction_info.get_super_icon_info() if super_name is not None: build_icon_info_msg(super_icon_info, super_name, msg.super_icon_info) for si_id in interaction_info.interactions_to_be_canceled: msg.interactions_to_be_canceled.append(si_id) if interaction_info.mood_list is not None: for mood in interaction_info.mood_list: msg.mood_list.append(mood.guid64)
def _build_interaction_msg(interaction_info, msg): if not interaction_info: logger.debug('Why am I here with no interaction info???') logger.debug(' _build_interaction_msg({0})', interaction_info.interaction_id) msg.interaction_id = interaction_info.interaction_id msg.insert_after_id = interaction_info.insert_after_id msg.super_id = interaction_info.super_id if interaction_info.icon_info: build_icon_info_msg(interaction_info.icon_info, interaction_info.display_name, msg.icon_info) if interaction_info.target is not None and interaction_info.target.id is not None: msg.target_manager_object_id.object_id = interaction_info.target.id if interaction_info.target is not None: msg.target_manager_object_id.manager_id = interaction_info.target.manager_id for participant in interaction_info.participants: while participant is not None: with ProtocolBufferRollback( msg.participant_manager_object_ids) as participant_msg: participant_msg.manager_id = participant.manager_id participant_msg.object_id = participant.id msg.canceled = interaction_info.canceled msg.cancelable = interaction_info.user_cancelable msg.visual_type = interaction_info.ui_visual_type msg.queue_ui_state = interaction_info.ui_state (super_name, super_icon_info) = interaction_info.get_super_icon_info() if super_name is not None: build_icon_info_msg(super_icon_info, super_name, msg.super_icon_info) for si_id in interaction_info.interactions_to_be_canceled: msg.interactions_to_be_canceled.append(si_id) if interaction_info.mood_list is not None: for mood in interaction_info.mood_list: msg.mood_list.append(mood.guid64)
def _send_relationship_data(self, sim_id): if self.relationship_track_visual is None: return relationship_to_send = self._get_relationship(sim_id) if not relationship_to_send: return sim_info = services.sim_info_manager().get(sim_id) if sim_info is None: return msg = commodity_protocol.RelationshipUpdate() msg.actor_sim_id = sim_id (msg.target_id.object_id, msg.target_id.manager_id) = self.owner.icon_info msg.target_instance_id = self.owner.id if self.icon_override is not None: build_icon_info_msg(IconInfoData(icon_resource=self.icon_override), None, msg.target_icon_override) with ProtocolBufferRollback(msg.tracks) as relationship_track_update: relationship_value = relationship_to_send.get_value() relationship_track_update.track_score = relationship_value relationship_track_update.track_bit_id = self.relationship_track_visual.relationship_track.get_bit_at_relationship_value( relationship_value).guid64 relationship_track_update.track_id = self.relationship_track_visual.relationship_track.guid64 relationship_track_update.track_popup_priority = self.relationship_track_visual.relationship_track.display_popup_priority relationship_track_update.visible_in_relationship_panel = self.relationship_track_visual.visible_in_relationship_panel send_relationship_op(sim_info, msg) if self._object_social_mixin is not None: self._object_social_mixin.send_social_update_message()
def build_gig_msg(cls, msg, sim, gig_time=None, gig_customer=None): msg.gig_type = cls.guid64 msg.gig_name = cls.display_name(sim) (pay_lower, pay_upper) = cls._get_base_pay_for_gig_owner(sim) msg.min_pay = pay_lower msg.max_pay = pay_upper msg.gig_icon = ResourceKey() msg.gig_icon.instance = cls.display_icon.instance msg.gig_icon.group = cls.display_icon.group msg.gig_icon.type = cls.display_icon.type if cls.odd_job_tuning is not None and cls.odd_job_tuning.use_customer_description_as_gig_description and gig_customer is not None: customer_sim_info = services.sim_info_manager().get(gig_customer) if customer_sim_info is not None: msg.gig_description = cls.odd_job_tuning.customer_description( customer_sim_info) else: msg.gig_description = cls.display_description(sim) if gig_time is not None: msg.gig_time = gig_time if gig_customer is not None: msg.customer_id = gig_customer if cls.tip is not None: msg.tip_title = cls.tip.tip_title() if cls.tip.tip_icon is not None or cls.tip.tip_text is not None: build_icon_info_msg( IconInfoData(icon_resource=cls.tip.tip_icon), None, msg.tip_icon, desc=cls.tip.tip_text())
def create_calendar_alert(self): calendar_alert = super().create_calendar_alert() if self.ui_display_data: build_icon_info_msg( IconInfoData(icon_resource=self.ui_display_data.icon), self.ui_display_data.name, calendar_alert.calendar_icon) return calendar_alert
def send_icon_update_to_client(self): msg = Situations_pb2.SituationIconUpdate() msg.situation_id = self.id build_icon_info_msg(self.get_pet().get_icon_info_data(), None, msg.icon_info) msg.icon_info.control_id = ICON_CONTROL_ID op = distributor.ops.SituationIconUpdateOp(msg) Distributor.instance().add_op(self, op)
def create_calendar_entry(self): calendar_entry = super().create_calendar_entry() situation_type = self._situation_seed.situation_type calendar_entry.zone_id = self._situation_seed.zone_id build_icon_info_msg( IconInfoData(icon_resource=situation_type.calendar_icon), situation_type.display_name, calendar_entry.icon_info) calendar_entry.scoring_enabled = self._situation_seed.scoring_enabled return calendar_entry
def _build_customize_picker(self, picker_data): for category in self.filter_categories: with ProtocolBufferRollback( picker_data.filter_data) as category_data: category_data.tag_type = category.decoration_category build_icon_info_msg(category.icon(None), None, category_data.icon_info) category_data.description = category.category_name super()._build_customize_picker(picker_data)
def create_calendar_entry(self): calendar_entry = super().create_calendar_entry() calendar_entry.zone_id = self._zone_id build_icon_info_msg( IconInfoData( icon_resource=self._display_data.instance_display_icon), self._display_data.instance_display_name, calendar_entry.icon_info) calendar_entry.scoring_enabled = False return calendar_entry
def push_inventory_item_update_msg(self, object_updated): update_data = UI_pb2.DynamicInventoryItemData() update_data.count = object_updated.stack_count() update_data.sort_order = object_updated.get_stack_sort_order() update_data.new_object_id = object_updated.id update_data.is_new = object_updated.new_in_inventory icon_info = object_updated.get_icon_info_data() build_icon_info_msg(icon_info, None, update_data.icon_info) self._updated_ui_update(object_updated, object_updated.id, update_data)
def _obj_stacked(self, new_object, old_obj_id): update_data = UI_pb2.DynamicInventoryItemData() update_data.count = new_object.stack_count() update_data.sort_order = new_object.get_stack_sort_order() update_data.new_object_id = new_object.id update_data.is_new = new_object.new_in_inventory icon_info = new_object.get_icon_info_data() build_icon_info_msg(icon_info, None, update_data.icon_info) self._updated_ui_update(new_object, old_obj_id, update_data)
def build_situation_start_message(self): msg = super().build_situation_start_message() with ProtocolBufferRollback(msg.meter_data) as meter_data_msg: self.mother_plant_meter_settings.build_data_message(meter_data_msg) with ProtocolBufferRollback(msg.meter_data) as meter_data_msg: self.player_health_meter_settings.build_data_message( meter_data_msg) build_icon_info_msg(IconInfoData(icon_resource=self.mother_plant_icon), None, msg.icon_info) return msg
def _build_customize_picker(self, picker_data) -> None: for category in self.object_categories: with ProtocolBufferRollback( picker_data.filter_data) as category_data: category_data.tag_type = abs(hash( category.object_category)) % (10**8) build_icon_info_msg(category.icon(None), None, category_data.icon_info) category_data.description = category.category_name super()._build_customize_picker(picker_data)
def create_calendar_alert(self): calendar_alert = super().create_calendar_alert() situation_type = self._situation_seed.situation_type calendar_alert.zone_id = self._situation_seed.zone_id if self._situation_seed.situation_type.calendar_alert_description is not None: calendar_alert.description = situation_type.calendar_alert_description build_icon_info_msg( IconInfoData(icon_resource=situation_type.calendar_icon), situation_type.display_name, calendar_alert.calendar_icon) return calendar_alert
def _build_customize_picker(self, picker_data): picker_data.shop_picker_data.object_id = self.object_id picker_data.shop_picker_data.show_description = self.show_description picker_data.shop_picker_data.mailman_purchase = self.mailman_purchase for category in self.categories: category_data = picker_data.shop_picker_data.categories.add() category_data.tag_type = category.tag build_icon_info_msg((category.icon, None), None, category_data.icon_info) category_data.description = category.tooltip for row in self.picker_rows: row_data = picker_data.shop_picker_data.row_data.add() row.populate_protocol_buffer(row_data)
def build_msg(self, additional_tokens=(), icon_override=DEFAULT, secondary_icon_override=DEFAULT, **kwargs): msg = Dialog_pb2.UiDialogMessage() msg.dialog_id = self.dialog_id msg.owner_id = self.owner.id msg.dialog_type = Dialog_pb2.UiDialogMessage.DEFAULT if self.title is not None: msg.title = self._build_localized_string_msg(self.title, *additional_tokens) msg.text = self._build_localized_string_msg(self.text, *additional_tokens) if icon_override is DEFAULT: if self.icon is not None: icon_info = self.icon(self._resolver) key = icon_info[0] if key is not None: msg.icon.type = key.type msg.icon.group = key.group msg.icon.instance = key.instance build_icon_info_msg(icon_info, None, msg.icon_info) elif icon_override is not None: build_icon_info_msg(icon_override, None, msg.icon_info) if secondary_icon_override is DEFAULT: if self.secondary_icon is not None: icon_info = self.secondary_icon(self._resolver) build_icon_info_msg(icon_info, None, msg.secondary_icon_info) elif secondary_icon_override is not None: build_icon_info_msg(secondary_icon_override, None, msg.secondary_icon_info) msg.dialog_options = self.dialog_options responses = [] responses.extend(self._get_responses_gen()) responses.sort(key=lambda response: response.sort_order) for response in responses: response_msg = msg.choices.add() self._build_response_arg(response, response_msg, additional_tokens=additional_tokens, **kwargs) return msg
def _build_interaction_msg(interaction_info, msg): if not interaction_info: logger.debug('Why am I here with no interaction info???') logger.debug(' _build_interaction_msg({0})', interaction_info.interaction_id) msg.interaction_id = interaction_info.interaction_id msg.insert_after_id = interaction_info.insert_after_id if interaction_info.ui_visual_type != Sims_pb2.Interaction.SIMPLE: msg.super_id = interaction_info.super_id (super_name, super_icon_info_data) = interaction_info.get_super_icon_info() if super_name is not None: build_icon_info_msg(super_icon_info_data, super_name, msg.super_icon_info) else: msg.super_id = 0 if interaction_info.icon_info: icon_info = interaction_info.icon_info if not issubclass(type(icon_info), _IconInfoData): logger.warn( 'All icon_info data types should be converted to the type IconInfoData. The tuple format found in interaction {} is no longer supported.', interaction_info, owner='shipark') icon_info_data = IconInfoData(icon_resource=icon_info[0], obj_instance=icon_info[1]) else: icon_info_data = icon_info build_icon_info_msg(icon_info_data, interaction_info.display_name, msg.icon_info) if interaction_info.target is not None: if interaction_info.target.id is not None: msg.target_manager_object_id.object_id = interaction_info.target.id if interaction_info.target is not None: msg.target_manager_object_id.manager_id = interaction_info.target.manager_id for participant in interaction_info.participants: if participant is not None: with ProtocolBufferRollback( msg.participant_manager_object_ids) as participant_msg: participant_msg.manager_id = participant.manager_id participant_msg.object_id = participant.id msg.canceled = interaction_info.canceled msg.cancelable = interaction_info.user_cancelable msg.visual_type = interaction_info.ui_visual_type msg.queue_ui_state = interaction_info.ui_state for si_id in interaction_info.interactions_to_be_canceled: msg.interactions_to_be_canceled.append(si_id) if interaction_info.mood_list is not None: for mood in interaction_info.mood_list: msg.mood_list.append(mood.guid64)
def get_situation_data(session_id: int = 0, sim_id: OptionalTargetParam = None, *situation_ids, _connection=None): sim = get_optional_target(sim_id, _connection) instance_manager = services.situation_manager() situation_batch_msg = Situations_pb2.SituationDataBatch() situation_batch_msg.situation_session_id = session_id for situation_id in situation_ids: with ProtocolBufferRollback( situation_batch_msg.situations) as situation_data: instance = instance_manager.get(situation_id) while instance is not None: shared_messages.build_icon_info_msg((instance._icon, None), instance._display_name, situation_data.icon_info) situation_data.icon_info.desc = instance.situation_description situation_data.cost = instance._cost situation_data.max_participants = instance.max_participants for medal in SituationMedal: with ProtocolBufferRollback( situation_data.rewards) as reward_msg: level = instance.get_level_data(medal) reward_msg.level = int(medal) while level is not None and level.reward is not None: reward_msg.display_name.extend( [level.reward.reward_description]) jobs = list(instance.get_tuned_jobs()) jobs.sort(key=lambda job: job.guid64) if instance.job_display_ordering is not None: for ordered_job in reversed(instance.job_display_ordering): while ordered_job in jobs: jobs.remove(ordered_job) jobs.insert(0, ordered_job) for job in jobs: while job.sim_count.upper_bound > 0: with ProtocolBufferRollback( situation_data.jobs) as job_msg: job_msg.job_resource_id = job.guid64 shared_messages.build_icon_info_msg( (job.icon, None), job.display_name, job_msg.icon_info) job_msg.icon_info.desc = job.job_description job_msg.is_hireable = job.can_be_hired job_msg.min_required = job.sim_count.lower_bound job_msg.max_allowed = job.sim_count.upper_bound job_msg.hire_cost = job.hire_cost shared_messages.add_message_if_selectable( sim, Consts_pb2.MSG_SITUATION_DATA_BATCH, situation_batch_msg, True)
def create_calendar_entry(self): calendar_entry = super().create_calendar_entry() active_household = services.active_household() if active_household is not None: holiday_service = services.holiday_service() build_icon_info_msg( IconInfoData(icon_resource=holiday_service. get_holiday_display_icon(self.holiday_id)), holiday_service.get_holiday_display_name(self.holiday_id), calendar_entry.icon_info) calendar_entry.holiday_id = self.holiday_id for tradition in holiday_service.get_holiday_traditions( self.holiday_id): calendar_entry.tradition_ids.append(tradition.guid64) return calendar_entry
def _send_career_ui_update(self, is_add=True): audition_update_msg = DistributorOps_pb2.AuditionUpdate() if is_add: self.gig.build_gig_msg( audition_update_msg.audition_info, self._receiver_sim_info, gig_time=self._calculated_gig_time, audition_time=self._calculated_audition_time) op = GenericProtocolBufferOp(Operation.AUDITION_UPDATE, audition_update_msg) build_icon_info_msg( IconInfoData(icon_resource=self.audition_prep_icon), self.audition_prep_recommendation(), audition_update_msg.recommended_task) Distributor.instance().add_op(self._receiver_sim_info, op)
def populate_protocol_buffer(self, base_row_data, name_override=DEFAULT): base_row_data.option_id = self.option_id base_row_data.is_enable = bool(self.is_enable) if name_override is DEFAULT: name_override = self.name if name_override is not None: base_row_data.name = name_override if self.icon is not None: base_row_data.icon.type = self.icon.type base_row_data.icon.group = self.icon.group base_row_data.icon.instance = self.icon.instance if self.icon_info is not None: build_icon_info_msg(self.icon_info, None, base_row_data.icon_info) if self.row_description is not None: base_row_data.description = self.row_description if self.row_tooltip: base_row_data.tooltip = self.row_tooltip()
def _send_icon_update_to_client(self, sim): display_name = sim.household.holiday_tracker.get_active_holiday_display_name( ) holiday_icon = sim.household.holiday_tracker.get_active_holiday_display_icon( ) msg = Situations_pb2.SituationIconUpdate() msg.situation_id = self.id end_time = HolidayTuning.MAIN_HOLIDAY_START_TIME + HolidayTuning.HOLIDAY_DURATION( ) build_icon_info_msg( IconInfoData(icon_resource=holiday_icon), display_name, msg.icon_info, desc=LocalizationHelperTuning.get_start_time_to_end_time( HolidayTuning.MAIN_HOLIDAY_START_TIME, end_time)) msg.icon_info.control_id = 0 op = distributor.ops.SituationIconUpdateOp(msg) Distributor.instance().add_op(self, op)
def create_calendar_alert(self): if self.ui_display_type == DramaNodeUiDisplayType.POP_UP_HOLIDAY: return holiday_service = services.holiday_service() calendar_alert = super().create_calendar_alert() calendar_alart_description = holiday_service.get_holiday_calendar_alert_notification( self.holiday_id) if calendar_alart_description is not None: calendar_alert.description = calendar_alart_description( holiday_service.get_holiday_display_name(self.holiday_id)) build_icon_info_msg( IconInfoData(icon_resource=holiday_service. get_holiday_display_icon(self.holiday_id)), holiday_service.get_holiday_display_name(self.holiday_id), calendar_alert.calendar_icon) for tradition in holiday_service.get_holiday_traditions( self.holiday_id): calendar_alert.tradition_ids.append(tradition.guid64) return calendar_alert
def _build_object_relationship_update_proto(self, actor_sim_info, member_obj_def_id, deltas=None, name_override=None): msg = commodity_protocol.RelationshipUpdate() actor_sim_id = actor_sim_info.sim_id msg.actor_sim_id = actor_sim_id if name_override is not None: loc_custom_name = LocalizationHelperTuning.get_raw_text( name_override) build_icon_info_msg(IconInfoData(), loc_custom_name, msg.target_icon_override) if self._target_object_id == 0: target_object = None tag_set = services.relationship_service().get_mapped_tag_set_of_id( member_obj_def_id) definition_ids = services.relationship_service( ).get_ids_of_tag_set(tag_set) for definition_id in definition_ids: for obj in services.object_manager().objects: if definition_id == obj.definition.id: target_object = obj break if target_object is None: logger.error( 'Failed to find an object with requested object tag set in the world, so the initial object type relationship creation for sim {} will not complete.', actor_sim_info) return (msg.target_id.object_id, msg.target_id.manager_id) = target_object.icon_info msg.target_instance_id = target_object.id self._target_object_id = msg.target_id.object_id self._target_object_manager_id = msg.target_id.manager_id self._target_object_instance_id = msg.target_instance_id else: msg.target_id.object_id = self._target_object_id msg.target_id.manager_id = self._target_object_manager_id msg.target_instance_id = self._target_object_instance_id msg.last_update_time = self._last_update_time track_bits = self._build_relationship_track_proto(msg) self._build_relationship_bit_proto(actor_sim_id, track_bits, msg) return msg
def build_msg(self, zone_id=None, **kwargs): msg = super().build_msg(**kwargs) if zone_id is None: return msg persistence_service = services.get_persistence_service() zone_data = persistence_service.get_zone_proto_buff(zone_id) if zone_data is None: return msg venue_tuning_id = build_buy.get_current_venue(zone_id) venue_manager = services.get_instance_manager( sims4.resources.Types.VENUE) venue_tuning = venue_manager.get(venue_tuning_id) if venue_tuning is None: return msg msg.lot_title = self.zone_title(venue_tuning.display_name, zone_data.name) build_icon_info_msg( IconInfoData(icon_resource=venue_tuning.venue_icon), venue_tuning.display_name, msg.venue_icon) return msg
def _build_goal_message(self, goal_msg, goal): goal_msg.goal_id = goal.id goal_name = goal.get_display_name() if goal_name is not None: goal_msg.goal_name = goal_name goal_msg.max_iterations = goal.max_iterations if goal.completed_time is None: goal_msg.current_iterations = goal.completed_iterations else: goal_msg.current_iterations = goal.max_iterations goal_tooltip = goal.get_display_tooltip() if goal_tooltip is not None: goal_msg.goal_tooltip = goal_tooltip if goal.audio_sting_on_complete is not None: goal_msg.audio_sting.type = goal.audio_sting_on_complete.type goal_msg.audio_sting.group = goal.audio_sting_on_complete.group goal_msg.audio_sting.instance = goal.audio_sting_on_complete.instance build_icon_info_msg(IconInfoData(icon_resource=goal.display_icon), goal_name, goal_msg.icon_info) goal_msg.display_type = goal.display_type.value
def _get_add_to_client_msg(self, obj): msg = UI_pb2.InventoryItemUpdate() msg.type = UI_pb2.InventoryItemUpdate.TYPE_ADD msg.inventory_id = self._get_inventory_id() msg.inventory_type = self._get_inventory_ui_type() msg.stack_id = obj.inventoryitem_component.get_stack_id() msg.object_id = obj.id add_data = UI_pb2.InventoryItemData() add_data.definition_id = obj.definition.id dynamic_data = UI_pb2.DynamicInventoryItemData() dynamic_data.value = obj.current_value dynamic_data.locked = False dynamic_data.in_use = False dynamic_data.count = obj.stack_count() dynamic_data.is_new = obj.new_in_inventory dynamic_data.sort_order = obj.get_stack_sort_order() icon_info = obj.get_icon_info_data() build_icon_info_msg(icon_info, None, dynamic_data.icon_info) add_data.dynamic_data = dynamic_data msg.add_data = add_data return msg
def build_situation_start_message(self): msg = super().build_situation_start_message() with ProtocolBufferRollback(msg.meter_data) as meter_data_msg: self._progress_meter_settings.build_data_message(meter_data_msg) msg.situation_id = self.id end_time = HolidayTuning.MAIN_HOLIDAY_START_TIME + HolidayTuning.HOLIDAY_DURATION( ) sim_info = self._get_situation_sim() display_name = sim_info.household.holiday_tracker.get_active_holiday_display_name( ) holiday_icon = sim_info.household.holiday_tracker.get_active_holiday_display_icon( ) build_icon_info_msg( IconInfoData(icon_resource=holiday_icon), display_name, msg.icon_info, desc=LocalizationHelperTuning.get_start_time_to_end_time( HolidayTuning.MAIN_HOLIDAY_START_TIME, end_time)) msg.icon_info.control_id = 0 msg.display_delay = HolidayTuning.HOLIDAY_DISPLAY_DELAY().in_ticks() return msg
def build_msg (self, additional_tokens = (), icon_override = DEFAULT, secondary_icon_override = DEFAULT, text_override = DEFAULT, **kwargs): msg = Dialog_pb2.UiDialogMessage() msg.dialog_id = self.dialog_id msg.owner_id = self.owner.id if self.owner is not None else 0 msg.dialog_type = Dialog_pb2.UiDialogMessage.DEFAULT msg.dialog_style = self.dialog_style msg.dialog_bg_style = self.dialog_bg_style if self._target_sim_id is not None: msg.target_id = self._target_sim_id if self.title is not None: msg.title = self._build_localized_string_msg(self.title, *additional_tokens) if text_override is DEFAULT: msg.text = self._build_localized_string_msg(self.text, *additional_tokens) else: msg.text = self._build_localized_string_msg(text_override, *additional_tokens) if self.timeout_duration is not None: msg.timeout_duration = self.timeout_duration if icon_override is DEFAULT: if self.icon is not None: icon_info = self.icon(self._resolver) key = icon_info[0] if key is not None: msg.icon.type = key.type msg.icon.group = key.group msg.icon.instance = key.instance build_icon_info_msg(icon_info, None, msg.icon_info) elif icon_override is not None: build_icon_info_msg(icon_override, None, msg.icon_info) if secondary_icon_override is DEFAULT: if self.secondary_icon is not None: icon_info = self.secondary_icon(self._resolver) build_icon_info_msg(icon_info, None, msg.secondary_icon_info) elif secondary_icon_override is not None: build_icon_info_msg(secondary_icon_override, None, msg.secondary_icon_info) if self.icon_override_participant is not None: msg.override_sim_icon_id = self._resolver.get_participants(self.icon_override_participant)[0].id msg.dialog_options = self.dialog_options msg.anonymous_target_sim = self.anonymous_target_sim responses = [] responses.extend(self._get_responses_gen()) responses.sort(key = lambda response: response.sort_order) for response in responses: response_msg = msg.choices.add() self._build_response_arg(response, response_msg, additional_tokens = additional_tokens, **kwargs) if self.additional_texts: for additional_text in self.additional_texts: msg.additional_texts.append(self._build_localized_string_msg(additional_text, *additional_tokens)) return msg
def get_situation_data(session_id:int=0, sim_id:OptionalTargetParam=None, *situation_ids, _connection=None): sim = get_optional_target(sim_id, _connection) instance_manager = services.situation_manager() situation_batch_msg = Situations_pb2.SituationDataBatch() situation_batch_msg.situation_session_id = session_id for situation_id in situation_ids: with ProtocolBufferRollback(situation_batch_msg.situations) as situation_data: instance = instance_manager.get(situation_id) while instance is not None: shared_messages.build_icon_info_msg((instance._icon, None), instance._display_name, situation_data.icon_info) situation_data.icon_info.desc = instance.situation_description situation_data.cost = instance._cost situation_data.max_participants = instance.max_participants for medal in SituationMedal: with ProtocolBufferRollback(situation_data.rewards) as reward_msg: level = instance.get_level_data(medal) reward_msg.level = int(medal) while level is not None and level.reward is not None: reward_msg.display_name.extend([level.reward.reward_description]) jobs = list(instance.get_tuned_jobs()) jobs.sort(key=lambda job: job.guid64) if instance.job_display_ordering is not None: for ordered_job in reversed(instance.job_display_ordering): while ordered_job in jobs: jobs.remove(ordered_job) jobs.insert(0, ordered_job) for job in jobs: while job.sim_count.upper_bound > 0: with ProtocolBufferRollback(situation_data.jobs) as job_msg: job_msg.job_resource_id = job.guid64 shared_messages.build_icon_info_msg((job.icon, None), job.display_name, job_msg.icon_info) job_msg.icon_info.desc = job.job_description job_msg.is_hireable = job.can_be_hired job_msg.min_required = job.sim_count.lower_bound job_msg.max_allowed = job.sim_count.upper_bound job_msg.hire_cost = job.hire_cost shared_messages.add_message_if_selectable(sim, Consts_pb2.MSG_SITUATION_DATA_BATCH, situation_batch_msg, True)
def build_msg(self, additional_tokens=(), icon_override=DEFAULT, secondary_icon_override=DEFAULT, **kwargs): msg = Dialog_pb2.UiDialogMessage() msg.dialog_id = self.dialog_id msg.owner_id = self.owner.id msg.dialog_type = Dialog_pb2.UiDialogMessage.DEFAULT if self.title is not None: msg.title = self._build_localized_string_msg( self.title, *additional_tokens) msg.text = self._build_localized_string_msg(self.text, *additional_tokens) if icon_override is DEFAULT: if self.icon is not None: icon_info = self.icon(self._resolver) key = icon_info[0] if key is not None: msg.icon.type = key.type msg.icon.group = key.group msg.icon.instance = key.instance build_icon_info_msg(icon_info, None, msg.icon_info) elif icon_override is not None: build_icon_info_msg(icon_override, None, msg.icon_info) if secondary_icon_override is DEFAULT: if self.secondary_icon is not None: icon_info = self.secondary_icon(self._resolver) build_icon_info_msg(icon_info, None, msg.secondary_icon_info) elif secondary_icon_override is not None: build_icon_info_msg(secondary_icon_override, None, msg.secondary_icon_info) msg.dialog_options = self.dialog_options responses = [] responses.extend(self._get_responses_gen()) responses.sort(key=lambda response: response.sort_order) for response in responses: response_msg = msg.choices.add() self._build_response_arg(response, response_msg, additional_tokens=additional_tokens, **kwargs) return msg
def _get_inventory_update_message(self, update_type, obj, obj_id=None, allow_while_zone_not_running=False): if not self._allow_ui: return if not services.current_zone( ).is_zone_running and not allow_while_zone_not_running: return if services.current_zone().is_zone_shutting_down: return msg = UI_pb2.InventoryItemUpdate() msg.type = update_type msg.inventory_id = self._get_inventory_id() msg.inventory_type = self._get_inventory_ui_type() msg.stack_id = obj.inventoryitem_component.get_stack_id() if obj_id is None: msg.object_id = obj.id else: msg.object_id = obj_id if update_type == UI_pb2.InventoryItemUpdate.TYPE_ADD: add_data = UI_pb2.InventoryItemData() add_data.definition_id = obj.definition.id msg.add_data = add_data if update_type == UI_pb2.InventoryItemUpdate.TYPE_ADD or update_type == UI_pb2.InventoryItemUpdate.TYPE_UPDATE: dynamic_data = UI_pb2.DynamicInventoryItemData() dynamic_data.value = obj.current_value dynamic_data.count = obj.stack_count() dynamic_data.new_object_id = obj.id dynamic_data.is_new = obj.new_in_inventory dynamic_data.sort_order = obj.get_stack_sort_order() icon_info = obj.get_icon_info_data() build_icon_info_msg(icon_info, None, dynamic_data.icon_info) recipe_name = obj.get_tooltip_field( TooltipFieldsComplete.recipe_name ) or obj.get_craftable_property(GameObjectProperty.RECIPE_NAME) if recipe_name is not None: dynamic_data.recipe_name = recipe_name if obj.custom_name is not None: dynamic_data.custom_name = obj.custom_name if InventoryStorage.UI_SORT_TYPES: sort_type = 0 for sort_type_data in InventoryStorage.UI_SORT_TYPES: value = None try: abs_value = None state_component = obj.state_component if state_component is None: continue for state in sort_type_data.object_data: if state_component.has_state(state): test_value = float( state_component.get_state(state).value) abs_test_value = abs(test_value) if value is None: value = test_value elif abs_value < abs_test_value: value = test_value abs_value = abs_test_value except TypeError: pass if value is not None: sort_data_item = UI_pb2.InventoryItemSortData() sort_data_item.type = sort_type sort_data_item.value = value dynamic_data.sort_data.append(sort_data_item) sort_type += 1 if update_type == UI_pb2.InventoryItemUpdate.TYPE_ADD: msg.add_data.dynamic_data = dynamic_data else: msg.update_data = dynamic_data if update_type == UI_pb2.InventoryItemUpdate.TYPE_SET_STACK_OPTION: dynamic_data = UI_pb2.DynamicInventoryItemData() if obj.inventoryitem_component.has_stack_option: obj.inventoryitem_component.populate_stack_icon_info_data( dynamic_data.icon_info) obj_owner = obj.inventoryitem_component.get_inventory().owner if obj_owner.is_sim: favorites_tracker = obj_owner.sim_info.favorites_tracker if favorites_tracker is not None: if favorites_tracker.is_favorite_stack(obj): dynamic_data.is_favorite = True msg.update_data = dynamic_data return msg