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()
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)
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)
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)
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)
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)
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)
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
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
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])
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)
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
def get_current_zone_traits(): return services.get_zone_modifier_service().get_zone_modifiers( services.current_zone_id(), force_refresh=True)
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))
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
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)