예제 #1
0
def buildbuy_session_end(zone_id):
    services.object_manager(
        zone_id).rebuild_objects_to_ignore_portal_validation_cache()
    for obj in services.object_manager(zone_id).get_all():
        obj.on_buildbuy_exit()
    posture_graph_service = services.current_zone().posture_graph_service
    posture_graph_service.on_exit_buildbuy()
    _build_buy_exit_callbacks()
    pythonutils.try_highwater_gc()
    services.get_zone_modifier_service(
    ).check_for_and_apply_new_zone_modifiers(zone_id)
    if _sync_venue_service_to_zone_venue_type(zone_id):
        zone_director = services.venue_service().get_zone_director()
        if zone_director is not None:
            zone_director.on_exit_buildbuy()
    object_preference_tracker = services.object_preference_tracker()
    if object_preference_tracker is not None:
        object_preference_tracker.validate_objects(zone_id)
    services.business_service().on_build_buy_exit()
    services.current_zone().on_build_buy_exit()
    services.utilities_manager().on_build_buy_exit()
    services.get_reset_and_delete_service().on_build_buy_exit()
    street_service = services.street_service()
    if street_service is not None:
        street = services.current_street()
        if street is not None:
            provider = street_service.get_provider(street)
            if provider is not None:
                provider.on_build_buy_exit()
    services.object_manager().clear_objects_to_ignore_portal_validation_cache()
예제 #2
0
def add_zone_modifier(zone_modifier: TunableInstanceParam(
    sims4.resources.Types.ZONE_MODIFIER),
                      target_zone_id: int = None,
                      _connection=None):
    if target_zone_id is None:
        target_zone_id = services.current_zone_id()
    persistence_service = services.get_persistence_service()
    zone_data = persistence_service.get_zone_proto_buff(
        services.current_zone_id())
    if zone_data is None:
        return
    if len(zone_data.lot_traits) == ZONE_MODIFIER_CAP:
        sims4.commands.output(
            'There are already {} lot traits on the lot.  Remove one first.'.
            format(ZONE_MODIFIER_CAP), _connection)
        return
    zone_modifier_id = zone_modifier.guid64
    if zone_modifier_id in zone_data.lot_traits:
        sims4.commands.output(
            '{} is already a trait on the lot.'.format(zone_modifier),
            _connection)
        return
    zone_data.lot_traits.append(zone_modifier_id)
    services.get_zone_modifier_service(
    ).check_for_and_apply_new_zone_modifiers(target_zone_id)
예제 #3
0
def remove_all_zone_modifiers(target_zone_id: int = None, _connection=None):
    if target_zone_id is None:
        target_zone_id = services.current_zone_id()
    persistence_service = services.get_persistence_service()
    zone_data = persistence_service.get_zone_proto_buff(
        services.current_zone_id())
    if zone_data is None:
        return
    traits_to_remove = list(zone_data.lot_traits)
    for trait in traits_to_remove:
        zone_data.lot_traits.remove(trait)
    services.get_zone_modifier_service(
    ).check_for_and_apply_new_zone_modifiers(target_zone_id)
예제 #4
0
 def _on_utility_supply_deficit(self, utility_info, zone_id):
     currently_active = utility_info.active
     utility_info.surplus = False
     if currently_active != utility_info.active:
         self._shutoff_utilities(utility_info.utility)
     zone_modifiers = services.get_zone_modifier_service(
     ).get_zone_modifiers(zone_id)
     for zone_modifier in zone_modifiers:
         zone_modifier.on_utility_supply_deficit(utility_info.utility)
예제 #5
0
 def _on_utility_supply_surplus(self, utility_info, zone_id):
     currently_active = utility_info.active
     utility_info.surplus = True
     if currently_active != utility_info.active:
         self._startup_utilities(utility_info.utility)
     zone_modifiers = services.get_zone_modifier_service(
     ).get_zone_modifiers(zone_id)
     for zone_modifier in zone_modifiers:
         zone_modifier.on_utility_supply_surplus(utility_info.utility)
예제 #6
0
def remove_zone_modifier(zone_modifier: TunableInstanceParam(
    sims4.resources.Types.ZONE_MODIFIER),
                         target_zone_id: int = None,
                         _connection=None):
    if target_zone_id is None:
        target_zone_id = services.current_zone_id()
    persistence_service = services.get_persistence_service()
    zone_data = persistence_service.get_zone_proto_buff(
        services.current_zone_id())
    if zone_data is None:
        return
    zone_modifier_id = zone_modifier.guid64
    if zone_modifier_id not in zone_data.lot_traits:
        sims4.commands.output(
            '{} is not a trait on the lot.'.format(zone_modifier), _connection)
        return
    zone_data.lot_traits.remove(zone_modifier_id)
    services.get_zone_modifier_service(
    ).check_for_and_apply_new_zone_modifiers(target_zone_id)
