示例#1
0
def _cm_max_motive(motive_name: str,
                   opt_sim: OptionalSimInfoParam = None,
                   _connection: int = None):
    output = CheatOutput(_connection)
    sim_info = get_optional_target(opt_sim,
                                   target_type=OptionalSimInfoParam,
                                   _connection=_connection)
    if sim_info is None:
        output('Failed, No Sim found!')
        return False
    if not CMMotiveUtils().can_translate_motive(sim_info, motive_name):
        output(
            'Invalid motive: Valid motives for \'{}\' are as follows:'.format(
                CommonSimNameUtils.get_full_name(sim_info)))
        for motive in CMMotiveUtils().get_valid_motives(sim_info):
            output('- {}'.format(motive))
        return False
    output('Setting motive \'{}\' to \'{}\' for \'{}\''.format(
        motive_name, 100.0, CommonSimNameUtils.get_full_name(sim_info)))
    result = CMMotiveUtils().change_motive_level(sim_info, motive_name, 100.0)
    if not result:
        output('Failed to set motive level.')
    else:
        output('Success!')
    output('Done')
示例#2
0
    def _show(
        self,
        sim_info: SimInfo,
        target_sim_info: SimInfo,
        on_ok_selected: Callable[[UiDialogOkCancel], bool]=CommonFunctionUtils.noop,
        on_cancel_selected: Callable[[UiDialogOkCancel], bool]=CommonFunctionUtils.noop
    ):
        self.log.format_with_message(
            'Attempting to display dialog.',
            sim=CommonSimNameUtils.get_full_name(sim_info),
            target=CommonSimNameUtils.get_full_name(target_sim_info)
        )
        _dialog = self._create_dialog(sim_info, target_sim_info)
        if _dialog is None:
            self.log.debug('Failed to create dialog.')
            return

        def _on_option_selected(dialog: UiDialogOkCancel) -> bool:
            try:
                self.log.debug('Option selected.')
                if dialog.accepted:
                    self.log.debug('Ok chosen.')
                    return on_ok_selected(dialog)
                self.log.debug('Cancel chosen.')
                return on_cancel_selected(dialog)
            except Exception as ex:
                self.log.error('Error occurred on choosing an option.', exception=ex)
            return False

        _dialog.add_listener(_on_option_selected)
        self.log.debug('Displaying dialog.')
        _dialog.show_dialog()
    def _show(
        self,
        sim_info: SimInfo,
        target_sim_info: SimInfo,
        on_ok_selected: Callable[[UiDialogOkCancel], Any]=CommonFunctionUtils.noop,
        on_cancel_selected: Callable[[UiDialogOkCancel], Any]=CommonFunctionUtils.noop
    ):
        self.log.format_with_message(
            'Attempting to display dialog.',
            sim=CommonSimNameUtils.get_full_name(sim_info),
            target=CommonSimNameUtils.get_full_name(target_sim_info)
        )
        _dialog = self._create_dialog(sim_info, target_sim_info)
        if _dialog is None:
            self.log.debug('Failed to create dialog.')
            return

        @CommonExceptionHandler.catch_exceptions(self.mod_identity.name)
        def _on_option_selected(dialog: UiDialogOkCancel):
            self.log.debug('Option selected.')
            if dialog.accepted:
                self.log.debug('Ok chosen.')
                return on_ok_selected(dialog)
            self.log.debug('Cancel chosen.')
            return on_cancel_selected(dialog)

        _dialog.add_listener(_on_option_selected)
        self.log.debug('Displaying dialog.')
        _dialog.show_dialog()
示例#4
0
    def add_sim_to_target_household(
            sim_info: SimInfo,
            target_sim_info: SimInfo,
            destroy_if_empty_household: bool = True) -> bool:
        """add_sim_to_active_household(sim_info, destroy_if_empty_household=True)

        Add a Sim to the Household of the Target Sim.

        :param sim_info: The Sim to add.
        :type sim_info: SimInfo
        :param target_sim_info: This Sim will receive the Sim to their Household.
        :type target_sim_info: SimInfo
        :param destroy_if_empty_household: If True, if the Sim comes from a household containing only them, then it will be destroyed after they are moved.
        :type destroy_if_empty_household: bool, optional
        :return: True, if the Sim was added to the household of the target successfully. False, if not.
        :rtype: bool
        """
        log.info('Adding Sim to target Sim household.')
        destination_household = target_sim_info.household
        log.format_info(
            'Adding Sim to household of target sim',
            sim=CommonSimNameUtils.get_full_name(sim_info),
            target_sim=CommonSimNameUtils.get_full_name(target_sim_info),
            destination_household=destination_household)
        return CommonHouseholdUtils.move_sim_to_household(
            sim_info,
            household_id=destination_household.id,
            destroy_if_empty_household=destroy_if_empty_household)
 def is_available_for(self,
                      source_sim_info: SimInfo,
                      target: Any = None) -> bool:
     self.log.debug(
         'Checking if OC menu is available for \'{}\' and Target \'{}\'.'
         .format(CommonSimNameUtils.get_full_name(source_sim_info),
                 target))
     if target is None or not CommonTypeUtils.is_sim_or_sim_info(
             target):
         self.log.debug('Target is not a Sim.')
         return False
     if not OCSettingUtils.is_enabled_for_interactions(source_sim_info):
         log.debug(
             'Failed, Source Sim is not available for Outfit Customization.'
         )
         return False
     target_sim_info = CommonSimUtils.get_sim_info(target)
     if not OCSettingUtils.is_enabled_for_interactions(target_sim_info):
         self.log.debug(
             'Failed, Target Sim is not available for Outfit Customization.'
         )
         return False
     self.log.debug(
         'OC menu is available for Source Sim and Target Sim.')
     return True
