예제 #1
0
 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)
예제 #2
0
	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
예제 #3
0
 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()
예제 #4
0
 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
예제 #5
0
 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
예제 #6
0
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)
예제 #7
0
 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)
예제 #9
0
	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
예제 #11
0
 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)
예제 #12
0
 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)