Ejemplo n.º 1
0
def create_lod_sim_infos(quantity: int = 1,
                         lod: SimInfoLODLevel = SimInfoLODLevel.MINIMUM,
                         _connection=None):
    output = sims4.commands.CheatOutput(_connection)
    account = services.client_manager().get(_connection).account
    for _ in range(quantity):
        gender = random.choice(list(Gender))
        age = random.choice([Age.TEEN, Age.YOUNGADULT, Age.ADULT, Age.ELDER])
        first_name = SimSpawner.get_random_first_name(gender)
        last_name = 'CheatFamilyLOD{}'.format(lod)
        sc = SimCreator(gender=gender,
                        age=age,
                        first_name=first_name,
                        last_name=last_name)
        household = services.household_manager().create_household(account)
        (si, _) = SimSpawner.create_sim_infos(
            (sc, ),
            household=household,
            zone_id=0,
            creation_source='cheat: LOD SimInfo')
        if not si[0].request_lod(lod):
            output('Failed to request {} lod for {}'.format(lod, si[0]))
        output('Created a SimInfo and requested {} LOD: {}.'.format(
            lod, si[0]))
    output('Created a total of {} SimInfos at {} LOD'.format(lod, quantity))
Ejemplo n.º 2
0
def debug_create_baby(actor_sim, position, gender, routing_surface=None):
    baby = None
    try:
        actor_sim_info = actor_sim.sim_info
        account = actor_sim.sim_info.account
        sim_creator = SimCreator(gender=gender, age=Age.BABY, first_name=SimSpawner.get_random_first_name(account, gender == Gender.FEMALE), last_name=SimSpawner.get_family_name_for_gender(account, actor_sim.last_name, gender == Gender.FEMALE))
        (sim_info_list, _) = SimSpawner.create_sim_infos((sim_creator,), household=actor_sim_info.household, account=account, zone_id=actor_sim_info.zone_id, creation_source='cheat: debug_create_baby')
        sim_info = sim_info_list[0]
        baby_def = Baby.get_default_baby_def()
        baby = create_object(baby_def, sim_info.sim_id)
        baby.set_sim_info(sim_info)
        fgl_context = placement.FindGoodLocationContext(starting_position=position, object_id=baby.id, search_flags=placement.FGLSearchFlagsDefault, object_footprints=(baby.get_footprint(),))
        (trans, orient) = placement.find_good_location(fgl_context)
        if trans is not None:
            baby.location = sims4.math.Location(sims4.math.Transform(trans, orient), routing_surface)
        client = services.client_manager().get_client_by_household_id(sim_info.household_id)
        while client is not None:
            client.selectable_sims.add_selectable_sim_info(sim_info)
    except Exception as e:
        logger.exception('Create baby fail', e)
        if actor_sim_info.household.sim_in_household(sim_info.sim_id):
            actor_sim_info.household.remove_sim_info(sim_info)
        client = services.client_manager().get_client_by_household_id(sim_info.household_id)
        if client is not None:
            client.selectable_sims.remove_selectable_sim_info(sim_info)
        while baby is not None:
            baby.destroy(source=actor_sim, cause='Create baby fail')
    def create_human_sim_info(gender: Gender = None,
                              age: Age = None,
                              first_name: str = None,
                              last_name: str = None,
                              trait_ids: Tuple[int] = (),
                              household: Household = None,
                              source: str = 'testing') -> Union[SimInfo, None]:
        """create_human_sim_info(\
            gender=None,\
            age=None,\
            species=None,\
            first_name=None,\
            last_name=None,\
            trait_ids=(),\
            household=None,\
            source='testing'\
        )

        Create SimInfo for a Human Sim.

        :param gender: The Gender of the created Sim.
        :type gender: Gender, optional
        :param age: The Age of the created Sim.
        :type age: Age, optional
        :param first_name: The First Name of the created Sim.
        :type first_name: str, optional
        :param last_name: The Last Name of the created Sim.
        :type last_name: str, optional
        :param trait_ids: The decimal identifiers of the Traits to add to the created Sim.
        :type trait_ids: Tuple[int], optional
        :param household: The household to place the created Sim in. If None, the Sim will be placed in a hidden household.
        :type household: Household, optional
        :param source: The reason for the Sims creation.
        :type source: str, optional
        :return: The SimInfo of the created Sim or None if the Sim failed to be created.
        :rtype: SimInfo
        """
        from sims4communitylib.utils.sims.common_household_utils import CommonHouseholdUtils
        household = household or CommonHouseholdUtils.create_empty_household(
            as_hidden_household=True)
        sim_creator = SimCreator(
            gender=gender,
            age=age,
            first_name=first_name
            or SimSpawner.get_random_first_name(gender, Species.HUMAN),
            last_name=last_name,
            traits=trait_ids)
        (sim_info_list, _) = SimSpawner.create_sim_infos(
            (sim_creator, ),
            household=household,
            generate_deterministic_sim=True,
            creation_source=source)
        if not sim_info_list:
            return None
        return sim_info_list[0]