示例#6
0
    def on_started(self, interaction_sim: Sim,
                   interaction_target: Any) -> bool:
        target_location = CommonObjectLocationUtils.get_location(
            interaction_target)

        def _on_submit(chosen_sim_info_list: Tuple[SimInfo]) -> None:
            if chosen_sim_info_list is None or not chosen_sim_info_list:
                return
            for chosen_sim_info in chosen_sim_info_list:
                # noinspection PyBroadException
                try:
                    CommonSimSpawnUtils.hard_reset(
                        chosen_sim_info,
                        ResetReason.RESET_EXPECTED,
                        source=interaction_sim,
                        cause='S4CM: Teleporting Sim')
                    CommonSimLocationUtils.set_location(
                        chosen_sim_info, target_location)
                except:
                    pass

        dialog = CommonPremadeChooseSimsOptionDialog(
            S4CMStringId.CHOOSE_SIMS_TO_TELEPORT,
            0,
            instanced_sims_only=True,
            mod_identity=self.mod_identity)
        if not dialog.has_options():
            return False
        # Sort the Sims in the dialog by their name.
        dialog._internal_dialog._rows = tuple(
            sorted(dialog._internal_dialog._rows,
                   key=lambda row: CommonSimNameUtils.get_full_name(
                       CommonSimUtils.get_sim_info(row.sim_id))))
        dialog.show(on_submit=_on_submit, max_selectable=dialog.option_count)
        return True
示例#7
0
 def on_started(self, interaction_sim: Sim,
                interaction_target: Sim) -> bool:
     self.log.format_with_message('Running \'{}\' on_started.'.format(
         self.__class__.__name__),
                                  interaction_sim=interaction_sim,
                                  interaction_target=interaction_target)
     target_sim_info = CommonSimUtils.get_sim_info(interaction_target)
     target_sim_name = CommonSimNameUtils.get_full_name(target_sim_info)
     from sims4communitylib.utils.sims.common_sim_interaction_utils import CommonSimInteractionUtils
     from sims4communitylib.utils.resources.common_interaction_utils import CommonInteractionUtils
     running_interaction_names = ', '.join(
         CommonInteractionUtils.get_interaction_short_names(
             CommonSimInteractionUtils.get_running_interactions_gen(
                 target_sim_info)))
     queued_interaction_names = ', '.join(
         CommonInteractionUtils.get_interaction_short_names(
             CommonSimInteractionUtils.get_queued_interactions_gen(
                 target_sim_info)))
     text = ''
     text += 'Running Interactions:\n{}\n\n'.format(
         running_interaction_names)
     text += 'Queued Interactions:\n{}\n\n'.format(queued_interaction_names)
     CommonBasicNotification(
         CommonLocalizationUtils.create_localized_string(
             '{} Running and Queued Interactions'.format(target_sim_name)),
         CommonLocalizationUtils.create_localized_string(text)).show(
             icon=IconInfoData(obj_instance=interaction_target))
     return True
