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))
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]
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
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 _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
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)
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
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