Ejemplo n.º 4
0
 def bind_familiar(self, familiar_type, pet_familiar=None):
     if pet_familiar is None:
         name = SimSpawner.get_random_first_name(Gender.MALE, sim_name_type_override=FamiliarTracker.FAMILIAR_DATA[familiar_type].familiar_type.name_list)
         pet_familiar_id = None
     else:
         name = None
         pet_familiar_id = pet_familiar.sim_id
         services.relationship_service().add_relationship_bit(self._owner.sim_id, pet_familiar.sim_id, FamiliarTracker.PET_FAMILIAR_BIT)
     familiar_uid = id_generator.generate_object_id()
     new_familiar = FamiliarInfo(familiar_uid, familiar_type, name, pet_familiar_id)
     self._familiars[new_familiar.uid] = new_familiar
     return new_familiar.uid
Ejemplo n.º 5
0
def debug_create_baby(actor_sim, position, gender, routing_surface=None):
    baby = None
    try:
        actor_sim_info = actor_sim.sim_info
        account = actor_sim.sim_info.account
        sim_creator = SimCreator(
            gender=gender,
            age=Age.BABY,
            first_name=SimSpawner.get_random_first_name(
                account, gender == Gender.FEMALE),
            last_name=SimSpawner.get_family_name_for_gender(
                account, actor_sim.last_name, gender == Gender.FEMALE))
        (sim_info_list, _) = SimSpawner.create_sim_infos(
            (sim_creator, ),
            household=actor_sim_info.household,
            account=account,
            zone_id=actor_sim_info.zone_id,
            creation_source='cheat: debug_create_baby')
        sim_info = sim_info_list[0]
        baby_def = Baby.get_default_baby_def()
        baby = create_object(baby_def, sim_info.sim_id)
        baby.set_sim_info(sim_info)
        fgl_context = placement.FindGoodLocationContext(
            starting_position=position,
            object_id=baby.id,
            search_flags=placement.FGLSearchFlagsDefault,
            object_footprints=(baby.get_footprint(), ))
        (trans, orient) = placement.find_good_location(fgl_context)
        if trans is not None:
            baby.location = sims4.math.Location(
                sims4.math.Transform(trans, orient), routing_surface)
        client = services.client_manager().get_client_by_household_id(
            sim_info.household_id)
        while client is not None:
            client.selectable_sims.add_selectable_sim_info(sim_info)
    except Exception as e:
        logger.exception('Create baby fail', e)
        if actor_sim_info.household.sim_in_household(sim_info.sim_id):
            actor_sim_info.household.remove_sim_info(sim_info)
        client = services.client_manager().get_client_by_household_id(
            sim_info.household_id)
        if client is not None:
            client.selectable_sims.remove_selectable_sim_info(sim_info)
        while baby is not None:
            baby.destroy(source=actor_sim, cause='Create baby fail')
Ejemplo n.º 6
0
    def _get_random_first_name(self, offspring_data):
        tries_left = 10

        def is_valid(first_name):
            nonlocal tries_left
            if not first_name:
                return False
            tries_left -= 1
            if tries_left and any(sim.first_name == first_name for sim in self._sim_info.household):
                return False
            if any(sim.first_name == first_name for sim in self._offspring_data):
                return False
            return True

        first_name = None
        while not is_valid(first_name):
            first_name = SimSpawner.get_random_first_name(self.account, offspring_data.is_female)
        return first_name
Ejemplo n.º 7
0
 def add_sim_info(self, age, gender, species):
     key = (age, gender, species)
     sim_info = SimInfoBaseWrapper(age=age, gender=gender, species=species)
     generate_random_siminfo(sim_info._base)
     breed_tag = get_random_breed_tag(species)
     if breed_tag is not None:
         try_conform_sim_info_to_breed(sim_info, breed_tag)
     trait_manager = services.get_instance_manager(sims4.resources.Types.TRAIT)
     traits = {trait_manager.get(trait_id) for trait_id in sim_info.trait_ids}
     if sim_info.is_pet:
         gender_option_traits = [(entry.weight, entry.trait) for entry in self.PET_ADOPTION_GENDER_OPTION_TRAITS if entry.trait.is_valid_trait(sim_info)]
         selected_trait = sims4.random.weighted_random_item(gender_option_traits)
         if selected_trait is not None:
             traits.add(selected_trait)
     sim_info.set_trait_ids_on_base(trait_ids_override=list(t.guid64 for t in traits))
     sim_info.first_name = SimSpawner.get_random_first_name(gender, species)
     sim_info.manager = services.sim_info_manager()
     Distributor.instance().add_object(sim_info)
     self._sim_infos[key].append(sim_info)