def _csf_reset_slider(slider_name: str,
                      opt_sim: OptionalSimInfoParam = None,
                      _connection: int = None):
    output = CheatOutput(_connection)
    output('Resetting slider \'{}\'.'.format(slider_name))
    sim_info = get_optional_target(opt_sim,
                                   target_type=OptionalSimInfoParam,
                                   _connection=_connection)
    if sim_info is None:
        output('Failed, No Sim found!')
        return False
    output('Resetting slider for \'{}\'.'.format(
        CommonSimNameUtils.get_full_name(sim_info)))
    from cncustomsliderframework.sliders.query.slider_query_utils import CSFSliderQueryUtils
    custom_sliders = CSFSliderQueryUtils().get_sliders_by_name(
        sim_info, slider_name)
    if not custom_sliders:
        output('Invalid Slider! \'{}\''.format(slider_name))
        output('Available Sliders:')
        for custom_slider in CSFSliderQueryUtils().get_sliders_for_sim(
                sim_info):
            output('>{}'.format(custom_slider.raw_display_name))
        return False
    custom_slider = next(iter(custom_sliders))
    if custom_slider is not None:
        output('Slider found.')
    else:
        output('Invalid Slider! \'{}\''.format(slider_name))
        output('Available Sliders:')
        for custom_slider in CSFSliderQueryUtils().get_sliders_for_sim(
                sim_info):
            output('>{}'.format(custom_slider.raw_display_name))
        return False
    CSFCustomSliderApplicationService().reset_slider(sim_info, custom_slider)
    output('Success, Sliders reset.')
    def run(
        self,
        sim_info: SimInfo,
        on_completed: Callable[[bool],
                               None] = CommonFunctionUtils.noop) -> bool:
        def _on_chosen(chosen_sim_info: SimInfo) -> None:
            if chosen_sim_info is None:
                on_completed(False)
                return
            self.run_with_sims(sim_info,
                               chosen_sim_info,
                               on_completed=on_completed)

        def _is_allowed(target_sim_info: SimInfo):
            return self.can_run_with_sims(sim_info, target_sim_info)

        dialog = CommonPremadeChooseSimOptionDialog(
            S4CMSimControlMenuStringId.SET_FAMILY_RELATIONS,
            0,
            title_tokens=(sim_info, ),
            include_sim_callback=_is_allowed,
            instanced_sims_only=False,
            mod_identity=ModInfo.get_identity(),
            on_sim_chosen=_on_chosen,
            on_close=lambda: on_completed(False))
        if not dialog.has_options():
            on_completed(False)
            return False
        # Sort the Sims in the dialog by their name.
        dialog._internal_dialog._rows = tuple(
            sorted(dialog._internal_dialog._rows,
                   key=lambda row: CommonSimNameUtils.get_full_name(
                       CommonSimUtils.get_sim_info(row.sim_id))))
        dialog.show(sim_info=sim_info)
        return True
示例#10
0
    def run(
        self,
        sim_info: SimInfo,
        on_completed: Callable[[bool],
                               None] = CommonFunctionUtils.noop) -> bool:
        def _on_submit(chosen_sim_info_list: Tuple[SimInfo]) -> None:
            if chosen_sim_info_list is None or not chosen_sim_info_list:
                on_completed(False)
                return
            on_completed(self._run_with_sims(sim_info, chosen_sim_info_list))

        def _has_relationship(target_sim_info: SimInfo) -> bool:
            return self.can_run_with_sims(sim_info, target_sim_info)

        dialog = CommonPremadeChooseSimsOptionDialog(
            S4CMSimControlMenuStringId.REMOVE_HAS_MET,
            S4CMSimControlMenuStringId.CHOOSE_SIMS_TO_REMOVE_HAS_MET,
            include_sim_callback=_has_relationship,
            description_tokens=(sim_info, ),
            instanced_sims_only=False,
            mod_identity=self.mod_identity)
        if not dialog.has_options():
            return False
        # Sort the Sims in the dialog by their name.
        dialog._internal_dialog._rows = tuple(
            sorted(dialog._internal_dialog._rows,
                   key=lambda row: CommonSimNameUtils.get_full_name(
                       CommonSimUtils.get_sim_info(row.sim_id))))
        dialog.show(on_submit=_on_submit, max_selectable=dialog.option_count)
    def _load(self, initial_outfit_parts: Dict[BodyType, int]=None) -> bool:
        target_sim_name = CommonSimNameUtils.get_full_name(self.sim_info)
        self._outfit_data: OutfitData = CommonOutfitUtils.get_outfit_data(self.sim_info, outfit_category_and_index=self._outfit_category_and_index)
        if self._outfit_data is None:
            self.log.error('Missing outfit data for Sim \'{}\' and Outfit Category and Index {}'.format(target_sim_name, self._outfit_category_and_index), throw=True)
            return False
        self._outfit_parts = CommonOutfitUtils.get_outfit_parts(self.sim_info, outfit_category_and_index=self._outfit_category_and_index)
        self._original_outfit_data: FrozenSet[int] = frozenset(self._outfit_parts.items())
        if initial_outfit_parts is not None:
            for (key, value) in initial_outfit_parts.items():
                if not isinstance(key, int) or not isinstance(value, int):
                    self.log.error('\'{}\': outfit_body_parts contains non-integer variables key: {} value: {}.'.format(target_sim_name, key, value))
                    return False

            self._outfit_body_types = list(initial_outfit_parts.keys())
            self._outfit_part_ids = list(initial_outfit_parts.values())
        else:
            if not self._outfit_data.part_ids or not self._outfit_data.body_types:
                self.log.error('\'{}\' is missing outfit parts or body types for Outfit Category and Index {}.'.format(target_sim_name, self._outfit_category_and_index))
                return False
            self._outfit_body_types: List[Union[BodyType, int]] = list(self._outfit_data.body_types)
            self._outfit_part_ids: List[int] = list(self._outfit_data.part_ids)
            if len(self._outfit_body_types) != len(self._outfit_part_ids):
                self.log.error('\'{}\': The number of outfit parts did not match the number of body types for Outfit Category and Index {}.'.format(target_sim_name, self._outfit_category_and_index))
                return False
        return True