예제 #7
0
    def get_lot_traits(lot_id: int) -> Tuple[ZoneModifier]:
        """get_lot_traits(lot_id)

        Retrieve the Lot Traits of a Lot with the specified identifier.

        :param lot_id: The lot to retrieve the traits of.
        :type lot_id: int
        :return: A collection of Lot Traits for the specified lot.
        :rtype: Tuple[ZoneModifier]
        """
        return tuple(services.get_zone_modifier_service().get_zone_modifiers(lot_id))
 def _test(self, *args, **kwargs):
     if self._zone_id is None:
         return TestResult(
             False,
             'Cannot run Venue Event Drama Node with no zone id set.')
     zone_modifiers = services.get_zone_modifier_service(
     ).get_zone_modifiers(self._zone_id)
     if not self.zone_modifier_requirements.test_collection(zone_modifiers):
         return TestResult(False,
                           'Incompatible zone modifiers tuned on venue.')
     return super()._test(*args, **kwargs)
 def can_schedule_situation(self,
                            situation,
                            limit_based_on_sims=False,
                            number_of_sims_desired=0,
                            **kwargs):
     if services.game_clock_service(
     ).clock_speed == clock.ClockSpeedMode.SUPER_SPEED3 and not situation.allowed_in_super_speed_3:
         return False
     if limit_based_on_sims and not situation.can_start_walkby(
             services.active_lot_id(), number_of_sims_desired):
         return False
     return situation.situation_meets_starting_requirements(
         **kwargs) and not services.get_zone_modifier_service(
         ).is_situation_prohibited(services.current_zone_id(), situation)
 def _get_build_objects_environment_score(self):
     negative_value = 0
     positive_value = 0
     if not services.get_zone_modifier_service(
     ).is_build_eco_effects_enabled:
         return (negative_value, positive_value)
     lot = services.current_zone().lot
     negative_stat_type = EnvironmentScoreTuning.BUILD_OBJECTS_ENVIRONMENT_SCORING.negative_environment_scoring
     negative_stat_tracker = lot.get_tracker(negative_stat_type)
     if negative_stat_tracker is not None:
         negative_value = negative_stat_tracker.get_value(
             negative_stat_type)
     positive_stat_type = EnvironmentScoreTuning.BUILD_OBJECTS_ENVIRONMENT_SCORING.positive_environment_scoring
     positive_stat_tracker = lot.get_tracker(positive_stat_type)
     if positive_stat_tracker is not None:
         positive_value = positive_stat_tracker.get_value(
             positive_stat_type)
     return (negative_value, positive_value)
예제 #11
0
def generate_zone_modifiers_view_data(zone_id: int = None, filter=None):
    filter_list = parse_filter_to_list(filter)
    zone_modifier_service = services.get_zone_modifier_service()
    venue_service = services.venue_service()
    zone_modifiers = set(
        services.get_instance_manager(Types.ZONE_MODIFIER).types.values())
    zone_id = services.current_zone_id()
    current_zones_modifiers = zone_modifier_service.get_zone_modifiers(
        zone_id, force_cache=True)
    current_venue_zones_modifiers = venue_service.get_additional_zone_modifiers(
        zone_id)
    registered_event_map = _get_registered_events(zone_modifiers)
    event_times_map = _get_next_event_times(zone_modifiers)
    objects_effects = _get_objects_effects(zone_modifiers)
    zone_modifier_list = list()
    for zone_modifier in zone_modifiers:
        is_active_zone_modifier = zone_modifier in current_zones_modifiers
        if filter_list is not None and FILTER_SHOW_ACTIVE_ZONE_MODIFIERS in filter_list and not is_active_zone_modifier:
            continue
        zone_modifier_list.append({
            'id':
            zone_modifier.guid64,
            'name':
            zone_modifier.__name__,
            'assigned_to_zone':
            is_active_zone_modifier,
            'enter_loots':
            len(zone_modifier.enter_lot_loot),
            'exit_loots':
            len(zone_modifier.exit_lot_loot),
            'scheduled_entries':
            len(zone_modifier.schedule(init_only=True).get_schedule_entries()),
            'event_tests':
            len(registered_event_map[zone_modifier]),
            'hidden':
            zone_modifier in current_venue_zones_modifiers,
            'Event Tests':
            registered_event_map[zone_modifier],
            'Schedule Event Time':
            event_times_map[zone_modifier],
            'Architectural Objects Effects':
            objects_effects[zone_modifier]
        })
    return zone_modifier_list