Ejemplo n.º 8
0
    def _get_random_first_name(self, offspring_data):
        tries_left = 10

        def is_valid(first_name):
            nonlocal tries_left
            if not first_name:
                return False
            tries_left -= 1
            if tries_left and any(sim.first_name == first_name
                                  for sim in self._sim_info.household):
                return False
            elif any(sim.first_name == first_name
                     for sim in self._offspring_data):
                return False
            return True

        first_name = None
        while not is_valid(first_name):
            first_name = SimSpawner.get_random_first_name(
                offspring_data.gender, offspring_data.species)
        return first_name
Ejemplo n.º 9
0
 def _create_clone_sim_info(self, source_sim_info, resolver, household):
     sim_creator = SimCreator(
         gender=source_sim_info.gender,
         age=source_sim_info.age,
         first_name=SimSpawner.get_random_first_name(
             source_sim_info.gender, source_sim_info.species),
         last_name=source_sim_info._base.last_name,
         traits=source_sim_info.trait_tracker.equipped_traits)
     (sim_info_list, _) = SimSpawner.create_sim_infos(
         (sim_creator, ),
         household=household,
         account=source_sim_info.account,
         generate_deterministic_sim=True,
         creation_source='cloning',
         skip_adding_to_household=True)
     clone_sim_info = sim_info_list[0]
     source_sim_proto = source_sim_info.save_sim(for_cloning=True)
     clone_sim_id = clone_sim_info.sim_id
     clone_first_name = clone_sim_info._base.first_name
     clone_last_name = clone_sim_info._base.last_name
     clone_breed_name = clone_sim_info._base.breed_name
     clone_first_name_key = clone_sim_info._base.first_name_key
     clone_last_name_key = clone_sim_info._base.last_name_key
     clone_full_name_key = clone_sim_info._base.full_name_key
     clone_breed_name_key = clone_sim_info._base.breed_name_key
     clone_sim_info.load_sim_info(source_sim_proto,
                                  is_clone=True,
                                  default_lod=SimInfoLODLevel.FULL)
     clone_sim_info.sim_id = clone_sim_id
     clone_sim_info._base.first_name = clone_first_name
     clone_sim_info._base.last_name = clone_last_name
     clone_sim_info._base.breed_name = clone_breed_name
     clone_sim_info._base.first_name_key = clone_first_name_key
     clone_sim_info._base.last_name_key = clone_last_name_key
     clone_sim_info._base.full_name_key = clone_full_name_key
     clone_sim_info._base.breed_name_key = clone_breed_name_key
     clone_sim_info._household_id = household.id
     if not self._try_add_sim_info_to_household(
             clone_sim_info, resolver, household,
             skip_household_check=True):
         return
     source_trait_tracker = source_sim_info.trait_tracker
     clone_trait_tracker = clone_sim_info.trait_tracker
     for trait in clone_trait_tracker.personality_traits:
         if not source_trait_tracker.has_trait(trait):
             clone_sim_info.remove_trait(trait)
     for trait in clone_trait_tracker.gender_option_traits:
         if not source_trait_tracker.has_trait(trait):
             clone_sim_info.remove_trait(trait)
     correct_aspiration_trait = clone_sim_info.primary_aspiration.primary_trait
     for trait in tuple(clone_trait_tracker.aspiration_traits):
         if trait is not correct_aspiration_trait:
             clone_sim_info.remove_trait(trait)
     source_sim_info.relationship_tracker.create_relationship(
         clone_sim_info.sim_id)
     source_sim_info.relationship_tracker.add_relationship_score(
         clone_sim_info.sim_id, 1)
     self._ensure_parental_lineage_exists(source_sim_info,
                                          clone_sim_info)
     services.sim_info_manager().set_default_genealogy(
         sim_infos=(clone_sim_info, ))
     clone_sim_info.set_default_data()
     clone_sim_info.save_sim()
     household.save_data()
     if not household.is_active_household:
         clone_sim_info.request_lod(SimInfoLODLevel.BASE)
     clone_sim_info.resend_physical_attributes()
     clone_sim_info.relationship_tracker.clean_and_send_remaining_relationship_info(
     )
     return clone_sim_info