示例#12
0
def _common_fix_full_name_returning_empty_string(original, self: SimInfo, *_,
                                                 **__):
    original_value = original(self, *_, **__)
    if original_value == '':
        return CommonSimNameUtils.get_full_name(
            CommonSimUtils.get_sim_info(self))
    return original_value
示例#13
0
 def open(self, sim_info: SimInfo):
     """ Open the Change Motives dialog. """
     self.log.debug('Opening change motives dialog for \'{}\'.'.format(
         CommonSimNameUtils.get_full_name(sim_info)))
     dialog = self._settings(sim_info)
     if dialog is None:
         return
     dialog.show(sim_info=sim_info)
 def __str__(self) -> str:
     return '{}: {}, Age: {}, Gender: {}, Species: {}'.format(
         self.__class__.__name__,
         CommonSimNameUtils.get_full_name(self._sim_info),
         CommonAgeUtils.get_age(self._sim_info),
         CommonGenderUtils.get_gender(self._sim_info),
         CommonSpecies.get_species(self._sim_info)
     )
示例#15
0
def _cgs_command_print_sim_data(_connection: int = None):
    output = CheatOutput(_connection)
    sim_info = CommonSimUtils.get_active_sim_info()
    output('Sim Data for Sim: Name: \'{}\' Id: \'{}\''.format(
        CommonSimNameUtils.get_full_name(sim_info),
        CommonSimUtils.get_sim_id(sim_info)))
    sim_storage = CGSSimData(sim_info)
    for (key, value) in sim_storage._data.items():
        output(' > {}: {}'.format(pformat(key), pformat(value)))
    def apply(self, resend_outfits_after_apply: bool=True, change_sim_to_outfit_after_apply: bool=True, apply_to_all_outfits_in_same_category: bool=False, apply_to_outfit_category_and_index: Tuple[OutfitCategory, int]=None) -> bool:
        """apply(resend_outfits_after_apply=True, change_sim_to_outfit_after_apply=True, apply_to_all_outfits_in_same_category=False, apply_to_outfit_category_and_index=None)

        Apply all changes made to the Outfit.

        :param resend_outfits_after_apply: If set to True, the outfits of the Sim will be re-sent after changes have been applied. Default is True.
        :type resend_outfits_after_apply: bool, optional
        :param change_sim_to_outfit_after_apply: If set to True, the Sim will change to the outfit after the outfit is updated. Default is True.
        :type change_sim_to_outfit_after_apply: bool, optional
        :param apply_to_all_outfits_in_same_category: If set to True, changes will be applied to all Outfits in the same category. If set to False, changes will only be applied to the outfit provided at initialization. Default is False.
        :type apply_to_all_outfits_in_same_category: bool, optional
        :param apply_to_outfit_category_and_index: The OutfitCategory and Index to apply changes to. If set to None, it will be the OutfitCategory and Index provided at initialization. Default is None.
        :type apply_to_outfit_category_and_index: Tuple[OutfitCategory, int], optional
        :return: True, if changes were applied successfully. False, if not.
        :rtype: bool
        """
        sim_name = CommonSimNameUtils.get_full_name(self.sim_info)
        self.log.format_with_message(
            'Applying changes to outfit',
            sim=sim_name,
            resend_outfits=resend_outfits_after_apply,
            change_to_outfit=change_sim_to_outfit_after_apply,
            apply_to_all_outfits_in_same_category=apply_to_all_outfits_in_same_category,
            apply_to_outfit_category_and_index=apply_to_outfit_category_and_index
        )
        apply_to_outfit_category_and_index = apply_to_outfit_category_and_index or self.outfit_category_and_index
        saved_outfits = self.sim_info.save_outfits()
        for saved_outfit in saved_outfits.outfits:
            if int(saved_outfit.category) != int(apply_to_outfit_category_and_index[0]):
                continue

            if apply_to_all_outfits_in_same_category:
                pass
            else:
                # noinspection PyUnresolvedReferences
                sub_outfit_data = self._to_outfit_data(saved_outfit.body_types_list.body_types, saved_outfit.parts.ids)
                if int(saved_outfit.outfit_id) != int(self._outfit_data.outfit_id) or sub_outfit_data != self._original_outfit_data:
                    continue

            saved_outfit.parts = S4Common_pb2.IdList()
            # noinspection PyUnresolvedReferences
            saved_outfit.parts.ids.extend(self._outfit_part_ids)
            saved_outfit.body_types_list = Outfits_pb2.BodyTypesList()
            # noinspection PyUnresolvedReferences
            saved_outfit.body_types_list.body_types.extend(self._outfit_body_types)
            if not apply_to_all_outfits_in_same_category:
                break

        self.sim_info._base.outfits = saved_outfits.SerializeToString()
        if change_sim_to_outfit_after_apply:
            self.sim_info._base.outfit_type_and_index = apply_to_outfit_category_and_index
        else:
            self.sim_info._base.outfit_type_and_index = self._current_outfit_category_and_index
        self.log.format_with_message('Finished flushing outfit changes.', sim=sim_name)
        if resend_outfits_after_apply:
            return CommonOutfitUtils.resend_outfits(self.sim_info)
        return True
 def on_started(self, interaction_sim: Sim, interaction_target: Sim) -> bool:
     self.log.format_with_message('Running \'{}\' on_started.'.format(self.__class__.__name__), interaction_sim=interaction_sim, interaction_target=interaction_target)
     target_sim_info = CommonSimUtils.get_sim_info(interaction_target)
     target_sim_name = CommonSimNameUtils.get_full_name(target_sim_info)
     buff_id = CommonSimPregnancyUtils.get_in_labor_buff(target_sim_info)
     if buff_id != -1:
         self.log.debug('The baby wants out now! Labor induced in \'{}\'. Chosen buff identifier: {}'.format(target_sim_name, str(buff_id)))
         return CommonBuffUtils.add_buff(target_sim_info, buff_id)
     self.log.debug('Failed to induce labor in \'{}\'.'.format(target_sim_name))
     return False
