class ImmediateSuperInteraction(SuperInteraction): __qualname__ = 'ImmediateSuperInteraction' INSTANCE_TUNABLES = { 'basic_content': TunableBasicContentSet(no_content=True, default='no_content'), 'basic_extras': TunableList( description= 'Additional elements to run around the basic content of the interaction.', tunable=TunableVariant( state_change=TunableStateChange(), create_situation=CreateSituationElement.TunableFactory(), create_object=ObjectCreationElement.TunableFactory(), notification=NotificationElement.TunableFactory(), payment=PaymentElement.TunableFactory(), destroy_object=ObjectDestructionElement.TunableFactory(), vfx=PlayVisualEffectElement.TunableFactory())) } @classproperty def immediate(cls): return True
class ImmediateSuperInteraction(SuperInteraction): INSTANCE_TUNABLES = { 'basic_content': TunableBasicContentSet(no_content=True, default='no_content'), 'basic_extras': TunableList( description= 'Additional elements to run around the basic content of the interaction.', tunable=TunableVariant( add_to_household=AddToHouseholdElement.TunableFactory(), business_buy_lot=BusinessBuyLot.TunableFactory(), business_employee_action=BusinessEmployeeAction.TunableFactory( ), camera_focus=CameraFocusElement.TunableFactory(), create_object=ObjectCreationElement.TunableFactory(), create_photo_memory=CreatePhotoMemory.TunableFactory(), create_sim=SimCreationElement.TunableFactory(), create_situation=CreateSituationElement.TunableFactory(), destroy_object=ObjectDestructionElement.TunableFactory(), display_notebook_ui=NotebookDisplayElement.TunableFactory(), do_command=DoCommand.TunableFactory(), join_situation=JoinSituationElement.TunableFactory(), notification=NotificationElement.TunableFactory(), payment=PaymentElement.TunableFactory(), pregnancy=PregnancyElement.TunableFactory(), push_leave_lot_interaction=PushNpcLeaveLotNowInteraction. TunableFactory(), remove_from_travel_group=TravelGroupRemove.TunableFactory(), save_participant=SaveParticipantElement.TunableFactory(), state_change=TunableStateChange(), university_enrollment_ui=UniversityEnrollmentElement. TunableFactory(), vfx=PlayVisualEffectElement.TunableFactory(), walls_up_override=SetWallsUpOverrideElement.TunableFactory())) } @classproperty def immediate(cls): return True
class KnowOtherSimTraitOp(BaseTargetedLootOperation): TRAIT_SPECIFIED = 0 TRAIT_RANDOM = 1 TRAIT_ALL = 2 FACTORY_TUNABLES = { 'traits': TunableVariant( description= '\n The traits that the subject may learn about the target.\n ', specified=TunableTuple( description= '\n Specify individual traits that can be learned.\n ', locked_args={'learned_type': TRAIT_SPECIFIED}, potential_traits=TunableList( description= '\n A list of traits that the subject may learn about the target.\n ', tunable=Trait.TunableReference())), random=TunableTuple( description= '\n Specify a random number of traits to learn.\n ', locked_args={'learned_type': TRAIT_RANDOM}, count=TunableRange( description= '\n The number of potential traits the subject may learn about\n the target.\n ', tunable_type=int, default=1, minimum=1)), all=TunableTuple( description= "\n The subject Sim may learn all of the target's traits.\n ", locked_args={'learned_type': TRAIT_ALL}), default='specified'), 'notification': OptionalTunable( description= "\n Specify a notification that will be displayed for every subject if\n information is learned about each individual target_subject. This\n should probably be used only if you can ensure that target_subject\n does not return multiple participants. The first two additional\n tokens are the Sim and target Sim, respectively. A third token\n containing a string with a bulleted list of trait names will be a\n String token in here. If you are learning multiple traits, you\n should probably use it. If you're learning a single trait, you can\n get away with writing specific text that does not use this token.\n ", tunable=NotificationElement.TunableFactory( locked_args={'recipient_subject': None})), 'notification_no_more_traits': OptionalTunable( description= '\n Specify a notification that will be displayed when a Sim knows\n all traits of another target Sim.\n ', tunable=NotificationElement.TunableFactory( locked_args={'recipient_subject': None})) } def __init__(self, *args, traits, notification, notification_no_more_traits, **kwargs): super().__init__(*args, **kwargs) self.traits = traits self.notification = notification self.notification_no_more_traits = notification_no_more_traits @property def loot_type(self): return interactions.utils.LootType.RELATIONSHIP_BIT @staticmethod def _select_traits(knowledge, trait_tracker, random_count=None): traits = tuple(trait for trait in trait_tracker.personality_traits if trait not in knowledge.known_traits) if random_count is not None and traits: return random.sample(traits, min(random_count, len(traits))) return traits def _apply_to_subject_and_target(self, subject, target, resolver): knowledge = subject.relationship_tracker.get_knowledge(target.sim_id, initialize=True) if knowledge is None: return trait_tracker = target.trait_tracker if self.traits.learned_type == self.TRAIT_SPECIFIED: traits = tuple(trait for trait in self.traits.potential_traits if trait_tracker.has_trait(trait) if trait not in knowledge.known_traits) elif self.traits.learned_type == self.TRAIT_ALL: traits = self._select_traits(knowledge, trait_tracker) elif self.traits.learned_type == self.TRAIT_RANDOM: traits = self._select_traits(knowledge, trait_tracker, random_count=self.traits.count) if not traits and self.notification_no_more_traits is not None: interaction = resolver.interaction if interaction is not None: self.notification_no_more_traits( interaction).show_notification( additional_tokens=(subject, target), recipients=(subject, ), icon_override=IconInfoData(obj_instance=target)) for trait in traits: knowledge.add_known_trait(trait) if traits: interaction = resolver.interaction if interaction is not None and self.notification is not None: trait_string = LocalizationHelperTuning.get_bulleted_list( None, *(trait.display_name(target) for trait in traits)) self.notification(interaction).show_notification( additional_tokens=(subject, target, trait_string), recipients=(subject, ), icon_override=IconInfoData(obj_instance=target))
class ServiceNpcRequest(XevtTriggeredElement): __qualname__ = 'ServiceNpcRequest' MINUTES_ADD_TO_SERVICE_ARRIVAL = 5 HIRE = 1 CANCEL = 2 FACTORY_TUNABLES = { 'description': '\n Request a service NPC as part of an interaction. Note for timing field:\n Only beginning and end will work because xevents will trigger\n immediately on the server for service requests\n ', 'request_type': TunableVariant( description= '\n Specify the type of service NPC Request. You can hire, dismiss,\n fire, or cancel a service npc.', hire=TunableTuple( description= '\n A reference to the tuned service npc instance that will be\n requested at the specified time.', locked_args={'request_type': HIRE}, service=TunableReference(services.service_npc_manager())), cancel=TunableTuple( locked_args={'request_type': CANCEL}, service=TunableReference(services.service_npc_manager()), description= 'A reference to the tuned service that will be cancelled. This only really applies to recurring services where a cancelled service will never have any service npcs show up again until re-requested.' ), default='hire'), 'notification': OptionalTunable( description= '\n When enabled, display a notification when the service npc is \n successfully hired/cancelled.\n If hired, last token is DateAndTime when service npc will\n arrive. (usually this is 1)\n ', tunable=NotificationElement.TunableFactory( locked_args={ 'timing': XevtTriggeredElement.LOCKED_AT_BEGINNING })) } def __init__(self, interaction, *args, request_type, notification, sequence=(), **kwargs): super().__init__(interaction, request_type=request_type, notification=notification, sequence=sequence, *args, **kwargs) self._request_type = request_type self.notification = notification self._household = interaction.sim.household self._service_npc_user_specified_data_id = None self._recurring = False self._read_interaction_parameters(**interaction.interaction_parameters) def _read_interaction_parameters(self, service_npc_user_specified_data_id=None, service_npc_recurring_request=False, **kwargs): self._service_npc_user_specified_data_id = service_npc_user_specified_data_id self._recurring = service_npc_recurring_request def _do_behavior(self): request_type = self._request_type.request_type service_npc = self._request_type.service if service_npc is None: return service_npc_service = services.current_zone().service_npc_service if request_type == self.HIRE: finishing_time = service_npc_service.request_service( self._household, service_npc, user_specified_data_id=self. _service_npc_user_specified_data_id, is_recurring=self._recurring) if self.notification is not None and finishing_time is not None: finishing_time = finishing_time + create_time_span( minutes=self.MINUTES_ADD_TO_SERVICE_ARRIVAL) notification_element = self.notification(self.interaction) notification_element.show_notification( additional_tokens=(finishing_time, )) elif request_type == self.CANCEL: service_npc_service.cancel_service(self._household, service_npc) if self.notification is not None: notification_element = self.notification(self.interaction) notification_element._do_behavior()
def __init__(self, **kwargs): super().__init__(audio_modification=TunableAudioModificationElement(), audio_sting=TunableAudioSting.TunableFactory(), balloon=TunableBalloon(), broadcaster=BroadcasterRequest.TunableFactory(), buff=TunableBuffElement(), camera_focus=CameraFocusElement.TunableFactory(), career_selection=careers.career_tuning.CareerSelectElement.TunableFactory(), change_outfit=ChangeOutfitElement.TunableFactory(), create_object=ObjectCreationElement.TunableFactory(), create_sim=SimCreationElement.TunableFactory(), create_situation=CreateSituationElement.TunableFactory(), deliver_bill=DeliverBill.TunableFactory(), destroy_object=ObjectDestructionElement.TunableFactory(), destroy_specified_objects_from_target_inventory=DestroySpecifiedObjectsFromTargetInventory.TunableFactory(), do_command=DoCommand.TunableFactory(), dynamic_spawn_point=DynamicSpawnPointElement.TunableFactory(), exit_carry_while_holding=TunableExitCarryWhileHolding(), enter_carry_while_holding=TunableEnterCarryWhileHolding(), fade_children=FadeChildrenElement.TunableFactory(), inventory_transfer=InventoryTransfer.TunableFactory(), invite=InviteSimElement.TunableFactory(), life_event=TunableLifeEventElement(), notification=NotificationElement.TunableFactory(), npc_summon=TunableSummonNpc(), focus=TunableFocusElement(), parent_object=ParentObjectElement.TunableFactory(), payment=PaymentElement.TunableFactory(), pregnancy=PregnancyElement.TunableFactory(), put_object_in_mail=PutObjectInMail.TunableFactory(), royalty_payment=TunableRoyaltyPayment.TunableFactory(), send_to_inventory=SendToInventory.TunableFactory(), service_npc_request=ServiceNpcRequest.TunableFactory(), set_game_speed=TunableSetClockSpeed.TunableFactory(), set_goodbye_notification=SetGoodbyeNotificationElement.TunableFactory(), set_visibility_state=SetVisibilityStateElement.TunableFactory(), slot_item_harvest=SlotItemHarvest.TunableFactory(), stat_transfer_remove=TunableStatisticTransferRemove(), state_change=TunableStateChange(), store_sim=StoreSimElement.TunableFactory(), transfer_name=NameTransfer.TunableFactory(), transience_change=TunableTransienceChange(), trigger_reaction=ReactionTriggerElement.TunableFactory(), update_physique=UpdatePhysique.TunableFactory(), vfx=PlayVisualEffectElement.TunableFactory(), **kwargs)
class ServiceNpcSituation(SituationComplexCommon): __qualname__ = 'ServiceNpcSituation' INSTANCE_TUNABLES = { '_service_npc_job': TunableSituationJobAndRoleState( description= '\n The job for service sim in this situation and the corresponding\n starting role state for service sim. EX: the job for a maid would\n be the maid_job.\n ', display_name='Service Npc Job'), 'start_work_test_and_state': OptionalTunable( description= "\n If tuned, the situation will start by going to the ArriveOnLotState,\n and the service npc won't go into their 'working state' until\n the tuned test passes. When the test passes, the service npc will\n go into the work state with the tuned role state.\n \n If this is left as None, the service npc will start the situation\n going to the working state.\n ", tunable=TunableJobStateAndTest()), 'finish_job_states': TunableMapping( description= '\n Tune pairs of job finish role states with job finish tests. When\n those tests pass, the sim will transition to the paired role state.\n The situation will also be transitioned to the Leaving situation\n state.\n ', key_type=ServiceNpcEndWorkReason, value_type=TunableFinishJobStateAndTest()), 'preroll_autonomy': OptionalTunable( description= '\n If enabled, we will forcefully run an autonomy request when the\n service npc first gets spawned on the lot. The tunable specifies\n tests/settings for how to post process a manual autonomy request on\n the service npc. EX: preroll autonomy for the maid when she first\n gets onto the lot has an affordance link that blacklists her from\n doing the serviceNpc_noMoreWork interaction.\n ', tunable=ServicePrerollAutonomy.TunableFactory()), 'fake_perform_on_preroll_failure': OptionalTunable( description= "\n Enable this ONLY if preroll_autonomy is tuned.\n When enabled, the situation to listen to the interaction pushed by\n preroll autonomy and check if that interaction succeeded in running.\n If the interaction failed to run for any reason, the situation will\n run the service npc's fake_perform_job.\n \n Ex: for the mailman, preroll autonomy is tuned so the mailman has\n to delivery mail. if the delivery mail interaction is pushed,\n but the mailman cannot route to the mailbox, we will still deliver\n the mail using the service npc mailman tuning's fake perform job\n ", tunable=TunableTuple(notification=OptionalTunable( description= '\n If enabled, a notification will be displayed when the\n preroll fails and the fake perform modified some items.\n ', tunable=NotificationElement.TunableFactory( locked_args={ 'timing': XevtTriggeredElement.LOCKED_AT_BEGINNING, 'recipient_subject': None })))), 'fail_on_preroll_execute_failure': Tunable( description= '\n If the preroll execution failed, we consider that there was no\n preroll done and go to the failure state.\n ', tunable_type=bool, default=True) } REMOVE_INSTANCE_TUNABLES = ('_level_data', '_buff', '_cost', '_NPC_host_filter', '_NPC_hosted_player_tests', 'NPC_hosted_situation_start_message', 'venue_types', 'venue_invitation_message') CANCEL_SERVICE_LEAVING_REASONS = set( (ServiceNpcEndWorkReason.FIRED, ServiceNpcEndWorkReason.NOT_PAID)) @staticmethod def _states(): return [(1, ArrivingOnLotSituationState), (2, WorkingSituationState), (3, LeaveSituationState)] @classmethod def default_job(cls): return cls._service_npc_job.job @classmethod def _get_tuned_job_and_default_role_state_tuples(cls): return [(cls._service_npc_job.job, cls._service_npc_job.role_state)] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) reader = self._seed.custom_init_params_reader self._service_npc_type = services.service_npc_manager().get( reader.read_uint64('service_npc_type_id', 0)) if self._service_npc_type is None: raise ValueError( 'Invalid service npc type for situation: {}'.format(self)) self._hiring_household = services.household_manager().get( reader.read_uint64('household_id', 0)) if self._hiring_household is None: raise ValueError( 'Invalid household for situation: {}'.format(self)) self._is_recurring = reader.read_bool('is_recurring', False) self._object_definition_to_craft = reader.read_uint64( 'user_specified_data_id', 0) self._crafted_object_id = reader.read_uint64('crafted_object_id', 0) self._service_start_time = services.time_service().sim_now self._had_preroll_work = True self._is_leaving = False def start_situation(self): if services.get_super_speed_three_service( ).in_or_has_requested_super_speed_three(): clock_service = services.game_clock_service() clock_service.stop_super_speed_three() super().start_situation() self._change_state(ArrivingOnLotSituationState()) def _save_custom_situation(self, writer): super()._save_custom_situation(writer) writer.write_uint64('household_id', self._hiring_household.id) writer.write_uint64('service_npc_type_id', self._service_npc_type.guid64) writer.write_uint64('is_recurring', self._is_recurring) writer.write_uint64('user_specified_data_id', self._object_definition_to_craft) writer.write_uint64('crafted_object_id', self._crafted_object_id) def _on_set_sim_job(self, sim, job_type): service_record = self._hiring_household.get_service_npc_record( self._service_npc_type.guid64) service_record.add_preferred_sim(sim.sim_info.id) self._service_npc_type.on_service_sim_entered_situation(sim, self) start_work_test = self._get_start_work_test() if start_work_test is None and self.start_work_test_and_state is not None: self._set_job_role_state( self.default_job(), self.start_work_test_and_state.role_state, role_affordance_target=self.role_affordance_target) 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._get_start_work_test() is None: self._change_state(WorkingSituationState()) def _on_remove_sim_from_situation(self, sim): if sim is self.service_sim() and ( not self._is_recurring and not self._is_leaving ) and services.current_zone().service_npc_service is not None: services.current_zone().service_npc_service.cancel_service( self._hiring_household, self._service_npc_type) super()._on_remove_sim_from_situation(sim) @property def _should_cancel_leave_interaction_on_premature_removal(self): return True def service_sim(self): sim = next(self.all_sims_in_job_gen(self.default_job()), None) return sim def on_ask_sim_to_leave(self, sim): return False def _on_preroll_cancelled(self, interaction): if interaction.uncanceled: return num_objects_modified = self._service_npc_type.fake_perform( self._hiring_household) if num_objects_modified > 0: notification = self.fake_perform_on_preroll_failure.notification if notification is not None: hiring_household_client = self._hiring_household.client if hiring_household_client is not None and hiring_household_client.active_sim is not None: notification_element = notification(interaction) notification_element.show_notification( recipients=(hiring_household_client.active_sim, )) def _on_starting_work(self): if self.preroll_autonomy is not None: chosen_interaction = self.preroll_autonomy().run_preroll( self.service_sim()) if chosen_interaction is None: self._had_preroll_work = False else: execute_result = AffordanceObjectPair.execute_interaction( chosen_interaction) if not execute_result: if self.fail_on_preroll_execute_failure: self._had_preroll_work = False if self.fake_perform_on_preroll_failure is not None: self._on_preroll_cancelled(chosen_interaction) elif self.fake_perform_on_preroll_failure is not None: chosen_interaction.register_on_cancelled_callback( self._on_preroll_cancelled) elif self.fake_perform_on_preroll_failure is not None: chosen_interaction.register_on_cancelled_callback( self._on_preroll_cancelled) if not self._had_preroll_work: self._change_state( LeaveSituationState(ServiceNpcEndWorkReason.NO_WORK_TO_DO)) def _situation_timed_out(self, _): if not self._is_leaving: self._change_state( LeaveSituationState(ServiceNpcEndWorkReason.FINISHED_WORK)) def _on_leaving_situation(self, end_work_reason): service_npc_type = self._service_npc_type household = self._hiring_household try: now = services.time_service().sim_now time_worked = now - self._service_start_time time_worked_in_hours = time_worked.in_hours() if self._had_preroll_work: cost = service_npc_type.get_cost(time_worked_in_hours) else: cost = 0 if cost > 0: (paid_amount, billed_amount) = service_npc_type.try_charge_for_service( household, cost) end_work_reason = ServiceNpcEndWorkReason.NOT_PAID else: paid_amount = 0 billed_amount = 0 self._send_end_work_notification(end_work_reason, paid_amount, billed_amount) service_record = household.get_service_npc_record( service_npc_type.guid64) service_record.time_last_finished_service = now if end_work_reason == ServiceNpcEndWorkReason.FIRED: service_sim = self.service_sim() if service_record is not None: service_record.add_fired_sim(service_sim.id) service_record.remove_preferred_sim(service_sim.id) while end_work_reason in ServiceNpcSituation.CANCEL_SERVICE_LEAVING_REASONS: services.current_zone().service_npc_service.cancel_service( household, service_npc_type) except Exception as e: logger.exception( 'Exception while executing _on_leaving_situation for situation {}', self, exc=e) finally: if not self._is_recurring: services.current_zone().service_npc_service.cancel_service( household, service_npc_type) return end_work_reason def _send_end_work_notification(self, end_work_reason, *localization_args): end_work_tuning = self.finish_job_states[end_work_reason] notification = end_work_tuning.notification if notification is None: return for client in services.current_zone().client_manager.values(): recipient = client.active_sim while recipient is not None: dialog = notification(recipient) dialog.show_dialog(additional_tokens=localization_args, icon_override=(None, self.service_sim())) break @property def hiring_household(self): return self._hiring_household @property def object_definition_to_craft(self): return self._object_definition_to_craft def set_crafted_object_id(self, object_id): self._crafted_object_id = object_id @property def role_affordance_target(self): target = services.object_manager().get(self._crafted_object_id) if target is None: target = services.current_zone().inventory_manager.get( self._crafted_object_id) return target def _get_start_work_test(self): if self.start_work_test_and_state is not None: start_work_test = self.start_work_test_and_state.enter_state_test if start_work_test.affordances or start_work_test.tags: return start_work_test def _get_role_state_overrides(self, sim, job_type, role_state_type, role_affordance_target): return (role_state_type, self.role_affordance_target)
def __init__ (self, **kwargs): super().__init__(add_to_ensemble = AddToEnsemble.TunableFactory(), add_to_household = AddToHouseholdElement.TunableFactory(), add_to_travel_group = TravelGroupAdd.TunableFactory(), adventure = Adventure.TunableFactory(), audio_modification = TunableAudioModificationElement(), audio_sting = TunableAudioSting.TunableFactory(), balloon = TunableBalloon(), broadcaster = BroadcasterRequest.TunableFactory(), buff = TunableBuffElement(), buff_fire_and_forget = BuffFireAndForgetElement.TunableFactory(), business_buy_lot = BusinessBuyLot.TunableFactory(), business_employee_action = BusinessEmployeeAction.TunableFactory(), call_to_action_turn_off = TurnOffCallToAction.TunableFactory(), camera_focus = CameraFocusElement.TunableFactory(), career_selection = careers.career_tuning.CareerSelectElement.TunableFactory(), change_age = ChangeAgeElement.TunableFactory(), change_outfit = ChangeOutfitElement.TunableFactory(), conditional_layer = ManipulateConditionalLayer.TunableFactory(), create_object = ObjectCreationElement.TunableFactory(), create_photo_memory = CreatePhotoMemory.TunableFactory(), create_sim = SimCreationElement.TunableFactory(), create_situation = CreateSituationElement.TunableFactory(), deliver_bill = DeliverBill.TunableFactory(), destroy_ensemble = DestroyEnsemble.TunableFactory(), destroy_object = ObjectDestructionElement.TunableFactory(), destroy_situations_by_tags = DestroySituationsByTagsElement.TunableFactory(), destroy_specified_objects_from_target_inventory = DestroySpecifiedObjectsFromTargetInventory.TunableFactory(), display_notebook_ui = NotebookDisplayElement.TunableFactory(), do_command = DoCommand.TunableFactory(), dynamic_spawn_point = DynamicSpawnPointElement.TunableFactory(), end_vacation = TravelGroupEnd.TunableFactory(), exit_carry_while_holding = TunableExitCarryWhileHolding(), extend_vacation = TravelGroupExtend.TunableFactory(), enter_carry_while_holding = EnterCarryWhileHolding.TunableFactory(), fade_children = FadeChildrenElement.TunableFactory(), familiar_bind = BindFamiliarElement.TunableFactory(), familiar_dismiss = DismissFamiliarElement.TunableFactory(), focus = TunableFocusElement(), inventory_transfer = InventoryTransfer.TunableFactory(), invite = InviteSimElement.TunableFactory(), join_situation = JoinSituationElement.TunableFactory(), leave_situation = LeaveSituationElement.TunableFactory(), loot = LootElement.TunableFactory(), lot_decoration = LotDecorationElement.TunableFactory(), life_event = TunableLifeEventElement(), mark_object_as_stolen = MarkObjectAsStolen.TunableFactory(), notification = NotificationElement.TunableFactory(), npc_summon = TunableSummonNpc(), object_relationship_social = ObjectRelationshipSocialTrigger.TunableFactory(), painting_state_transfer = PaintingStateTransfer.TunableFactory(), parent_object = ParentObjectElement.TunableFactory(), payment = PaymentElement.TunableFactory(), play_stored_audio_from_source = TunablePlayStoredAudioFromSource.TunableFactory(), pregnancy = PregnancyElement.TunableFactory(), put_near = PutNearElement.TunableFactory(), put_object_in_mail = PutObjectInMail.TunableFactory(), put_sim_in_rabbit_hole = RabbitHoleElement.TunableFactory(), record_trends = RecordTrendsElement.TunableFactory(), remove_from_ensemble = RemoveFromEnsemble.TunableFactory(), remove_from_travel_group = TravelGroupRemove.TunableFactory(), replace_object = ReplaceObject.TunableFactory(), retail_customer_action = RetailCustomerAction.TunableFactory(), return_stolen_object = ReturnStolenObject.TunableFactory(), route_events = RouteEventProviderRequest.TunableFactory(), routing_formation = RoutingFormationElement.TunableFactory(), royalty_payment = TunableRoyaltyPayment.TunableFactory(), save_participant = SaveParticipantElement.TunableFactory(), send_to_inventory = SendToInventory.TunableFactory(), service_npc_request = ServiceNpcRequest.TunableFactory(), set_as_head = SetAsHeadElement.TunableFactory(), set_game_speed = TunableSetClockSpeed.TunableFactory(), set_goodbye_notification = SetGoodbyeNotificationElement.TunableFactory(), set_photo_filter = SetPhotoFilter.TunableFactory(), set_posture = SetPosture.TunableFactory(), set_visibility_state = SetVisibilityStateElement.TunableFactory(), slot_objects_from_inventory = SlotObjectsFromInventory.TunableFactory(), slot_item_transfer = SlotItemTransfer.TunableFactory(), stat_transfer_remove = TunableStatisticTransferRemove(), state_change = TunableStateChange(), store_sim = StoreSimElement.TunableFactory(), submit_to_festival_contest = FestivalContestSubmitElement.TunableFactory(), switch_occult = SwitchOccultElement.TunableFactory(), take_photo = TakePhoto.TunableFactory(), track_diagnostic_action = TrackDiagnosticAction.TunableFactory(), transfer_carry_while_holding = TransferCarryWhileHolding.TunableFactory(), transfer_name = NameTransfer.TunableFactory(), transfer_stored_audio_component = TransferStoredAudioComponent.TunableFactory(), transience_change = TunableTransienceChange(), trigger_reaction = ReactionTriggerElement.TunableFactory(), university_enrollment_ui = UniversityEnrollmentElement.TunableFactory(), update_family_portrait = UpdateFamilyPortrait.TunableFactory(), update_object_value = UpdateObjectValue.TunableFactory(), update_physique = UpdatePhysique.TunableFactory(), update_display_number = UpdateDisplayNumber.TunableFactory(), walls_up_override = SetWallsUpOverrideElement.TunableFactory(), vfx = PlayVisualEffectElement.TunableFactory(), **kwargs)