예제 #12
0
 def __call__(self, *args, **kwargs):
     zone_id = self.zone_source.get_zone_id(**kwargs)
     if not zone_id:
         return TestResult(False, "ZoneTest couldn't find a zone to test.", tooltip=self.tooltip)
     if self.zone_tests.venue_type is not None:
         venue_service = services.venue_service()
         if self.zone_tests.use_source_venue:
             venue_tuning = type(venue_service.source_venue)
         else:
             venue_tuning = type(venue_service.active_venue)
         venue_tunings = (venue_tuning,) if venue_tuning is not None else ()
         if not self.zone_tests.venue_type.test_collection(venue_tunings):
             return TestResult(False, 'Zone failed venue white or black list {}', venue_tuning, tooltip=self.tooltip)
     if self.zone_tests.venue_tier is not None:
         venue_tier_index = build_buy.get_venue_tier(zone_id)
         if self.zone_tests.venue_tier != venue_tier_index:
             return TestResult(False, 'Zone has tier {} but {} was required', venue_tier_index, self.zone_tests.venue_tier, tooltip=self.tooltip)
     if self.zone_tests.is_apartment is not None:
         plex_service = services.get_plex_service()
         if self.zone_tests.is_apartment.is_apartment != plex_service.is_zone_an_apartment(zone_id, consider_penthouse_an_apartment=self.zone_tests.is_apartment.consider_penthouse_an_apartment):
             return TestResult(False, 'Zone failed apartment test', tooltip=self.tooltip)
     if self.zone_tests.is_penthouse is not None:
         plex_service = services.get_plex_service()
         is_penthouse = plex_service.get_plex_building_type(zone_id) == PlexBuildingType.PENTHOUSE_PLEX
         if is_penthouse != self.zone_tests.is_penthouse:
             return TestResult(False, 'Zone failed penthouse test', tooltip=self.tooltip)
     if self.zone_tests.zone_modifiers is not None:
         zone_modifier_service = services.get_zone_modifier_service()
         zone_modifiers = zone_modifier_service.get_zone_modifiers(zone_id)
         if not self.zone_tests.zone_modifiers.test_collection(zone_modifiers):
             return TestResult(False, 'Zone failed to meet whitelist/blacklist for zone modifiers. ZoneId: {}, Mods: {}', zone_id, zone_modifiers, tooltip=self.tooltip)
     if self.zone_tests.world_tests is not None:
         world_id = services.get_persistence_service().get_world_id_from_zone(zone_id)
         world_desc_id = services.get_world_description_id(world_id)
         if world_desc_id == 0:
             return TestResult(False, 'Unable to determine world for Zone {}', zone_id)
         if not self.zone_tests.world_tests.test_item(world_desc_id):
             return TestResult(False, 'Zone {} failed to meet world requirements, is in {}, fails tests for {}', zone_id, world_desc_id, self.zone_tests.world_tests, tooltip=self.tooltip)
     if self.zone_tests.business_tests is not None:
         return self.zone_tests.business_tests(zone_id)
     return TestResult.TRUE
예제 #13
0
def run_zone_modifier_entry(zone_modifier, schedule_entry_index, _connection):
    persistence_service = services.get_persistence_service()
    zone_data = persistence_service.get_zone_proto_buff(
        services.current_zone_id())
    if zone_data is None:
        return
    zone_modifier_id = zone_modifier.guid64
    if zone_modifier_id not in zone_data.lot_traits:
        sims4.commands.output(
            '{} is not a trait on the lot.'.format(zone_modifier), _connection)
        return
    index = int(schedule_entry_index)
    schedule_entries = zone_modifier.schedule.schedule_entries
    if index < 0 or index >= len(schedule_entries):
        sims4.commands.output(
            '{} is an invalid schedule entry index.'.format(index),
            _connection)
        return
    zone_modifier_service = services.get_zone_modifier_service()
    zone_modifier_service.run_zone_modifier_schedule_entry(
        schedule_entries[index])