示例#18
0
    def get_sliders_for_sim(
        self,
        sim_info: SimInfo,
        slider_category: CSFSliderCategory = None,
        ignore_sliders: Tuple[str] = (),
        additional_tags: Tuple[str] = (),
        additional_filters: Iterator[CSFSliderTagFilter] = ()
    ) -> Tuple[CSFSlider]:
        """get_sliders_for_sim(\
            sim_info,\
            slider_category=None,\
            ignore_sliders=(),\
            additional_tags=(),\
            additional_filters=()\
        )

        Retrieve Sliders using the criteria.

        :param sim_info: An instance of a Sim
        :type sim_info: SimInfo
        :param slider_category: The category of slider. If not specified, sliders will not be filtered by category. Default is None.
        :type slider_category: CSFSliderCategory, optional
        :param additional_tags: Additional tags to add to the query. Default is an empty collection.
        :type additional_tags: Tuple[Any], optional
        :param ignore_sliders: A collection of identifiers to ignore. Default is an empty collection.
        :type ignore_sliders: Tuple[str], optional
        :param additional_filters: Additional filters. Default is an empty collection.
        :type additional_filters: Iterator[CSFSliderTagFilter], optional.
        :return: A collection of Sliders matching the criteria.
        :rtype: Tuple[CSFSlider]
        """
        self.log.format_with_message(
            'Get Sliders for Sim.',
            sim_name=CommonSimNameUtils.get_full_name(sim_info),
            slider_category=slider_category,
            additional_filters=tuple(additional_filters),
            ignore_sliders=ignore_sliders,
            additional_tags=additional_tags)
        filters: Tuple[CSFSliderTagFilter] = (
            CSFSimDetailsSliderFilter(sim_info),
            CSFTagsSliderFilter(additional_tags), *tuple(additional_filters))
        if slider_category is not None:
            filters = (
                *filters,
                CSFSliderCategorySliderFilter(slider_category),
            )
        # Include Object Tag, Include Category Tag

        queries: Tuple[CSFSliderQuery] = (self._query_registry.create_query(
            filters, query_type=CSFQueryType.ALL_PLUS_ANY), )
        return tuple(self._query_registry.get_sliders(queries))
