def _send_service_npc(self, scheduler, alarm_data, situation_creation_params): household = situation_creation_params.hiring_household service_npc_type = situation_creation_params.service_npc_type if not self._auto_scheduled_services_enabled and service_npc_type.auto_schedule_on_client_connect(): return service_record = household.get_service_npc_record(service_npc_type.guid64) preferred_sim_id = service_record.get_preferred_sim_id() situation_type = service_npc_type.situation user_specified_data_id = situation_creation_params.user_specified_data_id now = services.time_service().sim_now if service_record.time_last_started_service is not None and alarm_data.start_time is not None: alarm_start_time_absolute = date_and_time_from_week_time(now.week(), alarm_data.start_time) if service_record.time_last_started_service >= alarm_start_time_absolute: return service_record.time_last_started_service = now service_record.time_last_finished_service = None duration = alarm_data.end_time - now.time_since_beginning_of_week() min_duration = service_npc_type.min_duration_left_for_arrival_on_lot() if duration < min_duration: service_npc_type.fake_perform(household) return min_duration = service_npc_type.min_work_duration() max_duration = service_npc_type.max_work_duration() duration = clamp(min_duration, duration.in_minutes(), max_duration) guest_list = SituationGuestList(True) if preferred_sim_id is not None: guest_list.add_guest_info(SituationGuestInfo.construct_from_purpose(preferred_sim_id, situation_type.default_job(), SituationInvitationPurpose.PREFERRED)) situation_creation_params_writer = PropertyStreamWriter() situation_creation_params_writer.write_uint64('household_id', household.id) situation_creation_params_writer.write_uint64('service_npc_type_id', service_npc_type.guid64) if user_specified_data_id is not None: situation_creation_params_writer.write_uint64('user_specified_data_id', user_specified_data_id) situation_creation_params_writer.write_bool('is_recurring', situation_creation_params.is_recurring) self._situation_id = services.get_zone_situation_manager().create_situation(situation_type, guest_list, user_facing=False, duration_override=duration, custom_init_writer=situation_creation_params_writer)
def get_predefined_guest_list(cls): guest_list = SituationGuestList(invite_only=True) grabbed_members = [] for ( job, member_info ) in cls.member_job_and_role_states.org_member_jobs_and_roles.items(): members_sim_ids = cls.get_members_sim_infos( job, member_info, blacklist_sims=grabbed_members) grabbed_members.extend(members_sim_ids) for member_sim_id in members_sim_ids: guest_list.add_guest_info( SituationGuestInfo(member_sim_id, job, RequestSpawningOption.DONT_CARE, BouncerRequestPriority.BACKGROUND_HIGH)) filter_service = services.sim_filter_service() grabbed_non_members = [] for (job, role_info ) in cls.non_member_job_and_role_states.jobs_and_roles.items(): non_member_ids = filter_service.submit_matching_filter( sim_filter=job.filter, number_of_sims_to_find=role_info.number_of_sims_to_find, allow_yielding=False, blacklist_sim_ids={ sim_info.sim_id for sim_info in services.active_household() }) grabbed_non_members.extend(non_member_ids) for non_member_result in non_member_ids: guest_list.add_guest_info( SituationGuestInfo(non_member_result.sim_info.id, job, RequestSpawningOption.DONT_CARE, BouncerRequestPriority.BACKGROUND_HIGH)) return guest_list
def _run_interaction_gen(self, timeline): logger.assert_raise( self.situation is not None, 'No situation tuned on RunSituationSuperInteraction: {}'.format( self), owner='rez') situation_manager = services.get_zone_situation_manager() host_sim_id = 0 if self.host_sim is not None: host_sim = self.get_participant(self.host_sim) if host_sim is not None: host_sim_id = host_sim.sim_id guest_list = SituationGuestList(invite_only=self.invite_only, host_sim_id=host_sim_id) if self.job_mapping: for (participant_type, job) in self.job_mapping.items(): sim = self.get_participant(participant_type) if sim is not None: if sim.is_sim: guest_info = SituationGuestInfo.construct_from_purpose( sim.sim_id, job, SituationInvitationPurpose.INVITED) guest_list.add_guest_info(guest_info) user_facing = False scoring_enabled = True if self.ui_options is not None: user_facing = True scoring_enabled = self.ui_options.scoring_enabled situation_manager.create_situation(self.situation, guest_list=guest_list, user_facing=user_facing, interaction=self, scoring_enabled=scoring_enabled) return event_testing.results.ExecuteResult.NONE yield
def _create_standard_ambient_guest_list(self, situation_type, *, sim_info): guest_list = SituationGuestList(invite_only=True) guest_list.add_guest_info( SituationGuestInfo(sim_info.sim_id, situation_type.default_job(), RequestSpawningOption.MUST_SPAWN, BouncerRequestPriority.BACKGROUND_LOW)) return guest_list
def travel_sims_to_zone(opt_sim_id:OptionalTargetParam, zone_id:int, *traveling_sim_ids, _connection=None): sim_or_sim_info = get_optional_target(opt_sim_id, _connection) if sim_or_sim_info is None: if opt_sim_id: sim_or_sim_info = services.sim_info_manager().get(opt_sim_id) if sim_or_sim_info is None: sims4.commands.output('Invalid Sim id: {} specified for travel.travel_sims_to_zone'.format(opt_sim_id), _connection) return False else: sims4.commands.output('No Sim id specified for travel.travel_sims_to_zone', _connection) return False zone_proto_buff = services.get_persistence_service().get_zone_proto_buff(zone_id) if zone_proto_buff is None: sims4.commands.output('Invalid Zone Id: {}. Zone does not exist.'.format(zone_id), _connection) return False situation_manager = services.get_zone_situation_manager() situation = situation_manager.DEFAULT_TRAVEL_SITUATION guest_list = situation.get_predefined_guest_list() if guest_list is None: guest_list = SituationGuestList(invite_only=True, host_sim_id=sim_or_sim_info.id) default_job = situation.default_job() sim_info_manager = services.sim_info_manager() roommate_service = services.get_roommate_service() if roommate_service is not None: traveling_sim_ids = tuple(itertools.chain(traveling_sim_ids, (sim_info.sim_id for sim_info in roommate_service.get_auto_invite_sim_infos(sim_or_sim_info, situation)))) for sim_id in traveling_sim_ids: sim_id = int(sim_id) sim_info = sim_info_manager.get(sim_id) if sim_info is None: continue guest_info = SituationGuestInfo.construct_from_purpose(sim_id, default_job, SituationInvitationPurpose.INVITED) guest_list.add_guest_info(guest_info) guest_info = SituationGuestInfo.construct_from_purpose(sim_or_sim_info.id, default_job, SituationInvitationPurpose.INVITED) guest_list.add_guest_info(guest_info) situation_manager.create_situation(situation, guest_list=guest_list, user_facing=False, zone_id=zone_id)
def get_predefined_guest_list(cls): guest_list = SituationGuestList(invite_only=True) situation_manager = services.get_zone_situation_manager() worker_filter = cls.group_filter if cls.group_filter is not None else cls.default_job( ).filter instanced_sim_ids = [ sim.sim_info.id for sim in services.sim_info_manager().instanced_sims_gen() ] household_sim_ids = [ sim_info.id for sim_info in services.active_household().sim_info_gen() ] auto_fill_blacklist = situation_manager.get_auto_fill_blacklist( sim_job=cls.blacklist_job) situation_sims = set() for situation in situation_manager.get_situations_by_tags(cls.tags): situation_sims.update(situation.invited_sim_ids) blacklist_sim_ids = set( itertools.chain(situation_sims, instanced_sim_ids, household_sim_ids, auto_fill_blacklist)) filter_results = services.sim_filter_service().submit_matching_filter( sim_filter=worker_filter, allow_yielding=False, blacklist_sim_ids=blacklist_sim_ids, gsi_source_fn=cls.get_sim_filter_gsi_name) if not filter_results: return for result in filter_results: job = cls.situation_job_mapping.get(result.tag, cls.default_job()) guest_list.add_guest_info( SituationGuestInfo(result.sim_info.sim_id, job, RequestSpawningOption.DONT_CARE, BouncerRequestPriority.BACKGROUND_HIGH)) return guest_list
def _start_scorable_situation_from_tuning(self): if self._scorable_situation_id is not None: return logger.assert_raise( self._career_events, 'Spinning up career event manger with no career events. Manager: {}', self) career_event = self._career_events[0] if career_event.scorable_situation is None: return situation = career_event.scorable_situation.situation if situation is None: return guest_info = SituationGuestInfo.construct_from_purpose( self._career.sim_info.sim_id, situation.default_job(), SituationInvitationPurpose.CAREER) guest_list = SituationGuestList( invite_only=True, filter_requesting_sim_id=self._career.sim_info.sim_id) guest_list.add_guest_info(guest_info) situation_manager = services.get_zone_situation_manager() duration = self._career.time_until_end_of_work().in_minutes() self._scorable_situation_id = situation_manager.create_situation( situation, guest_list=guest_list, duration_override=duration) self._scorable_situation_setup()
def _on_set_sim_job(self, sim, job_type): super()._on_set_sim_job(sim, job_type) situation_manager = services.get_zone_situation_manager() guest_list = SituationGuestList(invite_only=True) guest_info = SituationGuestInfo(sim.sim_info.id, self.cafe_generic_customer_situation.default_job(), RequestSpawningOption.DONT_CARE, BouncerRequestPriority.BACKGROUND_MEDIUM) guest_list.add_guest_info(guest_info) situation_manager.create_situation(self.cafe_generic_customer_situation, guest_list=guest_list, user_facing=False)
def get_predefined_guest_list(cls): active_sim_info = services.active_sim_info() fire_brigade_volunteers = services.sim_filter_service().submit_matching_filter(number_of_sims_to_find=cls.number_of_volunteers, sim_filter=cls.fire_brigade_job.filter, requesting_sim_info=active_sim_info, allow_yielding=False, blacklist_sim_ids={sim_info.sim_id for sim_info in services.active_household()}, gsi_source_fn=cls.get_sim_filter_gsi_name) if len(fire_brigade_volunteers) < cls.number_of_volunteers: return guest_list = SituationGuestList(invite_only=True, host_sim_id=fire_brigade_volunteers[0].sim_info.sim_id, filter_requesting_sim_id=active_sim_info.sim_id) for volunteer in fire_brigade_volunteers: guest_list.add_guest_info(SituationGuestInfo(volunteer.sim_info.sim_id, cls.fire_brigade_job, RequestSpawningOption.DONT_CARE, BouncerRequestPriority.EVENT_VIP, expectation_preference=True)) return guest_list
def get_predefined_guest_list(cls): guest_list = SituationGuestList(True) worker_filter = cls.default_job().filter sim_infos = services.sim_filter_service().submit_filter(worker_filter, None, allow_yielding=False) if sim_infos: guest_list.add_guest_info(SituationGuestInfo(sim_infos[0].sim_info.sim_id, cls.default_job(), RequestSpawningOption.DONT_CARE, None)) else: guest_list.add_guest_info(SituationGuestInfo(0, cls.default_job(), RequestSpawningOption.DONT_CARE, None)) return guest_list
def get_predefined_guest_list(cls): if not cls.force_patient_on_active_career_sim: return career = services.get_career_service().get_career_in_career_event() if career is None: return guest_list = SituationGuestList(invite_only=True) guest_list.add_guest_info(SituationGuestInfo(career.sim_info.sim_id, cls.default_job(), RequestSpawningOption.CANNOT_SPAWN, BouncerRequestPriority.EVENT_VIP)) return guest_list
def get_predefined_guest_list(cls): guest_list = SituationGuestList(invite_only=True) members_sim_ids = cls.get_members_sim_infos() for member_sim_id in members_sim_ids: guest_list.add_guest_info( SituationGuestInfo(member_sim_id, cls.job_and_role_state.job, RequestSpawningOption.DONT_CARE, BouncerRequestPriority.BACKGROUND_HIGH)) return guest_list
def _create_fire_situation_on_sim(self, sim, situation_manager=None): if sim.id in self._situation_ids: return if situation_manager is None: situation_manager = services.current_zone().situation_manager guest_list = SituationGuestList(invite_only=True) guest_info = SituationGuestInfo.construct_from_purpose(sim.sim_id, self.FIRE_JOB, SituationInvitationPurpose.INVITED) guest_list.add_guest_info(guest_info) situation_id = situation_manager.create_situation(self.FIRE_SITUATION, guest_list=guest_list, user_facing=False) self._situation_ids[sim.id] = situation_id
def create_arrival_situation_for_sim(self, sim_info, situation_type=DEFAULT, during_spin_up=False): if situation_type is DEFAULT: situation_type = self.user_sim_arrival_situation situation_manager = services.get_zone_situation_manager() if during_spin_up and self._sim_info_already_in_arrival_situation(sim_info, situation_manager): return guest_list = SituationGuestList(invite_only=True) guest_info = SituationGuestInfo.construct_from_purpose(sim_info.id, situation_type.default_job(), SituationInvitationPurpose.INVITED) guest_list.add_guest_info(guest_info) self.create_arrival_situation(situation_type, guest_list, situation_manager)
def _start_special_event(dialog): guest_list = None if dialog.accepted: start_user_facing = True guest_list = SituationGuestList() guest_info = SituationGuestInfo.construct_from_purpose(invited_sim.id, situation.venue_situation_player_job, SituationInvitationPurpose.INVITED) guest_list.add_guest_info(guest_info) else: start_user_facing = False situation_id = situation_manager.create_situation(situation, guest_list=guest_list, user_facing=start_user_facing) self._active_special_event_id = situation_id
def get_predefined_guest_list(cls): active_sim_info = services.active_sim_info() guest_list = SituationGuestList(invite_only=True, host_sim_id=active_sim_info.id) worker_filter = cls.group_filter if cls.group_filter is not None else cls.default_job().filter filter_results = services.sim_filter_service().submit_matching_filter(sim_filter=worker_filter, allow_yielding=False, gsi_source_fn=cls.get_sim_filter_gsi_name) if not filter_results: logger.error('Failed to find/create any sims for {}; using defaults in ambient service', cls, owner='rez') return guest_list for result in filter_results: guest_list.add_guest_info(SituationGuestInfo(result.sim_info.sim_id, cls.default_job(), RequestSpawningOption.MUST_SPAWN, BouncerRequestPriority.BACKGROUND_LOW)) return guest_list
def __call__(self, interaction, picked_sim_ids): guest_list = SituationGuestList(invite_only=True) adoption_service = services.get_adoption_service() for sim_id in picked_sim_ids: replacement_sim_info = adoption_service.convert_base_sim_info_to_full(sim_id) if replacement_sim_info is None: sim_id_to_adopt = sim_id else: sim_id_to_adopt = replacement_sim_info.sim_id guest_list.add_guest_info(SituationGuestInfo(sim_id_to_adopt, self.adoptee_situation_job, RequestSpawningOption.DONT_CARE, BouncerRequestPriority.EVENT_VIP, reservation=True)) services.get_zone_situation_manager().create_situation(self.situation_type, guest_list=guest_list, user_facing=False)
def get_all_sim_arrival_guest_list(self, situation_manager, during_spin_up=False): sim_infos = [sim_info for sim_info in self.get_user_controlled_sim_infos()] if self.place_travel_companion_in_same_arrival_situation: sim_infos.extend(self._traveled_sim_infos) guest_list = SituationGuestList(invite_only=True) for sim_info in sim_infos: if during_spin_up and self._sim_info_already_in_arrival_situation(sim_info, situation_manager): continue guest_info = SituationGuestInfo.construct_from_purpose(sim_info.id, self.user_sim_arrival_situation.default_job(), SituationInvitationPurpose.INVITED) guest_list.add_guest_info(guest_info) return guest_list
def _on_set_sim_job(self, sim, job_type): super()._on_set_sim_job(sim, job_type) situation_manager = services.get_zone_situation_manager() guest_list = SituationGuestList(invite_only=True) guest_info = SituationGuestInfo.construct_from_purpose( sim.sim_info.id, self.party_goer_situation.default_job(), SituationInvitationPurpose.INVITED) guest_list.add_guest_info(guest_info) situation_manager.create_situation(self.party_goer_situation, guest_list=guest_list, user_facing=False)
def start_career_situation(self): if self._career_situation is not None: guest_info = SituationGuestInfo.construct_from_purpose(self._sim_info.sim_id, self._career_situation.job, SituationInvitationPurpose.CAREER) guest_list = SituationGuestList() guest_list.add_guest_info(guest_info) situation_manager = services.get_zone_situation_manager() situation = self._career_situation.situation if not situation.has_venue_location(): logger.error("Tried starting a career event, career:{} level:{}, and couldn't find a valid venue. There should ALWAYS be a Maxis Lot tuned for every venue type. - trevorlindsey", self, self.level) return False zone_id = situation.get_venue_location() self._career_situation_id = situation_manager.create_situation(self._career_situation.situation, guest_list=guest_list, zone_id=zone_id)
def _create_situation(sim_infos): guest_list = SituationGuestList(invite_only=True, host_sim_id=host_sim_id) for sim_info in sim_infos: guest_info = situation_guest_list.SituationGuestInfo.construct_from_purpose( sim_info.sim_id, situation_job, situation_guest_list.SituationInvitationPurpose.INVITED) guest_list.add_guest_info(guest_info) services.get_zone_situation_manager().create_situation( self.situation_to_create, guest_list=guest_list, user_facing=False)
def start_situation(interaction, situation, user_facing): situation_manager = services.get_zone_situation_manager() guest_list = situation.get_predefined_guest_list() if guest_list is None: sim = interaction.sim guest_list = SituationGuestList(invite_only=True, host_sim_id=sim.id) if situation.targeted_situation is not None: target_sim = interaction.get_participant(ParticipantType.PickedSim) if target_sim is None: target_sim = interaction.get_participant(ParticipantType.TargetSim) target_sim_id = target_sim.id if target_sim is not None else None job_assignments = situation.get_prepopulated_job_for_sims(sim, target_sim_id) for (sim_id, job_type_id) in job_assignments: job_type = services.situation_job_manager().get(job_type_id) guest_info = SituationGuestInfo.construct_from_purpose(sim_id, job_type, SituationInvitationPurpose.INVITED) guest_list.add_guest_info(guest_info) else: default_job = situation.default_job() target_sims = interaction.get_participants(ParticipantType.PickedSim) if target_sims: for sim_or_sim_info in target_sims: guest_info = SituationGuestInfo.construct_from_purpose(sim_or_sim_info.sim_id, default_job, SituationInvitationPurpose.INVITED) guest_list.add_guest_info(guest_info) else: target_sim = interaction.get_participant(ParticipantType.TargetSim) if target_sim is not None: guest_info = SituationGuestInfo.construct_from_purpose(target_sim.sim_id, default_job, SituationInvitationPurpose.INVITED) guest_list.add_guest_info(guest_info) guest_info = SituationGuestInfo.construct_from_purpose(sim.sim_id, default_job, SituationInvitationPurpose.INVITED) guest_list.add_guest_info(guest_info) zone_id = interaction.get_participant(ParticipantType.PickedZoneId) or 0 situation_manager.create_situation(situation, guest_list=guest_list, user_facing=user_facing, zone_id=zone_id)
def get_predefined_guest_list(cls): active_sim_info = services.active_sim_info() neighbor_sim_id = cls._get_neighbor() guest_list = SituationGuestList( invite_only=True, host_sim_id=neighbor_sim_id, filter_requesting_sim_id=active_sim_info.sim_id) guest_list.add_guest_info( SituationGuestInfo(neighbor_sim_id, cls.neighbor_job_and_role_state.job, RequestSpawningOption.DONT_CARE, BouncerRequestPriority.BACKGROUND_MEDIUM, expectation_preference=True)) return guest_list
def get_predefined_guest_list(cls): active_sim_info = services.active_sim_info() door_knocker_results = services.sim_filter_service().submit_filter(cls._door_knocker_situation_job.filter, callback=None, requesting_sim_info=active_sim_info, allow_yielding=False, gsi_source_fn=cls.get_sim_filter_gsi_name) if not door_knocker_results: return door_knocker = random.choice(door_knocker_results) guest_list = SituationGuestList(invite_only=True, host_sim_id=door_knocker.sim_info.sim_id, filter_requesting_sim_id=active_sim_info.sim_id) guest_list.add_guest_info(SituationGuestInfo(door_knocker.sim_info.sim_id, cls._door_knocker_situation_job, RequestSpawningOption.DONT_CARE, BouncerRequestPriority.EVENT_VIP, expectation_preference=True)) blacklist = set() blacklist.add(door_knocker.sim_info.sim_id) kava_carrier_results = services.sim_filter_service().submit_filter(cls._fruitcake_bearer_situation_job.filter, callback=None, requesting_sim_info=active_sim_info, allow_yielding=False, blacklist_sim_ids=blacklist, gsi_source_fn=cls.get_sim_filter_gsi_name) if not kava_carrier_results: return kava_carrier = random.choice(kava_carrier_results) guest_list.add_guest_info(SituationGuestInfo(kava_carrier.sim_info.sim_id, cls._fruitcake_bearer_situation_job, RequestSpawningOption.DONT_CARE, BouncerRequestPriority.EVENT_VIP, expectation_preference=True)) blacklist.add(kava_carrier.sim_info.sim_id) lei_carrier_results = services.sim_filter_service().submit_filter(cls._lei_carrier_situation_job.filter, callback=None, requesting_sim_info=active_sim_info, allow_yielding=False, blacklist_sim_ids=blacklist, gsi_source_fn=cls.get_sim_filter_gsi_name) if not lei_carrier_results: return lei_carrier = random.choice(lei_carrier_results) guest_list.add_guest_info(SituationGuestInfo(lei_carrier.sim_info.sim_id, cls._lei_carrier_situation_job, RequestSpawningOption.DONT_CARE, BouncerRequestPriority.EVENT_VIP, expectation_preference=True)) blacklist.add(lei_carrier.sim_info.sim_id) other_neighbors_results = services.sim_filter_service().submit_filter(cls._other_neighbors_job.filter, callback=None, requesting_sim_info=active_sim_info, allow_yielding=False, blacklist_sim_ids=blacklist, gsi_source_fn=cls.get_sim_filter_gsi_name) if not other_neighbors_results: return guest_list if len(other_neighbors_results) > cls._number_of_neighbors: neighbors = random.sample(other_neighbors_results, cls._number_of_neighbors) else: neighbors = other_neighbors_results for neighbor in neighbors: guest_list.add_guest_info(SituationGuestInfo(neighbor.sim_info.sim_id, cls._other_neighbors_job, RequestSpawningOption.DONT_CARE, BouncerRequestPriority.EVENT_VIP, expectation_preference=True)) return guest_list
def _create_NPC_hosted_situation(dialog): if not dialog.accepted: with telemetry_helper.begin_hook(writer, TELEMETRY_HOOK_SITUATION_REJECTED, sim=player_sim) as hook: hook.write_guid('type', chosen_situation.guid64) return guest_list = SituationGuestList(host_sim_id=NPC_sim_id) if chosen_situation.NPC_hosted_situation_use_player_sim_as_filter_requester: guest_list.filter_requesting_sim_id = player_sim.id guest_list.add_guest_info(SituationGuestInfo.construct_from_purpose(player_sim.id, chosen_situation.NPC_hosted_situation_player_job, SituationInvitationPurpose.INVITED)) chosen_zone_id = chosen_situation.get_venue_location() services.get_zone_situation_manager().create_situation(chosen_situation, guest_list=guest_list, zone_id=chosen_zone_id) self.add_cooldown(self._cooldown) with telemetry_helper.begin_hook(writer, TELEMETRY_HOOK_SITUATION_ACCEPTED, sim=player_sim) as hook: hook.write_guid('type', chosen_situation.guid64)
def force_career_event(career_situation_type, opt_sim:OptionalTargetParam=None, _connection=None): sim = get_optional_target(opt_sim, _connection) if not sim: sims4.commands.output('Invalid Sim ID: {}'.format(opt_sim), _connection) return guest_info = SituationGuestInfo.construct_from_purpose(sim.id, career_situation_type.job, SituationInvitationPurpose.CAREER) guest_list = SituationGuestList() guest_list.add_guest_info(guest_info) situation_manager = services.get_zone_situation_manager() situation = career_situation_type.situation if not situation.has_venue_location(): logger.error("Tried forcing a career event:{} and couldn't find a valid venue.", career_situation_type) return False zone_id = situation.get_venue_location() situation_manager.create_situation(situation, guest_list=guest_list, zone_id=zone_id)
def _create_holiday_situation(self, sim_info, holiday_goals): guest_list = SituationGuestList(invite_only=True, host_sim_id=sim_info.id) guest_list.add_guest_info( SituationGuestInfo(sim_info.id, HolidayTuning.HOLIDAY_JOB, RequestSpawningOption.DONT_CARE, BouncerRequestPriority.EVENT_VIP)) situation_id = services.get_zone_situation_manager().create_situation( HolidayTuning.HOLIDAY_SITUATION, guest_list=guest_list, linked_sim_id=sim_info.id, dynamic_goals=holiday_goals) if situation_id: self._situation_ids.append(situation_id) return situation_id
def request_player_turn(self, sim_info): guest_list = SituationGuestList(invite_only=True) guest_list.add_guest_info( SituationGuestInfo(sim_info.sim_id, self.player_contestant_situation.contestant_job, RequestSpawningOption.CANNOT_SPAWN, BouncerRequestPriority.EVENT_VIP)) situation_id = services.get_zone_situation_manager().create_situation( self.player_contestant_situation, guest_list=guest_list, user_facing=False, scoring_enabled=False) if situation_id is None: return self._player_contestant_situation_ids.append(situation_id)
def _on_set_sim_role_state(self, sim, job_type, role_state_type, role_affordance_target): super()._on_set_sim_role_state(sim, job_type, role_state_type, role_affordance_target) if self.lock_doors_situation is not None: guest_list = SituationGuestList(invite_only=True) guest_list.add_guest_info( SituationGuestInfo( sim.sim_id, self.lock_doors_situation.get_lock_out_job(), RequestSpawningOption.CANNOT_SPAWN, BouncerRequestPriority.EVENT_DEFAULT_JOB)) self._lock_out_situation_id = services.get_zone_situation_manager( ).create_situation(self.lock_doors_situation, user_facing=False, guest_list=guest_list)
def _on_set_sim_job(self, sim, job_type): super()._on_set_sim_job(sim, job_type) situation_manager = services.get_zone_situation_manager() guest_list = SituationGuestList(invite_only=True) guest_list.add_guest_info( SituationGuestInfo(sim.sim_id, self.sub_situation.job_and_role_state.job, RequestSpawningOption.DONT_CARE, BouncerRequestPriority.EVENT_VIP)) sub_situation_id = situation_manager.create_situation( self.sub_situation, guest_list=guest_list, background_situation_id=self.id, user_facing=False) self._guest_sub_situation_dict[sim.id] = sub_situation_id self.gathering_sim_ids.add(sim.id)
def _run_interaction_gen(self, timeline): logger.assert_raise(self.situation is not None, 'No situation tuned on RunSituationSuperInteraction: {}'.format(self), owner='rez') situation_manager = services.get_zone_situation_manager() host_sim_id = 0 host_sim = self.get_participant(self.host_sim) if host_sim is not None: host_sim_id = host_sim.sim_id guest_list = SituationGuestList(host_sim_id=host_sim_id) if self.job_mapping: for (participant_type, job) in self.job_mapping.items(): sim = self.get_participant(participant_type) while sim is not None and sim.is_sim: guest_info = SituationGuestInfo.construct_from_purpose(sim.sim_id, job, SituationInvitationPurpose.INVITED) guest_list.add_guest_info(guest_info) situation_manager.create_situation(self.situation, guest_list=guest_list, user_facing=False) return event_testing.results.ExecuteResult.NONE
def _start_special_event(dialog): guest_list = None if dialog.accepted: start_user_facing = True guest_list = SituationGuestList() guest_info = SituationGuestInfo.construct_from_purpose( invited_sim.id, situation.venue_situation_player_job, SituationInvitationPurpose.INVITED) guest_list.add_guest_info(guest_info) else: start_user_facing = False situation_id = situation_manager.create_situation( situation, guest_list=guest_list, user_facing=start_user_facing) self._active_special_event_id = situation_id
def _run_situation(self): host_sim_id = 0 host_sim_info = None if self.host_sim_participant is not None: host_sim_info = self._get_resolver().get_participant( self.host_sim_participant) host_sim_id = host_sim_info.id guest_list = self.situation_to_run.get_predefined_guest_list() if guest_list is None: guest_list = SituationGuestList(invite_only=True, host_sim_id=host_sim_id) if self._sender_sim_info is not None and self.sender_sim_info_job is not None: guest_list.add_guest_info( SituationGuestInfo.construct_from_purpose( self._sender_sim_info.id, self.sender_sim_info_job, SituationInvitationPurpose.INVITED)) if host_sim_info is not None and self.host_sim_info_job is not None: guest_list.add_guest_info( SituationGuestInfo.construct_from_purpose( host_sim_info.id, self.host_sim_info_job, SituationInvitationPurpose.HOSTING)) zone_id = 0 if self.lot is not None: lot_id = get_lot_id_from_instance_id(self.lot) zone_id = services.get_persistence_service( ).resolve_lot_id_into_zone_id(lot_id, ignore_neighborhood_id=True) situation_id = services.get_zone_situation_manager().create_situation( self.situation_to_run, guest_list=guest_list, spawn_sims_during_zone_spin_up=self.spawn_sims_during_zone_spin_up, user_facing=self.user_facing, zone_id=zone_id) if self.household_milestone and situation_id: active_household_milestone_tracker = services.active_household( ).household_milestone_tracker active_household_milestone_tracker.reset_milestone( self.household_milestone) if self.notification is not None: target_sim_id = self._sender_sim_info.id if self._sender_sim_info is not None else None dialog = self.notification(self._receiver_sim_info, DoubleSimResolver( self._sender_sim_info, self._receiver_sim_info), target_sim_id=target_sim_id) dialog.show_dialog() return True
def get_predefined_guest_list(cls): active_sim_info = services.active_sim_info() neighbor_results = cls.get_filter_results_for_job() if not neighbor_results: return neighbor = random.choice(neighbor_results) guest_list = SituationGuestList( invite_only=True, host_sim_id=neighbor.sim_info.sim_id, filter_requesting_sim_id=active_sim_info.sim_id) guest_list.add_guest_info( SituationGuestInfo(neighbor.sim_info.sim_id, cls.neighbor_job_and_default_role_state.job, RequestSpawningOption.DONT_CARE, BouncerRequestPriority.EVENT_VIP, expectation_preference=True)) return guest_list
def get_predefined_guest_list(cls): guest_list = SituationGuestList(invite_only=True) worker_filter = cls.group_filter if cls.group_filter is not None else cls.default_job( ).filter filter_results = services.sim_filter_service().submit_matching_filter( sim_filter=worker_filter, allow_yielding=False, gsi_source_fn=cls.get_sim_filter_gsi_name) if not filter_results: logger.error('Failed to find/create any sims for {};', cls) return guest_list for result in filter_results: job = cls.man_job_and_role.job if result.sim_info.is_male else cls.woman_job_and_role.job guest_list.add_guest_info( SituationGuestInfo(result.sim_info.sim_id, job, RequestSpawningOption.DONT_CARE, BouncerRequestPriority.BACKGROUND_MEDIUM)) return guest_list
def _try_spawn_stan_situation_for_sim(self, stanned_sim): if self.stan_situation is None: return stan_results = services.sim_filter_service().submit_matching_filter( sim_filter=FanTuning.STAN_FILTER, number_of_sims_to_find=1, requesting_sim_info=stanned_sim.sim_info, allow_instanced_sims=True, allow_yielding=False, gsi_source_fn=lambda: 'FanSituationManager: Stan for {}'.format( str(stanned_sim))) if not stan_results: logger.warn('Could not create/find a stan for {}', str(stanned_sim)) return stan_sim_info = stan_results[0].sim_info stan_id = stan_sim_info.sim_id in_stan_home_zone = stan_sim_info.household.home_zone_id == services.current_zone_id( ) if not in_stan_home_zone and FanTuning.STAN_DISABLING_BITS & set( services.relationship_service().get_all_bits( stan_id, target_sim_id=stanned_sim.sim_id)): return duration_override = 0 if in_stan_home_zone else None situation_manager = services.get_zone_situation_manager() guest_list = SituationGuestList(invite_only=True, host_sim_id=stanned_sim.sim_id) guest_list.add_guest_info( SituationGuestInfo(stan_id, self.stan_situation.fan_job, RequestSpawningOption.DONT_CARE, BouncerRequestPriority.EVENT_VIP)) situation_id = situation_manager.create_situation( self.stan_situation, guest_list=guest_list, user_facing=False, duration_override=duration_override, creation_source='FanSituationManager: Stan Situation targetting {}' .format(str(stanned_sim))) if situation_id is None: logger.error('Unable to create Stan situation') return self._stan_situation_ids.add(situation_id)
def create_situation_with_guest_list(situation_type, scoring_enabled, zone_id:int=0, *args, _connection=None): if len(args) % 3 != 0: sims4.commands.output('Invalid guest list, its length must be a multiple of 3', _connection) return False situation_manager = services.get_zone_situation_manager() client = services.client_manager().get(_connection) if client.active_sim is not None: host_sim_id = client.active_sim.id client.active_sim.household.set_situation_scoring(scoring_enabled) else: host_sim_id = 0 guest_list = SituationGuestList(situation_type.force_invite_only, host_sim_id) guest_list_is_good = True for (job_name_or_key, sim_id_or_name, purpose_name) in zip(args[0::3], args[1::3], args[2::3]): job_type = services.situation_job_manager().get(job_name_or_key) if job_type is None: sims4.commands.output('Invalid job name or key: {}'.format(job_name_or_key), _connection) guest_list_is_good = False try: purpose = SituationInvitationPurpose(purpose_name) except ValueError: sims4.commands.output('Invalid Purpose: {}. Use INVITED, HIRED, or PREFERRED'.format(purpose_name), _connection) guest_list_is_good = False continue try: sim_id = int(sim_id_or_name) except (ValueError, TypeError): sims4.commands.output('Incorrectly formatted sim_id {}'.format(sim_id_or_name), _connection) guest_list_is_good = False continue guest_info = SituationGuestInfo.construct_from_purpose(sim_id, job_type, purpose) guest_list.add_guest_info(guest_info) if not guest_list_is_good: sims4.commands.output('FAILURE: bad guest list {}.'.format(situation_type), _connection) return False situation_id = situation_manager.create_situation(situation_type, guest_list=guest_list, zone_id=zone_id, scoring_enabled=scoring_enabled) if situation_id is not None: sims4.commands.output('Successfully created situation: {}.'.format(situation_id), _connection) else: sims4.commands.output('Insufficient funds to create situation', _connection) return True
def _create_situation(sim_infos): guest_list = SituationGuestList(invite_only=True, host_sim_id=host_sim_id) for sim_info in sim_infos: guest_info = situation_guest_list.SituationGuestInfo.construct_from_purpose(sim_info.sim_id, situation_job, situation_guest_list.SituationInvitationPurpose.INVITED) guest_list.add_guest_info(guest_info) services.get_zone_situation_manager().create_situation(self.situation_to_create, guest_list=guest_list, user_facing=False)