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
Esempio n. 2
0
 def create_situation(self,
                      situation_type,
                      guest_list=None,
                      user_facing=True,
                      duration_override=None,
                      custom_init_writer=None,
                      zone_id=0,
                      scoring_enabled=True,
                      spawn_sims_during_zone_spin_up=False,
                      creation_source=None,
                      travel_request_kwargs=frozendict(),
                      linked_sim_id=GLOBAL_SITUATION_LINKED_SIM_ID,
                      scheduled_time=None,
                      **extra_kwargs):
     zone = services.current_zone()
     if zone.is_zone_shutting_down:
         return
     current_zone_id = services.current_zone_id()
     situation_type = services.narrative_service(
     ).get_possible_replacement_situation(situation_type)
     if services.get_zone_modifier_service().is_situation_prohibited(
             zone_id if zone_id else current_zone_id, situation_type):
         return
     if guest_list is None:
         guest_list = SituationGuestList()
     hire_cost = guest_list.get_hire_cost()
     host_sim_info = guest_list.host_sim_info
     if host_sim_info is not None and not host_sim_info.household.funds.try_remove(
             situation_type.cost() + hire_cost,
             Consts_pb2.TELEMETRY_EVENT_COST, host_sim_info):
         return
     situation_id = id_generator.generate_object_id()
     self._send_create_situation_telemetry(situation_type, situation_id,
                                           guest_list, hire_cost, zone_id)
     if zone_id and zone_id != current_zone_id and scheduled_time is None:
         return self._create_situation_and_travel(
             situation_type,
             situation_id,
             guest_list,
             user_facing,
             duration_override,
             custom_init_writer,
             zone_id,
             scoring_enabled=scoring_enabled,
             creation_source=creation_source,
             linked_sim_id=linked_sim_id,
             travel_request_kwargs=travel_request_kwargs)
     situation_seed = SituationSeed(
         situation_type,
         SeedPurpose.NORMAL,
         situation_id,
         guest_list,
         user_facing=user_facing,
         duration_override=duration_override,
         zone_id=zone_id,
         scoring_enabled=scoring_enabled,
         spawn_sims_during_zone_spin_up=spawn_sims_during_zone_spin_up,
         creation_source=creation_source,
         linked_sim_id=linked_sim_id,
         **extra_kwargs)
     if custom_init_writer is not None:
         situation_seed.setup_for_custom_init_params(custom_init_writer)
     return_id = None
     if scheduled_time is not None:
         uid = services.drama_scheduler_service().schedule_node(
             self.DEFAULT_PLAYER_PLANNED_DRAMA_NODE,
             SingleSimResolver(guest_list.host_sim.sim_info),
             specific_time=scheduled_time,
             situation_seed=situation_seed)
         return_id = situation_id if uid is not None else None
     else:
         return_id = self.create_situation_from_seed(situation_seed)
     return return_id