def _csf_reset_sliders(opt_sim: OptionalSimInfoParam = None,
                       _connection: int = None):
    output = CheatOutput(_connection)
    output('Resetting all sliders.')
    sim_info = get_optional_target(opt_sim,
                                   target_type=OptionalSimInfoParam,
                                   _connection=_connection)
    if sim_info is None:
        output('Failed, No Sim found!')
        return False
    output('Resetting all sliders for \'{}\'.'.format(
        CommonSimNameUtils.get_full_name(sim_info)))
    CSFCustomSliderApplicationService().reset_all_sliders(sim_info)
    output('Success, Sliders reset.')
示例#20
0
 def is_available_for(self,
                      source_sim_info: SimInfo,
                      target: Any = None) -> bool:
     self.log.debug(
         'Checking if Change Motives dialog is available for \'{}\' and Target \'{}\'.'
         .format(CommonSimNameUtils.get_full_name(source_sim_info),
                 target))
     if target is None or not CommonTypeUtils.is_sim_or_sim_info(
             target):
         self.log.debug('Target is not a Sim.')
         return False
     self.log.debug(
         'Change Motives menu is available for Source Sim and Target Sim.'
     )
     return True
    def run(
        self,
        sim_info: SimInfo,
        on_completed: Callable[[bool],
                               None] = CommonFunctionUtils.noop) -> bool:
        if CommonSimPregnancyUtils.is_pregnant(sim_info):
            on_completed(False)
            return False

        if not CommonSimPregnancyUtils.can_impregnate(
                sim_info) and not CommonSimPregnancyUtils.can_be_impregnated(
                    sim_info):
            on_completed(False)
            return False

        def _on_chosen(chosen_sim_info: SimInfo) -> None:
            if chosen_sim_info is None:
                on_completed(False)
                return
            result = CommonSimPregnancyUtils.start_pregnancy(
                sim_info, chosen_sim_info)
            on_completed(result)

        def _can_create_pregnancy(partner_sim_info: SimInfo) -> bool:
            if sim_info is partner_sim_info:
                return False
            return S4CMSimPregnancyUtils.can_create_pregnancy_together(
                sim_info, partner_sim_info)

        dialog = CommonPremadeChooseSimOptionDialog(
            S4CMSimControlMenuStringId.WHO_WILL_IMPREGNATE_SIM,
            0,
            title_tokens=(sim_info, ),
            include_sim_callback=_can_create_pregnancy,
            instanced_sims_only=False,
            mod_identity=ModInfo.get_identity(),
            on_sim_chosen=_on_chosen,
            on_close=lambda: on_completed(False))
        if not dialog.has_options():
            on_completed(False)
            return False
        # Sort the Sims in the dialog by their name.
        dialog._internal_dialog._rows = tuple(
            sorted(dialog._internal_dialog._rows,
                   key=lambda row: CommonSimNameUtils.get_full_name(
                       CommonSimUtils.get_sim_info(row.sim_id))))
        dialog.show(sim_info=sim_info)
        return True
示例#22
0
def _cm_max_all_motives(opt_sim: OptionalSimInfoParam = None,
                        _connection: int = None):
    output = CheatOutput(_connection)
    sim_info = get_optional_target(opt_sim,
                                   target_type=OptionalSimInfoParam,
                                   _connection=_connection)
    if sim_info is None:
        output('Failed, No Sim found!')
        return False
    output('Setting all motives to maximum for \'{}\''.format(
        CommonSimNameUtils.get_full_name(sim_info)))
    result = CMMotiveUtils().max_all_motives(sim_info)
    if not result:
        output('Failed to set motive level.')
    else:
        output('Success!')
    output('Done')
def _csf_apply_slider(slider_name: str,
                      amount: float,
                      opt_sim: OptionalSimInfoParam = None,
                      _connection: int = None):
    output = CheatOutput(_connection)
    output('Applying slider \'{}\' with amount \'{}\''.format(
        slider_name, amount))
    sim_info = get_optional_target(opt_sim,
                                   target_type=OptionalSimInfoParam,
                                   _connection=_connection)
    if sim_info is None:
        output('Failed, No Sim found!')
        return False
    output('Applying slider to \'{}\'.'.format(
        CommonSimNameUtils.get_full_name(sim_info)))
    facial_attributes = PersistenceBlobs_pb2.BlobSimFacialCustomizationData()
    facial_attributes.MergeFromString(sim_info.facial_attributes)
    from cncustomsliderframework.sliders.query.slider_query_utils import CSFSliderQueryUtils
    custom_sliders = CSFSliderQueryUtils().get_sliders_by_name(
        sim_info, slider_name)
    if not custom_sliders:
        output('Invalid Slider! \'{}\''.format(slider_name))
        output('Available Sliders:')
        for custom_slider in CSFSliderQueryUtils().get_sliders_for_sim(
                sim_info):
            output('>{}'.format(custom_slider.raw_display_name))
        return False
    custom_slider = next(iter(custom_sliders))
    if custom_slider is not None:
        output('Slider found.')
    else:
        output('Invalid Slider! \'{}\''.format(slider_name))
        output('Available Sliders:')
        for custom_slider in CSFSliderQueryUtils().get_sliders_for_sim(
                sim_info):
            output('>{}'.format(custom_slider.raw_display_name))
        return False
    # noinspection PyBroadException
    try:
        amount = float(amount)
    except:
        output('Amount must be a number! \'{}\''.format(amount))
        return False
    output('Applying Sim Attributes!')
    return CSFCustomSliderApplicationService().apply_slider(
        sim_info, custom_slider, amount)
