def _on_set_sim_job(self, sim, job): super()._on_set_sim_job(sim, job) stanned_sim_id = self.initiating_sim_info.sim_id services.relationship_service().add_relationship_bit( sim.sim_id, stanned_sim_id, self.cooldown_bit, send_rel_change_event=False)
def set_custom_name (self, name, actor_sim_id = None): if self.allow_name: self.owner.custom_name = name if name else None if isinstance(self.owner, ClientObjectMixin): self.owner.update_tooltip_field(TooltipFieldsComplete.custom_name, name, priority = NAME_COMPONENT_TOOLTIP_PRIORITY, should_update = True) if actor_sim_id is not None and services.relationship_service().get_mapped_tag_set_of_id(self.owner.definition.id): services.relationship_service().update_object_type_name(name, actor_sim_id, self.owner.definition.id, self.owner) self._call_name_changed_callback() return True return False
def on_spawn_sim_for_zone_spin_up_completed(self, client): relgraph_initializable = RelgraphService.RELGRAPH_ENABLED and not RelgraphService.is_relgraph_initialized() for sim_info in self.values(): instanced_sim = sim_info.get_sim_instance(allow_hidden_flags=ALL_HIDDEN_REASONS) if instanced_sim is None: if sim_info.commodity_tracker is not None: sim_info.commodity_tracker.start_low_level_simulation() elif sim_info.is_baby: instanced_sim.enable_baby_state() if relgraph_initializable: sim_info.push_to_relgraph() if not game_services.service_manager.is_traveling: with genealogy_caching(): self.set_default_genealogy() if relgraph_initializable: for sim_info in self.values(): sim_info.set_relgraph_family_edges() relationship_service = services.relationship_service() for sim_info in client.selectable_sims: relationship_service.send_relationship_info(sim_info.sim_id) for sim_info in itertools.chain(self._sim_infos_saved_in_zone, self._sim_infos_saved_in_open_street, self._sim_infos_injected_into_zone): if not sim_info.is_baby: if sim_info.get_sim_instance(allow_hidden_flags=ALL_HIDDEN_REASONS) is None: if not sim_info.lives_here: sim_info.inject_into_inactive_zone(sim_info.vacation_or_home_zone_id) else: sim_info.inject_into_inactive_zone(0) RelgraphService.relgraph_cull(self.values()) self._update_greeting_relationships_on_zone_spinup()
def _disable_non_tutorial_functionality(self): services.drama_scheduler_service().set_enabled_state(False) npc_hosted_situation_service = services.npc_hosted_situation_service() if npc_hosted_situation_service is not None: npc_hosted_situation_service.suspend_welcome_wagon() if self._receiver_sim_info is not None: household = self._receiver_sim_info.household if household is not None: household.bills_manager.autopay_bills = True if self._sender_sim_info is not None: if self._receiver_sim_info.age == self._sender_sim_info.age: receiver_age_progress = self._receiver_sim_info.age_progress if receiver_age_progress <= self._sender_sim_info.age_progress: if receiver_age_progress == 0: self._receiver_sim_info.age_progress = 0.1 else: self._sender_sim_info.age_progress = 0 relationship_tracker = self._receiver_sim_info.relationship_tracker sender_id = self._sender_sim_info.sim_id relationship = services.relationship_service().create_relationship(self._receiver_sim_info.sim_id, sender_id) relationship_tracker.add_relationship_score(sender_id, self.friendship_value, RelationshipTrack.FRIENDSHIP_TRACK) relationship_tracker.add_relationship_score(sender_id, self.romance_value, RelationshipTrack.ROMANCE_TRACK) relationship.relationship_track_tracker.set_longterm_tracks_locked(True) weather_service = services.weather_service() if weather_service is not None: weather_service.force_start_weather_event(self.weather_to_force, None) weather_service.update_weather_type(during_load=True) fire_service = services.fire_service if fire_service is not None: fire_service.fire_enabled = False
def on_enter(self): super().on_enter() zone = services.current_zone() zone.venue_service.build_buy_edit_mode = True services.household_manager().load_households() zone.on_households_and_sim_infos_loaded() client = zone.zone_spin_up_service._client_connect_data.client club_service = services.get_club_service() if club_service is not None: club_service.on_all_households_and_sim_infos_loaded(client) relationship_service = services.relationship_service() if relationship_service is not None: relationship_service.on_all_households_and_sim_infos_loaded(client) roommate_service = services.get_roommate_service() if roommate_service is not None: roommate_service.initialize_editmode_roommates() situation_manager = services.get_zone_situation_manager() situation_manager.spin_up_for_edit_mode() object_manager = services.object_manager() water_terrain_object_cache = object_manager.water_terrain_object_cache build_buy.register_build_buy_exit_callback( water_terrain_object_cache.refresh) conditional_layer_service = services.conditional_layer_service() conditional_layer_service.on_zone_load(editmode=True) for obj in object_manager.values(): footprint_component = obj.get_component(FOOTPRINT_COMPONENT) if footprint_component is not None: footprint_component.on_finalize_load() services.game_clock_service().restore_saved_clock_speed() return _ZoneSpinUpStateResult.DONE
def set_object_relationship(sim_id: int, obj_def_id: int, value: int, _connection=None): obj_tag_set = services.relationship_service().get_mapped_tag_set_of_id( obj_def_id) if obj_tag_set is None: logger.error( 'Invalid object definition ID, relationship creation failed.') sims4.commands.output('The object definition ID is invalid', _connection) return False obj_relationship = services.relationship_service( )._find_object_relationship(sim_id, obj_tag_set, obj_def_id, create=True) if obj_relationship is None: logger.error('Relationship creation failed.') sims4.commands.output('Object relationship creation failed', _connection) return False stat_type = services.relationship_service().get_mapped_track_of_tag_set( obj_tag_set) obj_relationship.relationship_track_tracker.set_value(stat_type, value)
def get_object_property(self, property_type): if property_type == GameObjectProperty.CATALOG_PRICE: return self.definition.price if property_type == GameObjectProperty.MODIFIED_PRICE: return self.current_value if property_type == GameObjectProperty.RARITY: return self.get_object_rarity_string() if property_type == GameObjectProperty.GENRE: return Genre.get_genre_localized_string(self) if property_type == GameObjectProperty.RECIPE_NAME or property_type == GameObjectProperty.RECIPE_DESCRIPTION: return self.get_craftable_property(self, property_type) if property_type == GameObjectProperty.OBJ_TYPE_REL_ID: return services.relationship_service().get_object_type_rel_id(self) logger.error('Requested property_type {} not found on game_object'.format(property_type), owner='camilogarcia')
def _update_object_relationship_name(self): ownable_component = self.owner.get_component(types.OWNABLE_COMPONENT) if ownable_component is not None: sim_owner_id = ownable_component.get_sim_owner_id() obj_def_id = self.owner.definition.id relationship_service = services.relationship_service() obj_tag_set = relationship_service.get_mapped_tag_set_of_id( obj_def_id) if obj_tag_set is not None: obj_relationship = relationship_service.get_object_relationship( sim_owner_id, obj_tag_set) if obj_relationship is not None and self.owner.has_custom_name( ): obj_relationship.set_object_rel_name( self.owner.custom_name)
def _apply_to_subject_and_target (self, subject, target, resolver): ownable_component = target.get_component(types.OWNABLE_COMPONENT) name_component = target.get_component(types.NAME_COMPONENT) if ownable_component is not None and name_component is not None: sim_owner_id = ownable_component.get_sim_owner_id() obj_def_id = target.definition.id relationship_service = services.relationship_service() obj_tag_set = relationship_service.get_mapped_tag_set_of_id(obj_def_id) if obj_tag_set is not None: obj_relationship = relationship_service.get_object_relationship(sim_owner_id, obj_tag_set) if obj_relationship is not None and obj_relationship.get_object_rel_name() is not None: name_component.set_custom_name(obj_relationship.get_object_rel_name()) else: logger.error('Target {} needs to have both ownable and name components. Please fix {} in tuning.', target, self) return
def add_statistic(self, stat_type, owner=None, **kwargs): if self.is_track_locked(stat_type): return if stat_type.species_requirements is not None: sim_info_a = services.sim_info_manager().get( self.rel_data.sim_id_a) sim_info_b = services.sim_info_manager().get( self.rel_data.sim_id_b) if sim_info_a is not None and sim_info_b is not None: sim_a_species = sim_info_a.species sim_b_species = sim_info_b.species species_list_one = stat_type.species_requirements.species_list_one species_list_two = stat_type.species_requirements.species_list_two if (sim_a_species not in species_list_one or sim_b_species not in species_list_two) and ( sim_b_species not in species_list_one or sim_a_species not in species_list_two): return if sim_info_a.trait_tracker.hide_relationships or sim_info_b.trait_tracker.hide_relationships: return relationship_track = super().add_statistic(stat_type, owner=owner, **kwargs) if relationship_track is None: return relationship_service = services.relationship_service() for relationship_multipliers in itertools.chain( relationship_service.get_relationship_multipliers_for_sim( self._rel_data.sim_id_a), relationship_service.get_relationship_multipliers_for_sim( self._rel_data.sim_id_b)): for (rel_track, multiplier) in relationship_multipliers.items(): if rel_track is stat_type: relationship_track.add_statistic_multiplier(multiplier) if not self.load_in_progress and relationship_track.tested_initial_modifier is not None: sim_info_a = services.sim_info_manager().get( self.rel_data.sim_id_a) sim_info_b = services.sim_info_manager().get( self.rel_data.sim_id_b) if sim_info_a is None or sim_info_b is None: return relationship_track modified_amount = relationship_track.tested_initial_modifier.get_max_modifier( DoubleSimResolver(sim_info_a, sim_info_b)) relationship_track.add_value(modified_amount) return relationship_track
def set_death_type(self, death_type, is_off_lot_death=False): is_npc = self._sim_info.is_npc household = self._sim_info.household self._sim_info.inject_into_inactive_zone(self.DEATH_ZONE_ID, start_away_actions=False, skip_instanced_check=True, skip_daycare=True) household.remove_sim_info(self._sim_info, destroy_if_empty_household=True) if is_off_lot_death: household.pending_urnstone_ids.append(self._sim_info.sim_id) self._sim_info.transfer_to_hidden_household() clubs.on_sim_killed_or_culled(self._sim_info) if death_type is None: return relationship_service = services.relationship_service() for target_sim_info in relationship_service.get_target_sim_infos( self._sim_info.sim_id): resolver = DoubleSimResolver(target_sim_info, self._sim_info) for death_data in self.DEATH_BUFFS: if not death_data.test_set(resolver): continue target_sim_info.add_buff_from_op( death_data.buff.buff_type, buff_reason=death_data.buff.buff_reason) if is_npc and not target_sim_info.is_npc: notification = death_data.notification(target_sim_info, resolver=resolver) notification.show_dialog() break ghost_trait = DeathTracker.DEATH_TYPE_GHOST_TRAIT_MAP.get(death_type) if ghost_trait is not None: self._sim_info.add_trait(ghost_trait) traits = list(self._sim_info.trait_tracker.equipped_traits) for trait in traits: if trait.remove_on_death: self._sim_info.remove_trait(trait) self._death_type = death_type self._death_time = services.time_service().sim_now.absolute_ticks() self._sim_info.reset_age_progress() self._sim_info.resend_death_type() self._handle_remove_rel_bits_on_death() services.get_event_manager().process_event( test_events.TestEvent.SimDeathTypeSet, sim_info=self._sim_info)
def end(self): drama_service = services.drama_scheduler_service() drama_service.set_enabled_state(True) if self._receiver_sim_info is not None: household = self._receiver_sim_info.household if household is not None: household.bills_manager.autopay_bills = False if self._sender_sim_info is not None: sim_info = self._sender_sim_info household = self._receiver_sim_info.household if sim_info in household: client = services.client_manager().get_first_client() if not client.set_active_sim_info(self._receiver_sim_info): logger.error('Tutorial Drama node ended without being able to set player sim to active.') client.remove_selectable_sim_info(sim_info) household.remove_sim_info(sim_info) sim_info.transfer_to_hidden_household() relationship = services.relationship_service().create_relationship(self._receiver_sim_info.sim_id, sim_info.sim_id) if relationship is not None: relationship.relationship_track_tracker.set_longterm_tracks_locked(False) npc_hosted_situation_service = services.npc_hosted_situation_service() if npc_hosted_situation_service is not None: npc_hosted_situation_service.resume_welcome_wagon() situation_manager = services.get_zone_situation_manager() if situation_manager is not None: situation = situation_manager.get_situation_by_type(self.situation_to_run) if situation is not None: situation_manager.destroy_situation_by_id(situation.id) weather_service = services.weather_service() if weather_service is not None: weather_service.reset_forecasts() fire_service = services.fire_service if fire_service is not None: fire_service.fire_enabled = True resolver = DoubleSimResolver(self._receiver_sim_info, self._sender_sim_info) for loot_action in self.end_loots: loot_action.apply_to_resolver(resolver) drama_service.complete_node(self.uid)