예제 #14
0
 def send_lot_display_info(self):
     lot_name = self.get_lot_name()
     household = self.get_household()
     if household is not None:
         owner_household_name = household.name
     else:
         owner_household_name = None
     msg = UI_pb2.LotDisplayInfo()
     if lot_name is not None:
         msg.lot_name = lot_name
     if owner_household_name is not None:
         msg.household_name = owner_household_name
     zone_modifier_display_infos = services.get_zone_modifier_service(
     ).get_zone_modifier_display_infos(self.zone_id)
     for display_info in zone_modifier_display_infos:
         msg.icon_infos.append(
             create_icon_info_msg(
                 IconInfoData(
                     icon_resource=display_info.zone_modifier_icon)))
     op = distributor.shared_messages.create_message_op(
         msg, Consts_pb2.MSG_UI_LOT_DISPLAY_INFO)
     Distributor.instance().add_op_with_no_owner(op)
예제 #15
0
 def create_situation(self,
                      situation_type,
                      guest_list=None,
                      user_facing=True,
                      duration_override=None,
                      custom_init_writer=None,
                      zone_id=0,
                      scoring_enabled=True,
                      spawn_sims_during_zone_spin_up=False,
                      creation_source=None,
                      travel_request_kwargs=frozendict(),
                      linked_sim_id=GLOBAL_SITUATION_LINKED_SIM_ID,
                      scheduled_time=None,
                      **extra_kwargs):
     zone = services.current_zone()
     if zone.is_zone_shutting_down:
         return
     current_zone_id = services.current_zone_id()
     situation_type = services.narrative_service(
     ).get_possible_replacement_situation(situation_type)
     if services.get_zone_modifier_service().is_situation_prohibited(
             zone_id if zone_id else current_zone_id, situation_type):
         return
     if guest_list is None:
         guest_list = SituationGuestList()
     hire_cost = guest_list.get_hire_cost()
     host_sim_info = guest_list.host_sim_info
     if host_sim_info is not None and not host_sim_info.household.funds.try_remove(
             situation_type.cost() + hire_cost,
             Consts_pb2.TELEMETRY_EVENT_COST, host_sim_info):
         return
     situation_id = id_generator.generate_object_id()
     self._send_create_situation_telemetry(situation_type, situation_id,
                                           guest_list, hire_cost, zone_id)
     if zone_id and zone_id != current_zone_id and scheduled_time is None:
         return self._create_situation_and_travel(
             situation_type,
             situation_id,
             guest_list,
             user_facing,
             duration_override,
             custom_init_writer,
             zone_id,
             scoring_enabled=scoring_enabled,
             creation_source=creation_source,
             linked_sim_id=linked_sim_id,
             travel_request_kwargs=travel_request_kwargs)
     situation_seed = SituationSeed(
         situation_type,
         SeedPurpose.NORMAL,
         situation_id,
         guest_list,
         user_facing=user_facing,
         duration_override=duration_override,
         zone_id=zone_id,
         scoring_enabled=scoring_enabled,
         spawn_sims_during_zone_spin_up=spawn_sims_during_zone_spin_up,
         creation_source=creation_source,
         linked_sim_id=linked_sim_id,
         **extra_kwargs)
     if custom_init_writer is not None:
         situation_seed.setup_for_custom_init_params(custom_init_writer)
     return_id = None
     if scheduled_time is not None:
         uid = services.drama_scheduler_service().schedule_node(
             self.DEFAULT_PLAYER_PLANNED_DRAMA_NODE,
             SingleSimResolver(guest_list.host_sim.sim_info),
             specific_time=scheduled_time,
             situation_seed=situation_seed)
         return_id = situation_id if uid is not None else None
     else:
         return_id = self.create_situation_from_seed(situation_seed)
     return return_id
예제 #16
0
 def get_current_zone_traits():
     return services.get_zone_modifier_service().get_zone_modifiers(
         services.current_zone_id(), force_refresh=True)
예제 #17
0
 def get_lot_traits(lot_id: int) -> Tuple[ZoneModifier]:
     """
         Retrieve the Lot Traits of a Lot with the specified identifier.
     """
     return tuple(
         services.get_zone_modifier_service().get_zone_modifiers(lot_id))
예제 #18
0
 def on_enter(self):
     super().on_enter()
     zone_modifier_service = services.get_zone_modifier_service()
     if zone_modifier_service:
         zone_modifier_service.spin_up()
     return _ZoneSpinUpStateResult.DONE
예제 #19
0
def set_build_eco_effects_enabled(enabled: bool = True, _connection=None):
    zone_modifier_service = services.get_zone_modifier_service()
    zone_modifier_service.set_build_eco_effects_enabled(enabled)