示例#24
0
 def _update_kwargs(self, **kwargs: Any) -> Dict[str, Any]:
     if not kwargs:
         return kwargs
     new_kwargs: Dict[str, Any] = dict()
     from sims4communitylib.utils.common_type_utils import CommonTypeUtils
     from sims4communitylib.utils.sims.common_sim_name_utils import CommonSimNameUtils
     from sims4communitylib.utils.sims.common_sim_utils import CommonSimUtils
     for (key, val) in kwargs.items():
         if CommonTypeUtils.is_sim_or_sim_info(val):
             sim_info = CommonSimUtils.get_sim_info(val)
             if sim_info is None:
                 new_kwargs[key] = val
             else:
                 new_kwargs[key] = '{} ({})'.format(CommonSimNameUtils.get_full_name(sim_info), str(CommonSimUtils.get_sim_id(sim_info)))
         else:
             new_kwargs[key] = val
     return new_kwargs
示例#25
0
 def _update_args(self, *args: Any) -> Tuple[Any]:
     if not args:
         return args
     from sims4communitylib.utils.common_type_utils import CommonTypeUtils
     from sims4communitylib.utils.sims.common_sim_name_utils import CommonSimNameUtils
     from sims4communitylib.utils.sims.common_sim_utils import CommonSimUtils
     new_args: List[Any] = list()
     for arg in args:
         if CommonTypeUtils.is_sim_or_sim_info(arg):
             sim_info = CommonSimUtils.get_sim_info(arg)
             if sim_info is None:
                 new_args.append(arg)
             else:
                 new_args.append('{} ({})'.format(CommonSimNameUtils.get_full_name(sim_info), str(CommonSimUtils.get_sim_id(sim_info))))
         else:
             new_args.append(arg)
     return tuple(new_args)
