def get_sims_for_job(session_id, sim_id, situation_type, job_type, *job_assignments, _connection=None): sim = get_optional_target(sim_id, _connection) situation_start_time = services.time_service().sim_now duration = situation_type.duration if duration > 0: situation_end_time = situation_start_time + date_and_time.create_time_span(0, 0, duration) else: situation_start_time = date_and_time.INVALID_DATE_AND_TIME situation_end_time = date_and_time.INVALID_DATE_AND_TIME results = services.sim_filter_service().submit_filter(job_type.filter, None, requesting_sim_info=sim.sim_info, start_time=situation_start_time, end_time=situation_end_time, allow_yielding=False) if job_type.additional_filter_for_user_selection: sim_constraints = {result.sim_info.id for result in results} results = services.sim_filter_service().submit_filter(job_type.additional_filter_for_user_selection, None, requesting_sim_info=sim.sim_info, start_time=situation_start_time, end_time=situation_end_time, sim_constraints=sim_constraints, allow_yielding=False) msg = Situations_pb2.SituationJobSims() msg.situation_session_id = session_id msg.job_resource_id = job_type.guid msg.requirements = job_type.requirement_text results.sort(key=lambda x: (x.sim_info.is_npc, x.sim_info.last_name)) for result in results: msg.sim_ids.append(result.sim_info.id) with ProtocolBufferRollback(msg.sims) as situation_job_sim: situation_job_sim.sim_id = result.sim_info.id if result.sim_info.household.id == services.active_household_id(): situation_job_sim.account_id = result.sim_info.account_id while result.conflicting_career_track_id: situation_job_sim.career_track_id = result.conflicting_career_track_id shared_messages.add_message_if_selectable(services.object_manager().get(sim.id), Consts_pb2.MSG_SITUATION_JOB_SIMS, msg, True)
def send_quality_update(self, liabilty_release=False): crafting_process = self._crafting_process sim = crafting_process.crafter if sim is not None: liability_data = Sims_pb2.CraftingLiabilityUpdate() liability_data.core_data.type = Sims_pb2.InteractionLiabilityUpdate.CRAFTING_QUALITY liability_data.core_data.sim_id = crafting_process.crafter_sim_id liability_data.core_data.liabilty_release = liabilty_release if not liabilty_release: quality_value = crafting_process.crafting_quality liability_data.quality_statistic_value = int(quality_value) quality_state = CraftingTuning.get_quality_state_value(CraftingTuning.QUALITY_STATISTIC, liability_data.quality_statistic_value) if quality_state is not None: liability_data.crafting_item_name = quality_state.state_string(crafting_process.recipe.get_recipe_name(crafting_process.crafter)) liability_data.crafting_quality = quality_state.state_star_number else: liability_data.crafting_item_name = crafting_process.recipe.get_recipe_name(crafting_process.crafter) phase = crafting_process.phase if phase is not None and phase.is_visible: if phase.phase_display_name is not None: liability_data.phase_name = phase.phase_display_name liability_data.phase_index = crafting_process.phase_index liability_data.total_phases = crafting_process.recipe.total_visible_phases liability_data.turn_index = crafting_process.get_progress() liability_data.total_turns = crafting_process.get_turns_in_current_phase() add_message_if_selectable(sim, Consts_pb2.MSG_SIM_CRAFTING_LIABILITY_UPDATE, liability_data, False)
def send_interaction_queue_view_add_msg(sim, super_interactions, immediate=False): logger.debug('send_interaction_queue_view_add_msg({}, immediate={}', sim.id, immediate) msg = Sims_pb2.InteractionQueueViewAdd() if _build_interaction_queue_view_add_msg(sim, super_interactions, msg): logger.debug(' SENDING') add_message_if_selectable(sim, MSG_SIM_INTERACTION_QUEUE_VIEW_ADD, msg, immediate) else: logger.debug(' NOT_SENDING')
def send_interaction_replace_message(sim, old_interaction_id, new_interaction_info, immediate=False): logger.debug('send_interaction_replace_message({}), old_id={}, new_id={}, immediate={})', sim.id, old_interaction_id, new_interaction_info.interaction_id, immediate) msg = Sims_pb2.InteractionReplace() msg.sim_id = sim.id msg.old_interaction_id = old_interaction_id _build_interaction_msg(new_interaction_info, msg.new_interaction) logger.debug(' SENDING') add_message_if_selectable(sim, MSG_SIM_INTERACTION_REPLACE, msg, immediate)
def send_interactions_update_msg(sim, super_interactions, immediate=False): logger.debug('send_interactions_update_msg({}), immediate={}', sim.id, immediate) msg = Sims_pb2.InteractionsUpdate() if _build_interactions_update_msg(sim, super_interactions, msg): logger.debug(' SENDING') add_message_if_selectable(sim, MSG_SIM_INTERACTIONS_UPDATE, msg, immediate) else: logger.debug(' NOT_SENDING')
def send_interactions_remove_msg(sim, interactions, immediate=False): logger.debug('send_interactions_remove_msg({}), immediate={}', sim.id, immediate) msg = Sims_pb2.InteractionsRemove() if _build_interactions_remove_msg(sim, msg, interactions): logger.debug(' SENDING') add_message_if_selectable(sim, MSG_SIM_INTERACTIONS_REMOVE, msg, immediate) else: logger.debug(' NOT_SENDING')
def send_interactions_removeall_msg(sim, immediate=False): if sim is None: return logger.debug('send_interactions_removeall_msg({}, immediate={})', sim.id, immediate) msg = Sims_pb2.InteractionsRemove() if _build_interactions_removeall_msg(sim, msg): logger.debug(' SENDING') add_message_if_selectable(sim, MSG_SIM_INTERACTIONS_REMOVE_ALL, msg, immediate) else: logger.debug(' NOT_SENDING')
def get_situation_ids(session_id: int = 0, sim_id: OptionalTargetParam = None, opt_target_id: int = None, *situation_ids, _connection=None): sim = get_optional_target(sim_id, _connection) if opt_target_id is None or opt_target_id == 0: target_sim_id = 0 else: target_sim_id = opt_target_id household = sim.household instance_manager = services.get_instance_manager( sims4.resources.Types.SITUATION) situation_batch_msg = Situations_pb2.SituationIDBatch() situation_batch_msg.situation_session_id = session_id situation_batch_msg.scoring_enabled = household.situation_scoring_enabled valid_situations = [] for situation_id in situation_ids: instance = instance_manager.get(situation_id) (result, mtx_id) = should_display_situation(instance, sim, target_sim_id) while result or result.tooltip is not None: valid_situations.append((instance, mtx_id, result.tooltip)) if not valid_situations: for instance in instance_manager.types.values(): if instance.guid64 in situation_ids: pass (result, mtx_id) = should_display_situation(instance, sim, target_sim_id) while result or result.tooltip is not None: valid_situations.append((instance, mtx_id, result.tooltip)) for (instance, mtx_id, tooltip) in valid_situations: highest_medal_earned = household.get_highest_medal_for_situation( instance.guid64) situation_batch_msg.highest_medal_earned.append(highest_medal_earned) situation_batch_msg.situation_resource_id.append(instance.guid64) situation_batch_msg.mtx_id.append(mtx_id) if tooltip is not None: tooltip = tooltip() situation_batch_msg.tooltip.append(tooltip) else: tooltip = Localization_pb2.LocalizedString() tooltip.hash = 0 situation_batch_msg.tooltip.append(tooltip) situation_batch_msg.category_id.append(instance.category) try: situation_batch_msg.situation_name.extend([instance._display_name]) except: del situation_batch_msg.situation_name[ len(situation_batch_msg.situation_name) - 1] del situation_batch_msg.situation_resource_id[ len(situation_batch_msg.situation_resource_id) - 1] shared_messages.add_message_if_selectable( sim, Consts_pb2.MSG_SITUATION_ID_BATCH, situation_batch_msg, True)
def send_memory_trigger_update(sim, trigger_memory=False, timeout_time=0.0, memory_uid=0): memory_msg = Sims_pb2.MemoryTriggerUpdate() memory_msg.sim_id = sim.id if sim is not None else 0 memory_msg.trigger_memory = trigger_memory memory_msg.timeout = timeout_time memory_msg.memory_id = memory_uid add_message_if_selectable(sim, MSG_SIM_MEMORY_TRIGGER_UPDATE, memory_msg, False)
def send_interaction_replace_message(sim, old_interaction_id, new_interaction_info, immediate=False): logger.debug( 'send_interaction_replace_message({}), old_id={}, new_id={}, immediate={})', sim.id, old_interaction_id, new_interaction_info.interaction_id, immediate) msg = Sims_pb2.InteractionReplace() msg.sim_id = sim.id msg.old_interaction_id = old_interaction_id _build_interaction_msg(new_interaction_info, msg.new_interaction) logger.debug(' SENDING') add_message_if_selectable(sim, MSG_SIM_INTERACTION_REPLACE, msg, immediate)
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 get_sims_for_job(session_id, sim_id, situation_type, job_type, *job_assignments, _connection=None): sim = get_optional_target(sim_id, _connection) situation_start_time = services.time_service().sim_now duration = situation_type.duration if duration > 0: situation_end_time = situation_start_time + date_and_time.create_time_span( 0, 0, duration) else: situation_start_time = date_and_time.INVALID_DATE_AND_TIME situation_end_time = date_and_time.INVALID_DATE_AND_TIME results = services.sim_filter_service().submit_filter( job_type.filter, None, requesting_sim_info=sim.sim_info, start_time=situation_start_time, end_time=situation_end_time, allow_yielding=False) if job_type.additional_filter_for_user_selection: sim_constraints = {result.sim_info.id for result in results} results = services.sim_filter_service().submit_filter( job_type.additional_filter_for_user_selection, None, requesting_sim_info=sim.sim_info, start_time=situation_start_time, end_time=situation_end_time, sim_constraints=sim_constraints, allow_yielding=False) msg = Situations_pb2.SituationJobSims() msg.situation_session_id = session_id msg.job_resource_id = job_type.guid msg.requirements = job_type.requirement_text results.sort(key=lambda x: (x.sim_info.is_npc, x.sim_info.last_name)) for result in results: msg.sim_ids.append(result.sim_info.id) with ProtocolBufferRollback(msg.sims) as situation_job_sim: situation_job_sim.sim_id = result.sim_info.id if result.sim_info.household.id == services.active_household_id(): situation_job_sim.account_id = result.sim_info.account_id while result.conflicting_career_track_id: situation_job_sim.career_track_id = result.conflicting_career_track_id shared_messages.add_message_if_selectable( services.object_manager().get(sim.id), Consts_pb2.MSG_SITUATION_JOB_SIMS, msg, True)
def craft_situation(interaction, targeted_situation_participant, situations_available): msg = Situations_pb2.SituationPrepare() msg.situation_session_id = services.get_zone_situation_manager().get_new_situation_creation_session() msg.sim_id = interaction.sim.id if targeted_situation_participant is not None: target = interaction.get_participant(targeted_situation_participant) if target is not None: msg.is_targeted = True msg.target_id = target.id else: logger.error('None participant for: {} on interaction: {}'.format(targeted_situation_participant, interaction), owner='rmccord') if situations_available is not None: for situation in situations_available: msg.situation_resource_id.append(situation.guid64) shared_messages.add_message_if_selectable(interaction.sim, Consts_pb2.MSG_SITUATION_PREPARE, msg, True) return True
def send_situation_start_ui(self, actor, target=None, situations_available=None, creation_time=None): msg = Situations_pb2.SituationPrepare() msg.situation_session_id = self.get_new_situation_creation_session() msg.creation_time = creation_time if creation_time is not None else 0 msg.sim_id = actor.id if target is not None: msg.is_targeted = True msg.target_id = target.id if situations_available is not None: for situation in situations_available: msg.situation_resource_id.append(situation.guid64) shared_messages.add_message_if_selectable( actor, Consts_pb2.MSG_SITUATION_PREPARE, msg, True)
def get_situation_ids(session_id:int=0, sim_id:OptionalTargetParam=None, opt_target_id:int=None, *situation_ids, _connection=None): sim = get_optional_target(sim_id, _connection) if opt_target_id is None or opt_target_id == 0: target_sim_id = 0 else: target_sim_id = opt_target_id household = sim.household instance_manager = services.get_instance_manager(sims4.resources.Types.SITUATION) situation_batch_msg = Situations_pb2.SituationIDBatch() situation_batch_msg.situation_session_id = session_id situation_batch_msg.scoring_enabled = household.situation_scoring_enabled valid_situations = [] for situation_id in situation_ids: instance = instance_manager.get(situation_id) (result, mtx_id) = should_display_situation(instance, sim, target_sim_id) while result or result.tooltip is not None: valid_situations.append((instance, mtx_id, result.tooltip)) if not valid_situations: for instance in instance_manager.types.values(): if instance.guid64 in situation_ids: pass (result, mtx_id) = should_display_situation(instance, sim, target_sim_id) while result or result.tooltip is not None: valid_situations.append((instance, mtx_id, result.tooltip)) for (instance, mtx_id, tooltip) in valid_situations: highest_medal_earned = household.get_highest_medal_for_situation(instance.guid64) situation_batch_msg.highest_medal_earned.append(highest_medal_earned) situation_batch_msg.situation_resource_id.append(instance.guid64) situation_batch_msg.mtx_id.append(mtx_id) if tooltip is not None: tooltip = tooltip() situation_batch_msg.tooltip.append(tooltip) else: tooltip = Localization_pb2.LocalizedString() tooltip.hash = 0 situation_batch_msg.tooltip.append(tooltip) situation_batch_msg.category_id.append(instance.category) try: situation_batch_msg.situation_name.extend([instance._display_name]) except: del situation_batch_msg.situation_name[len(situation_batch_msg.situation_name) - 1] del situation_batch_msg.situation_resource_id[len(situation_batch_msg.situation_resource_id) - 1] shared_messages.add_message_if_selectable(sim, Consts_pb2.MSG_SITUATION_ID_BATCH, situation_batch_msg, True)
def craft_situation(interaction, targeted_situation_participant, situations_available): msg = Situations_pb2.SituationPrepare() msg.situation_session_id = services.get_zone_situation_manager( ).get_new_situation_creation_session() msg.sim_id = interaction.sim.id if targeted_situation_participant is not None: target = interaction.get_participant( targeted_situation_participant) if target is not None: msg.is_targeted = True msg.target_id = target.id else: logger.error( 'None participant for: {} on interaction: {}'.format( targeted_situation_participant, interaction), owner='rmccord') if situations_available is not None: for situation in situations_available: msg.situation_resource_id.append(situation.guid64) shared_messages.add_message_if_selectable( interaction.sim, Consts_pb2.MSG_SITUATION_PREPARE, msg, True) return True
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)