示例#26
0
 def on_started(self, interaction_sim: Sim, interaction_target: Sim) -> bool:
     self.log.format_with_message(
         'Running \'{}\' on_started.'.format(self.__class__.__name__),
         interaction_sim=interaction_sim,
         interaction_target=interaction_target
     )
     target_sim_info = CommonSimUtils.get_sim_info(interaction_target)
     target_sim_name = CommonSimNameUtils.get_full_name(target_sim_info)
     sim_situations = ', '.join(CommonSituationUtils.get_situation_names(CommonSimSituationUtils.get_situations(target_sim_info)))
     text = ''
     text += 'Running Situations:\n{}\n\n'.format(sim_situations)
     CommonBasicNotification(
         CommonLocalizationUtils.create_localized_string('{} Running Situations'.format(target_sim_name)),
         CommonLocalizationUtils.create_localized_string(text)
     ).show(
         icon=IconInfoData(obj_instance=interaction_target)
     )
     return True
 def create_from_sim(cls, sim_info: SimInfo,
                     template_name: str) -> 'CSFSliderTemplate':
     """Create a template from a chosen Sim."""
     from cncustomsliderframework.custom_slider_application_service import CSFCustomSliderApplicationService
     slider_application_service = CSFCustomSliderApplicationService()
     slider_to_value_library: Dict[str, float] = dict()
     from cncustomsliderframework.sliders.query.slider_query_utils import CSFSliderQueryUtils
     for slider in CSFSliderQueryUtils().get_sliders_for_sim(sim_info):
         slider_identifier = slider.unique_identifier
         if slider_identifier in slider_to_value_library:
             continue
         slider_value = slider_application_service.get_current_slider_value(
             sim_info, slider)
         slider_to_value_library[slider_identifier] = slider_value
     return cls(template_name, CommonSimNameUtils.get_full_name(sim_info),
                CommonAge.get_age(sim_info),
                CommonSpecies.get_species(sim_info),
                slider_to_value_library)
 def on_test(cls, interaction_sim: Sim, interaction_target: Any, interaction_context: InteractionContext, **kwargs) -> TestResult:
     cls.get_log().format_with_message('Running \'{}\' on_test.'.format(cls.__name__), interaction_sim=interaction_sim, interaction_target=interaction_target, interaction_context=interaction_context, kwargles=kwargs)
     if interaction_target is None or not CommonTypeUtils.is_sim_or_sim_info(interaction_target):
         cls.get_log().debug('Target is not a Sim.')
         return TestResult.NONE
     target_sim_info = CommonSimUtils.get_sim_info(interaction_target)
     target_sim_name = CommonSimNameUtils.get_full_name(target_sim_info)
     if not CommonSimPregnancyUtils.can_be_impregnated(target_sim_info):
         cls.get_log().debug('\'{}\' cannot be impregnated and thus cannot be pregnant.')
         return TestResult.NONE
     if not hasattr(target_sim_info, 'pregnancy_tracker'):
         cls.get_log().debug('Target does not have a pregnancy tracker.')
         return TestResult.NONE
     cls.get_log().debug('Checking if \'{}\' is pregnant.'.format(target_sim_name))
     if not CommonSimPregnancyUtils.is_pregnant(target_sim_info):
         cls.get_log().format_with_message('\'{}\' is not pregnant.'.format(target_sim_name))
         return cls.create_test_result(False, reason='\'{}\' is not pregnant.'.format(target_sim_name), tooltip=CommonLocalizationUtils.create_localized_tooltip(CommonStringId.S4CL_SIM_IS_NOT_PREGNANT, tooltip_tokens=(target_sim_info, )))
     cls.get_log().debug('Success.')
     return TestResult.TRUE
    def on_started(self, interaction_sim: Sim,
                   interaction_target: Sim) -> bool:
        target_sim_info = CommonSimUtils.get_sim_info(interaction_target)
        target_sim_name = CommonSimNameUtils.get_full_name(target_sim_info)
        from sims4communitylib.utils.sims.common_sim_interaction_utils import CommonSimInteractionUtils
        from sims4communitylib.utils.resources.common_interaction_utils import CommonInteractionUtils
        running_interaction_strings: List[str] = list()
        for interaction in CommonSimInteractionUtils.get_running_interactions_gen(
                target_sim_info):
            interaction_name = CommonInteractionUtils.get_interaction_short_name(
                interaction)
            interaction_id = CommonInteractionUtils.get_interaction_id(
                interaction)
            running_interaction_strings.append('{} ({})'.format(
                interaction_name, interaction_id))
        running_interaction_strings = sorted(running_interaction_strings,
                                             key=lambda x: x)
        running_interaction_names = ', '.join(running_interaction_strings)

        queued_interaction_strings: List[str] = list()
        for interaction in CommonSimInteractionUtils.get_queued_interactions_gen(
                target_sim_info):
            interaction_name = CommonInteractionUtils.get_interaction_short_name(
                interaction)
            interaction_id = CommonInteractionUtils.get_interaction_id(
                interaction)
            queued_interaction_strings.append('{} ({})'.format(
                interaction_name, interaction_id))
        queued_interaction_strings = sorted(queued_interaction_strings,
                                            key=lambda x: x)
        queued_interaction_names = ', '.join(queued_interaction_strings)
        text = ''
        text += 'Running Interactions:\n{}\n\n'.format(
            running_interaction_names)
        text += 'Queued Interactions:\n{}\n\n'.format(queued_interaction_names)
        CommonBasicNotification(
            CommonLocalizationUtils.create_localized_string(
                '{} Running and Queued Interactions ({})'.format(
                    target_sim_name,
                    CommonSimUtils.get_sim_id(target_sim_info))),
            CommonLocalizationUtils.create_localized_string(text)).show(
                icon=IconInfoData(obj_instance=interaction_target))
        return True
    def on_started(self, interaction_sim: Sim, interaction_target: Sim) -> bool:
        target_sim_info = CommonSimUtils.get_sim_info(interaction_target)
        target_sim_name = CommonSimNameUtils.get_full_name(target_sim_info)
        trait_strings: List[str] = list()
        for trait in CommonTraitUtils.get_traits(target_sim_info):
            trait_name = CommonTraitUtils.get_trait_name(trait)
            trait_id = CommonTraitUtils.get_trait_id(trait)
            trait_strings.append('{} ({})'.format(trait_name, trait_id))

        trait_strings = sorted(trait_strings, key=lambda x: x)
        sim_traits = ', '.join(trait_strings)
        text = ''
        text += 'Traits:\n{}\n\n'.format(sim_traits)
        CommonBasicNotification(
            CommonLocalizationUtils.create_localized_string('{} Traits ({})'.format(target_sim_name, CommonSimUtils.get_sim_id(target_sim_info))),
            CommonLocalizationUtils.create_localized_string(text)
        ).show(
            icon=IconInfoData(obj_instance=interaction_target)
        )
        return True