def on_setup_game(self, game_object):
     for (target_object, parent_slot) in self.objects.items():
         bone_name_hash = None
         slot_types = None
         if isinstance(parent_slot, str):
             bone_name_hash = sims4.hash_util.hash32(parent_slot)
         else:
             slot_types = {parent_slot}
         for runtime_slot in game_object.get_runtime_slots_gen(
                 slot_types=slot_types, bone_name_hash=bone_name_hash):
             valid_object_in_slot = False
             child_objects = runtime_slot.children
             for child in child_objects:
                 if child.definition.id != target_object.id:
                     logger.warn(
                         'Incorrect object {} already in slot {} of game object {}',
                         child, parent_slot, game_object)
                     child.set_parent(None)
                     child.destroy(
                         source=self,
                         cause=
                         'GameComponent: Invalid object in slot being destroyed.'
                     )
                 else:
                     valid_object_in_slot = True
             if not valid_object_in_slot and runtime_slot.is_valid_for_placement(
                     definition=target_object,
                     objects_to_ignore=child_objects):
                 runtime_slot.add_child(create_object(target_object))
             else:
                 logger.warn(
                     "The target object {} slot {} isn't valid for placement",
                     game_object,
                     parent_slot,
                     owner='nbaker')
示例#2
0
 def _spawn_fire(self, transform, routing_surface, run_placement_tests=True):
     if not fire_enabled:
         logger.info('Trying to spawn fire when fire is disabled. Please use |fire.toggle_enabled cheat to turn fire on.')
         return
     if not services.active_lot().is_position_on_lot(transform.translation):
         logger.info('Trying to spawn fire on a lot other than the active lot.')
         return
     if not services.venue_service().venue.allows_fire:
         logger.info("Trying to spawn a fire on a venue that doesn't allow fire.")
         return
     if not (run_placement_tests and self._placement_tests(transform.translation, routing_surface.secondary_id)):
         logger.info('Trying to spawn a fire on a lot at a position that is not valid.')
         return
     fire_object = system.create_object(self.FIRE_OBJECT_DEF)
     fire_object.move_to(transform=transform, routing_surface=routing_surface)
     first_fire_on_lot = False if self._fire_objects else True
     self._fire_objects.add(fire_object)
     fire_object.add_state_changed_callback(self._fire_object_state_changed_callback)
     self.start_objects_burning(fire_object)
     self.add_scorch_mark(fire_object.position, fire_object.location.level)
     self._derail_routing_sims_if_necessary(fire_object)
     if first_fire_on_lot:
         self._start_fire_situations()
         self.activate_fire_alarms()
         self.activate_sprinkler_system()
         self._show_fire_notification()
         self._create_or_replace_scorch_cleanup_alarm()
         services.get_persistence_service().lock_save(self)
         self.register_for_sim_active_lot_status_changed_callback()
     if self._fire_spread_alarm is None:
         time_span = date_and_time.create_time_span(minutes=self.FIRE_SPREAD_INTIAL_TIME_IN_SIM_MINUTES)
         repeating_time_span = date_and_time.create_time_span(minutes=self.FIRE_SPREAD_REPEATING_TIME_IN_SIM_MINUTES)
         self._fire_spread_alarm = alarms.add_alarm(self, time_span, self._fire_spread_alarm_callback, repeating=True, repeating_time_span=repeating_time_span)
 def setup_game(self):
     self.requires_setup = False
     if self.target_object is not None:
         return
     if gsi_handlers.game_component_handlers.game_log_archiver.enabled:
         setup_str = 'Game ' + str(self.current_game) + ' has been set up'
         gsi_handlers.game_component_handlers.archive_game_log_entry(
             self.target_object, setup_str)
     self.clear_scores()
     slot_hash = None
     alternate_target_object = self.current_game.alternate_target_object
     parent_slot = alternate_target_object.parent_slot
     if isinstance(parent_slot, str):
         slot_hash = sims4.hash_util.hash32(parent_slot)
     for child in get_child_objects(self.owner):
         while child.definition is alternate_target_object.target_game_object:
             slot = child.parent_slot
             if slot_hash is not None:
                 if slot_hash == slot.slot_name_hash:
                     self.target_object = child
                     return
                     if parent_slot in slot.slot_types:
                         self.target_object = child
                         return
             elif parent_slot in slot.slot_types:
                 self.target_object = child
                 return
     created_object = create_object(
         alternate_target_object.target_game_object)
     self.target_object = created_object
     self.owner.slot_object(parent_slot=parent_slot,
                            slotting_object=created_object)
 def create_spawned_object(cls,
                           inst,
                           mother,
                           definition,
                           loc_type=ItemLocation.ON_LOT):
     scale = GardeningTuning.SCALE_COMMODITY.default_value
     child = None
     try:
         child = create_object(definition, loc_type=loc_type)
         gardening_component = child.get_component(
             types.GARDENING_COMPONENT)
         if not gardening_component.is_shoot and mother.has_state(
                 GardeningTuning.QUALITY_STATE_VALUE):
             quality_state = mother.get_state(
                 GardeningTuning.QUALITY_STATE_VALUE)
             child.set_state(quality_state.state, quality_state)
             scale *= GardeningTuning.SCALE_VARIANCE.random_float()
             child.set_stat_value(GardeningTuning.SCALE_COMMODITY, scale)
         mother.spawner_component._spawned_objects.add(child)
     except:
         logger.exception('Failed to spawn.')
         if child is not None:
             child.destroy(source=mother,
                           cause='Exception spawning child fruit.')
             child = None
     return child
示例#5
0
 def on_choice_selected(self, choice_tag, **kwargs):
     mother = choice_tag
     if mother is None:
         return
     father = self.target
     transferable_states = {}
     for state in self._combine_data.states_to_combine:
         mother_state = mother.get_state(state)
         father_state = father.get_state(state)
         transferable_states[state] = [mother_state, father_state]
         for combine_data in self._combine_data.combination_mapping:
             if combine_data.father_state == father_state and combine_data.mother_state == mother_state:
                 transferable_states[state].append(
                     combine_data.resulting_state)
     if not transferable_states:
         logger.error(
             'CollectionPickerInteraction: {} and {} collectibles have no transferable states',
             mother,
             father,
             owner='camilogarcia')
         return
     states_to_transfer = []
     for states in transferable_states.values():
         states_to_transfer.append(sims4.random.random.choice(states))
     target_match = len(states_to_transfer)
     possible_outcomes = []
     for collectable in self._collectible_data:
         match = 0
         for target_states in collectable.collectable_item.cls._components.state._tuned_values.states:
             if target_states.default_value in states_to_transfer:
                 match += 1
         if match == target_match:
             possible_outcomes.append(collectable.collectable_item)
     if not possible_outcomes:
         logger.error(
             'CollectionPickerInteraction: No possible result when combining  {} and {}',
             mother,
             father,
             owner='camilogarcia')
         return
     definition_to_create = sims4.random.random.choice(possible_outcomes)
     obj = create_object(definition_to_create)
     if obj is None:
         logger.error(
             'CollectionPickerInteraction: Failed to create object when combining  {} and {}',
             mother,
             father,
             owner='camilogarcia')
         return
     obj.update_ownership(self.sim.sim_info)
     if not self.sim.inventory_component.player_try_add_object(obj):
         obj.set_household_owner_id(services.active_household_id())
         if not build_buy.move_object_to_household_inventory(
                 obj,
                 object_location_type=ObjectOriginLocation.SIM_INVENTORY):
             logger.error(
                 'CollectionPickerInteraction: Failed to add object {} to household inventory.',
                 obj,
                 owner='rmccord')
     self._push_continuation(obj)
示例#6
0
def purchase_to_inventory(inventory_obj,
                          def_id: str = None,
                          mailman_purchase: bool = False,
                          _connection=None):
    definition_manager = services.definition_manager()
    definition = definition_manager.get(def_id)
    if definition is None:
        return False
    client = services.client_manager().get(_connection)
    if client is None:
        return False
    household = client.household
    price = definition.price
    if household.funds.money < price:
        return False
    if mailman_purchase:
        obj = services.active_lot().create_object_in_hidden_inventory(
            definition)
    else:
        inventory = inventory_obj.get_target().inventory_component
        if inventory is None:
            return False
        obj = create_object(definition)
        if obj is None:
            return False
        if not inventory.player_try_add_object(obj):
            obj.destroy(source=inventory,
                        cause='Failed to purchase object into inventory')
            return False
    obj.set_household_owner_id(household.id)
    obj.try_post_bb_fixup(force_fixup=True,
                          active_household_id=services.active_household_id())
    household.funds.remove(price, Consts_pb2.TELEMETRY_OBJECT_BUY)
    return True
示例#7
0
    def on_zone_load(self):
        global _ocean_object
        if _ocean_object is None:
            beach_locator_def = OceanTuning.get_beach_locator_definition()
            if beach_locator_def is None:
                return
            locator_manager = services.locator_manager()
            locators = locator_manager.get(beach_locator_def.id)
            if not locators:
                return

            def move_ocean(ocean):
                zone = services.current_zone()
                terrain_center = zone.lot.center
                location = sims4.math.Location(
                    sims4.math.Transform(
                        translation=terrain_center,
                        orientation=sims4.math.Quaternion.IDENTITY()),
                    routing_surface=SurfaceIdentifier(
                        zone.id, 0, SurfaceType.SURFACETYPE_WORLD))
                ocean.location = location

            from objects.system import create_object
            _ocean_object = create_object(
                TerrainService.OCEAN_DEFINITION,
                post_add=move_ocean,
                loc_type=ItemLocation.FROM_OPEN_STREET)
示例#8
0
 def _create_automatic_objects(self, venue_tuning):
     zone = services.current_zone()
     for tag_pair in venue_tuning.automatic_objects:
         try:
             existing_objects = set(
                 zone.object_manager.get_objects_with_tag_gen(tag_pair.tag))
             while not existing_objects:
                 obj = create_object(tag_pair.default_value)
                 position = zone.lot.corners[1]
                 position += vector_normalize(zone.lot.position - position)
                 fgl_context = FindGoodLocationContext(
                     starting_position=position,
                     object_id=obj.id,
                     ignored_object_ids=(obj.id, ),
                     search_flags=placement.FGLSearchFlagsDefault
                     | placement.FGLSearchFlag.SHOULD_TEST_BUILDBUY,
                     object_footprints=(obj.get_footprint(), ))
                 (position, orientation) = find_good_location(fgl_context)
                 if position is not None:
                     obj.location = sims4.math.Location(
                         sims4.math.Transform(position, orientation),
                         routing.SurfaceIdentifier(
                             zone.id, 0, routing.SURFACETYPE_WORLD))
                 else:
                     obj.destroy(
                         source=zone,
                         cause=
                         'Failed to place automatic object required by venue.'
                     )
         except:
             logger.error(
                 'Automatic object {} could not be created in venue {} (zone: {}).',
                 obj_definition, venue_tuning, zone)
 def _germinate(self):
     plant = None
     try:
         plant = create_object(self.plant)
         location = self._find_germinate_location(plant)
         if location is None:
             logger.warn('Failed to germinate: No location found')
             plant.destroy(source=self.owner, cause='Failed to germinate: No location found')
             plant = None
             return False
         if self.owner.parent_slot is not None:
             self.owner.parent_slot.add_child(plant)
         else:
             plant.location = location
         plant.gardening_component.add_fruit(self.owner, sprouted_from=True)
         created_object_quality = self.owner.get_state(GardeningTuning.QUALITY_STATE_VALUE)
         current_household = services.owning_household_of_active_lot()
         if current_household is not None:
             plant.set_household_owner_id(current_household.id)
             services.get_event_manager().process_events_for_household(test_events.TestEvent.ItemCrafted, current_household, crafted_object=plant, skill=None, quality=created_object_quality, masterwork=None)
         if self.owner.in_use:
             self.owner.transient = True
         else:
             self.owner.destroy(source=self.owner, cause='Successfully germinated.')
             return
     except:
         logger.exception('Failed to germinate.')
         if plant is not None:
             plant.destroy(source=self.owner, cause='Failed to germinate.')
             plant = None
             return False
     return plant
def purchase_to_inventory(inventory_obj, def_id:str=None, mailman_purchase:bool=False, _connection=None):
    definition_manager = services.definition_manager()
    definition = definition_manager.get(def_id)
    if definition is None:
        return False
    client = services.client_manager().get(_connection)
    if client is None:
        return False
    household = client.household
    price = definition.price
    if household.funds.money < price:
        return False
    if mailman_purchase:
        obj = services.active_lot().create_object_in_hidden_inventory(definition)
    else:
        inventory = inventory_obj.get_target().inventory_component
        if inventory is None:
            return False
        obj = create_object(definition)
        if obj is None:
            return False
        if not inventory.player_try_add_object(obj):
            obj.destroy(source=inventory, cause='Failed to purchase object into inventory')
            return False
    obj.set_household_owner_id(household.id)
    obj.try_post_bb_fixup(force_fixup=True, active_household_id=services.active_household_id())
    household.funds.remove(price, Consts_pb2.TELEMETRY_OBJECT_BUY)
    return True
示例#11
0
def create_and_place_baby(sim_info, **kwargs):
    bassinet = create_object(Baby.get_default_baby_def(), obj_id=sim_info.sim_id)
    bassinet.set_sim_info(sim_info, **kwargs)

    def try_to_place_bassinet(position, **kwargs):
        fgl_context = placement.FindGoodLocationContext(starting_position=position, object_id=sim_info.sim_id, search_flags=placement.FGLSearchFlagsDefault | placement.FGLSearchFlag.SHOULD_TEST_BUILDBUY, object_footprints=(bassinet.get_footprint(),), **kwargs)
        (translation, orientation) = placement.find_good_location(fgl_context)
        if translation is not None and orientation is not None:
            bassinet.move_to(translation=translation, orientation=orientation)
            return True
        return False

    lot = services.active_lot()
    for tag in Baby.BABY_PLACEMENT_TAGS:
        for (attempt, obj) in enumerate(services.object_manager().get_objects_with_tag_gen(tag)):
            position = obj.position
            if lot.is_position_on_lot(position) and try_to_place_bassinet(position, max_distance=10):
                return
            while attempt >= Baby.MAX_PLACEMENT_ATTEMPTS:
                break
    position = lot.get_default_position()
    if not try_to_place_bassinet(position):
        bassinet.update_ownership(sim_info, make_sim_owner=False)
        build_buy.move_object_to_household_inventory(bassinet)
        if sim_info.is_selectable:
            failed_placement_notification = Baby.FAILED_PLACEMENT_NOTIFICATION(sim_info, SingleSimResolver(sim_info))
            failed_placement_notification.show_dialog()
示例#12
0
def _replace_bassinet(sim_info, bassinet=None):
    bassinet = bassinet if bassinet is not None else services.object_manager().get(sim_info.sim_id)
    if bassinet is not None:
        empty_bassinet = create_object(Baby.get_corresponding_definition(bassinet.definition))
        empty_bassinet.location = bassinet.location
        bassinet.destroy(source=sim_info, cause='Replaced bassinet with empty version')
        return empty_bassinet
示例#13
0
 def setup_game(self):
     self.requires_setup = False
     if self.target_object is not None:
         return
     if gsi_handlers.game_component_handlers.game_log_archiver.enabled:
         setup_str = 'Game ' + str(self.current_game) + ' has been set up'
         gsi_handlers.game_component_handlers.archive_game_log_entry(self.target_object, setup_str)
     self.clear_scores()
     slot_hash = None
     alternate_target_object = self.current_game.alternate_target_object
     parent_slot = alternate_target_object.parent_slot
     if isinstance(parent_slot, str):
         slot_hash = sims4.hash_util.hash32(parent_slot)
     for child in get_child_objects(self.owner):
         while child.definition is alternate_target_object.target_game_object:
             slot = child.parent_slot
             if slot_hash is not None:
                 if slot_hash == slot.slot_name_hash:
                     self.target_object = child
                     return
                     if parent_slot in slot.slot_types:
                         self.target_object = child
                         return
             elif parent_slot in slot.slot_types:
                 self.target_object = child
                 return
     created_object = create_object(alternate_target_object.target_game_object)
     self.target_object = created_object
     self.owner.slot_object(parent_slot=parent_slot, slotting_object=created_object)
示例#14
0
def debug_create_baby(actor_sim, position, gender, routing_surface=None):
    baby = None
    try:
        actor_sim_info = actor_sim.sim_info
        account = actor_sim.sim_info.account
        sim_creator = SimCreator(gender=gender, age=Age.BABY, first_name=SimSpawner.get_random_first_name(account, gender == Gender.FEMALE), last_name=SimSpawner.get_family_name_for_gender(account, actor_sim.last_name, gender == Gender.FEMALE))
        (sim_info_list, _) = SimSpawner.create_sim_infos((sim_creator,), household=actor_sim_info.household, account=account, zone_id=actor_sim_info.zone_id, creation_source='cheat: debug_create_baby')
        sim_info = sim_info_list[0]
        baby_def = Baby.get_default_baby_def()
        baby = create_object(baby_def, sim_info.sim_id)
        baby.set_sim_info(sim_info)
        fgl_context = placement.FindGoodLocationContext(starting_position=position, object_id=baby.id, search_flags=placement.FGLSearchFlagsDefault, object_footprints=(baby.get_footprint(),))
        (trans, orient) = placement.find_good_location(fgl_context)
        if trans is not None:
            baby.location = sims4.math.Location(sims4.math.Transform(trans, orient), routing_surface)
        client = services.client_manager().get_client_by_household_id(sim_info.household_id)
        while client is not None:
            client.selectable_sims.add_selectable_sim_info(sim_info)
    except Exception as e:
        logger.exception('Create baby fail', e)
        if actor_sim_info.household.sim_in_household(sim_info.sim_id):
            actor_sim_info.household.remove_sim_info(sim_info)
        client = services.client_manager().get_client_by_household_id(sim_info.household_id)
        if client is not None:
            client.selectable_sims.remove_selectable_sim_info(sim_info)
        while baby is not None:
            baby.destroy(source=actor_sim, cause='Create baby fail')
 def _create(_):
     self._object = create_object(self.def_id, **self.create_kwargs)
     if self._object is None:
         return False
     if self.sim is not None and self._reserver is not None:
         self.object.reserve(self.sim, self._reserver)
     return True
示例#16
0
 def create_object_in_hidden_inventory(self, definition_id):
     inventory = self.get_hidden_inventory()
     obj = create_object(definition_id, loc_type=ItemLocation.OBJECT_INVENTORY)
     try:
         inventory.system_add_object(obj, None)
         return obj
     except:
         obj.destroy(source=self, cause='Failed to place object in hidden inventory.')
示例#17
0
def _replace_bassinet_for_age_up(sim_info):
    bassinet = services.object_manager().get(sim_info.sim_id)
    if bassinet is not None:
        new_bassinet = create_object(bassinet.definition)
        new_bassinet.location = bassinet.location
        new_bassinet.set_sim_info(bassinet.sim_info)
        new_bassinet.copy_state_values(bassinet, state_list=Baby.BABY_AGE_UP.copy_states)
        bassinet.destroy(source=sim_info, cause='Replacing bassinet for age up.')
        return new_bassinet
 def create_spawned_object(cls,
                           inst,
                           spawner_object,
                           definition,
                           loc_type=ItemLocation.ON_LOT):
     obj = create_object(definition, loc_type=loc_type)
     if obj is not None:
         spawner_object.spawner_component._spawned_objects.add(obj)
     return obj
示例#19
0
def create_and_place_baby(sim_info,
                          position=None,
                          routing_surface=None,
                          **kwargs):
    bassinet = create_object(BabyTuning.get_default_definition(sim_info),
                             obj_id=sim_info.sim_id)
    bassinet.set_sim_info(sim_info, **kwargs)
    bassinet.place_in_good_location(position=position,
                                    routing_surface=routing_surface)
    sim_info.suppress_aging()
 def _create_object_rewards(self, obj_weight_pair, obj_counter, resolver):
     obj_result = weighted_random_item(obj_weight_pair)
     for obj_reward in obj_result:
         created_obj = create_object(
             obj_reward,
             init=None,
             post_add=lambda *args: self._place_object(resolver=resolver,
                                                       *args))
         while created_obj is not None:
             obj_counter[obj_reward] += 1
示例#21
0
def _replace_bassinet(sim_info, bassinet=None):
    bassinet = bassinet if bassinet is not None else services.object_manager(
    ).get(sim_info.sim_id)
    if bassinet is not None:
        empty_bassinet = create_object(
            Baby.get_corresponding_definition(bassinet.definition))
        empty_bassinet.location = bassinet.location
        bassinet.destroy(source=sim_info,
                         cause='Replaced bassinet with empty version')
        return empty_bassinet
示例#22
0
 def create_object(self):
     created_object = create_object(self.definition,
                                    init=self._setup_created_object,
                                    post_add=self._place_object)
     if self._placement_failed:
         created_object.destroy(
             source=self.interaction,
             cause='Failed to place object created by basic extra.')
         return
     return created_object
示例#23
0
 def create_object_in_hidden_inventory(self, definition_id):
     inventory = self.get_hidden_inventory()
     obj = create_object(definition_id,
                         loc_type=ItemLocation.OBJECT_INVENTORY)
     try:
         inventory.system_add_object(obj, None)
         return obj
     except:
         obj.destroy(source=self,
                     cause='Failed to place object in hidden inventory.')
示例#24
0
    def __call__(self, sim):
        def _abort(vehicle_obj):
            sim.allow_opacity_change = True
            sim.fade_in()
            if vehicle_obj is not None:
                vehicle_obj.destroy()

        vehicle = None
        if sim.sim_info.favorites_tracker is not None:
            favorites_tracker = sim.sim_info.favorites_tracker
            definition_manager = services.definition_manager()
            vehicle_def_id = favorites_tracker.get_favorite_definition_id(
                self.vehicle_obj_tag)
            if vehicle_def_id is not None:
                vehicle_def = definition_manager.get(vehicle_def_id)
                if vehicle_def is not None:
                    vehicle = objects.system.create_object(vehicle_def)
        if vehicle is None:
            if self.fallback_vehicle_def is None:
                _abort(vehicle)
                return True
            vehicle = create_object(self.fallback_vehicle_def)
            if vehicle is None:
                _abort(vehicle)
                return True
        vehicle.set_household_owner_id(sim.household_id)
        starting_location = placement.create_starting_location(
            position=sim.position)
        fgl_context = placement.create_fgl_context_for_object(
            starting_location, vehicle)
        (position, orientation) = placement.find_good_location(fgl_context)
        if position is None or orientation is None:
            _abort(vehicle)
            return True
        vehicle.transform = sims4.math.Transform(position, orientation)
        result = vehicle.vehicle_component.push_drive_affordance(
            sim, priority=Priority.Critical)
        if result is None:
            _abort(vehicle)
            return True
        if result.interaction is None:
            logger.warn(
                "Vehicle's push drive affordance {} resulted in a None interaction. Result: {}.",
                vehicle.vehicle_component.drive_affordance,
                result,
                owner='jmorrow')
            _abort(vehicle)
            return True
        sim.fade_in()
        vehicle.claim()
        for situation in services.get_zone_situation_manager().get_all():
            if sim in situation.all_sims_in_situation_gen():
                situation.manage_vehicle(vehicle)
                break
        return True
示例#25
0
def _replace_bassinet_for_age_up(sim_info):
    bassinet = services.object_manager().get(sim_info.sim_id)
    if bassinet is not None:
        new_bassinet = create_object(bassinet.definition)
        new_bassinet.location = bassinet.location
        new_bassinet.set_sim_info(bassinet.sim_info)
        new_bassinet.copy_state_values(bassinet,
                                       state_list=Baby.BABY_AGE_UP.copy_states)
        bassinet.destroy(source=sim_info,
                         cause='Replacing bassinet for age up.')
        return new_bassinet
示例#26
0
 def _add_starting_objects(self):
     for definition in self._starting_objects:
         if self._inventory.has_item_with_definition(definition):
             pass
         new_object = create_object(definition)
         if not new_object:
             logger.error('Failed to create object {}', definition)
         if not self.player_try_add_object(new_object):
             logger.error('Failed to add object {} to inventory {}', new_object, self)
             new_object.destroy(source=self.owner, cause='Failed to add starting object to inventory.')
         new_object.set_household_owner_id(self.owner.get_household_owner_id())
 def _add_starting_objects(self):
     for definition in self.starting_objects:
         if self.has_item_with_definition(definition):
             continue
         new_object = create_object(definition, loc_type=ItemLocation.OBJECT_INVENTORY)
         if new_object is None:
             logger.error('Failed to create object {}', definition)
         else:
             new_object.set_household_owner_id(self.owner.get_household_owner_id())
             if not self.player_try_add_object(new_object):
                 logger.error('Failed to add object {} to inventory {}', new_object, self)
                 new_object.destroy(source=self.owner, cause='Failed to add starting object to inventory.')
示例#28
0
 def _pre_perform(self, *args, **kwargs):
     bassinet_def = BabyTuning.get_corresponding_definition(
         self.bassinet_to_use)
     self._bassinet = create_object(bassinet_def)
     surgery_table = self.get_participant(
         self.surgery_table_participant_type)
     if surgery_table is None:
         logger.error('No surgery table found for {}', self, owner='tastle')
         return False
     surgery_table.part_owner.slot_object(self.bassinet_slot_type,
                                          self._bassinet)
     return True
示例#29
0
def create_and_add_object_to_inventory(to_inventory_object_id:RequiredTargetParam, definition_id:int, _connection=None):
    to_inventory_owner = to_inventory_object_id.get_target()
    to_inventory = to_inventory_owner.inventory_component
    if to_inventory is None:
        sims4.commands.output('to inventory object does not have an inventory component: {}'.format(to_inventory_owner), _connection)
        return False
    obj = create_object(definition_id)
    if not to_inventory.player_try_add_object(obj):
        sims4.commands.output('object failed to be placed into inventory: {}'.format(obj), _connection)
        obj.destroy(source=to_inventory, cause='object failed to be placed into inventory')
        return False
    sims4.commands.output('object {} placed into inventory'.format(obj), _connection)
    return True
示例#30
0
 def _return_lost_object(self, locator):
     sim_info = services.sim_info_manager().get(locator.sim_id)
     object_id = locator.object_data.object_id
     if sim_info is not None and sim_info.is_instanced():
         if sim_info.zone_id != locator.zone_id and not self._any_household_member_on_lot(
                 locator.zone_id, sim_info.household.id, sim_info.id):
             sim = sim_info.get_sim_instance(
                 allow_hidden_flags=ALL_HIDDEN_REASONS)
             if sim is None:
                 return (None, None)
             obj = create_object(locator.object_data.guid,
                                 loc_type=ItemLocation.SIM_INVENTORY)
             if obj is not None:
                 obj.attributes = locator.object_data.SerializeToString()
                 obj.scale = locator.object_data.scale
                 if sim.inventory_component.player_try_add_object(obj):
                     obj.update_ownership(sim_info)
                     self.remove_object(object_id)
                     self.add_clone_id(locator.zone_id,
                                       locator.open_street_id, object_id)
                     return (obj, sim)
                 obj.destroy(
                     source=self,
                     cause='Failed to add object to Sim Inv, try later')
                 return (None, None)
     elif sim_info is None and not self._any_household_member_on_lot(
             locator.zone_id, locator.household_id, locator.sim_id):
         obj = create_object(locator.object_data.guid,
                             loc_type=ItemLocation.HOUSEHOLD_INVENTORY)
         if obj is not None:
             obj.attributes = locator.object_data.SerializeToString()
             obj.scale = locator.object_data.scale
             if build_buy.move_object_to_household_inventory(
                     obj, HouseholdInventoryFlags.FORCE_OWNERSHIP):
                 self.remove_object(object_id)
                 self.add_clone_id(locator.zone_id, locator.open_street_id,
                                   object_id)
                 return (obj, locator.household_id)
     return (None, None)
示例#31
0
 def create_object_in_mailbox(self, definition_id, household_id):
     inventory = self.get_mailbox_inventory(household_id)
     if inventory is None:
         return
     obj = create_object(definition_id,
                         loc_type=ItemLocation.OBJECT_INVENTORY)
     if household_id is not None:
         obj.set_household_owner_id(household_id)
     try:
         inventory.system_add_object(obj)
         return obj
     except:
         obj.destroy(source=self,
                     cause='Failed to place object in mailbox.')
示例#32
0
 def _try_create_in_sim_inventory(
         self,
         sim_info,
         obj=None,
         force_rewards_to_sim_info_inventory=False):
     sim = sim_info.get_sim_instance(allow_hidden_flags=ALL_HIDDEN_REASONS)
     if sim is None:
         if force_rewards_to_sim_info_inventory:
             obj = create_object(self._definition) if obj is None else obj
             return sim_info.try_add_object_to_inventory_without_component(
                 obj)
         return (False, None)
     obj = create_object(self._definition) if obj is None else obj
     if obj is None:
         logger.error(
             'Trying to give an object reward to a Sim, {}, and the object created was None. Definition: {}',
             sim_info, self._definition)
         return (False, None)
     result = sim.inventory_component.player_try_add_object(obj)
     if not result:
         return (False, obj)
     obj.update_ownership(sim_info)
     return (True, obj)
示例#33
0
 def open_reward(self, sim_info, is_household):
     obj = create_object(self._definition)
     if obj is None:
         logger.error('Trying to give an object reward to a Sim, {}, and the object created was None. Definition: {}'.format(sim_info, self._definition), owner='trevorlindsey')
         return
     if not is_household:
         sim = sim_info.get_sim_instance(allow_hidden_flags=ALL_HIDDEN_REASONS)
         if sim is None:
             logger.warn("Trying to give a sim an object, but the sim isn't instantiated. Adding object to household inventory instead", owner='trevorlindsey')
         elif sim.inventory_component.player_try_add_object(obj):
             obj.update_ownership(sim_info)
             return
     obj.update_ownership(sim_info, make_sim_owner=False)
     obj.set_post_bb_fixup_needed()
     build_buy.move_object_to_household_inventory(obj)
示例#34
0
def replace_bassinet(sim_info, bassinet=None, safe_destroy=False):
    bassinet = bassinet if bassinet is not None else services.object_manager(
    ).get(sim_info.sim_id)
    if bassinet is not None:
        empty_bassinet = create_object(
            BabyTuning.get_corresponding_definition(bassinet.definition))
        empty_bassinet.location = bassinet.location
        if safe_destroy:
            bassinet.make_transient()
        else:
            bassinet.reset(ResetReason.RESET_EXPECTED, None,
                           'Replacing Bassinet with child')
            bassinet.destroy(source=sim_info,
                             cause='Replaced bassinet with empty version')
        return empty_bassinet
示例#35
0
 def _create_and_establish_familiar_link(self):
     sim = self._owner.get_sim_instance(allow_hidden_flags=ALL_HIDDEN_REASONS_EXCEPT_UNINITIALIZED)
     if sim is None:
         return
     familiar_type = self._familiars[self._active_familiar_id].familiar_type
     familiar_data = FamiliarTracker.FAMILIAR_DATA[familiar_type]
     if familiar_data.familiar_type is None:
         try:
             self._active_familiar_obj_id = self._familiars[self._active_familiar_id].pet_familiar_id
             pet_familiar_sim_info = services.sim_info_manager().get(self._active_familiar_obj_id)
             buff_info_to_add = self.PET_FAMILIAR_BUFF[pet_familiar_sim_info.age][pet_familiar_sim_info.extended_species]
             self._pet_buff_handle = pet_familiar_sim_info.add_buff(buff_info_to_add.buff_type, buff_reason=buff_info_to_add.buff_reason)
             pet_familiar = services.object_manager().get(self._active_familiar_obj_id)
             if services.current_zone().is_zone_running:
                 if pet_familiar is None:
                     services.current_zone().venue_service.active_venue.summon_npcs((pet_familiar_sim_info,), NPCSummoningPurpose.BRING_PLAYER_SIM_TO_LOT)
                 else:
                     context = InteractionContext(pet_familiar, InteractionContext.SOURCE_SCRIPT, Priority.Critical, insert_strategy=QueueInsertStrategy.NEXT)
                     pet_familiar.push_super_affordance(FamiliarTracker.PET_FAMILIAR_SET_ACTIVE_AFFORDANCE, None, context)
         except Exception as e:
             self._on_familiar_summon_failure('Exception encountered when trying to create familiar.  Deactivating familiar.', familiar_object=pet_familiar, exc=e)
         if self._sim_buff_handle is None:
             self._sim_buff_handle = self._owner.add_buff(self.ACTIVE_FAMILIAR_BUFF.buff_type, buff_reason=self.ACTIVE_FAMILIAR_BUFF.buff_reason)
         return
     familiar = services.object_manager().get(self._active_familiar_obj_id)
     if familiar is None:
         try:
             familiar_obj_def = familiar_data.familiar_type.familiar_object
             familiar = create_object(familiar_obj_def)
             if familiar is None:
                 self._on_familiar_summon_failure('Failure to create familiar object.  Deactivating familiar.')
                 return
             resolver = SingleSimResolver(self._owner)
             if not FamiliarTracker.FAMILIAR_PLACEMENT.try_place_object(familiar, resolver):
                 self._on_familiar_summon_failure('Failure to create familiar object.  Deactivating familiar.', familiar_object=familiar, warn=True)
                 return
             self._active_familiar_obj_id = familiar.id
         except Exception as e:
             self._on_familiar_summon_failure('Exception encountered when trying to create familiar.  Deactivating familiar.', familiar_object=familiar, exc=e)
             return
     context = InteractionContext(sim, InteractionSource.SCRIPT, Priority.Critical, insert_strategy=QueueInsertStrategy.NEXT)
     result = sim.push_super_affordance(familiar_data.familiar_type.follow_affordance, familiar, context)
     if not result:
         self._on_familiar_summon_failure('Failed to push familiar follow interaction.  Deactivating Familiar.', familiar_object=familiar)
         return
     result.interaction.register_on_finishing_callback(self._on_familiar_follow_interaction_finished_prematurely)
     if self._sim_buff_handle is None:
         self._sim_buff_handle = self._owner.add_buff(self.ACTIVE_FAMILIAR_BUFF.buff_type, buff_reason=self.ACTIVE_FAMILIAR_BUFF.buff_reason)
示例#36
0
 def _spawn_sprinkler(self, fire):
     zone_id = sims4.zone_utils.get_zone_id()
     new_level = fire.location.level + 1
     if not build_buy.has_floor_at_location(zone_id, fire.position, new_level):
         return
     sprinkler_object = system.create_object(self.SPRINKLER_HEAD_OBJECT_DEF)
     sprinkler_location = fire.location.duplicate()
     new_translation = sims4.math.Vector3(*fire.position)
     height = terrain.get_lot_level_height(sprinkler_location.transform.translation.x, sprinkler_location.transform.translation.z, new_level, zone_id)
     new_translation.y = height - self.SPRINKLER_HEAD_CEILING_OFFSET
     sprinkler_location.transform = sims4.math.Transform(new_translation, sprinkler_location.transform.orientation)
     sprinkler_object.set_location(location=sprinkler_location)
     self._sprinkler_objects.add(sprinkler_object)
     sprinkler_object.vfx = FireService.SPRINKLER_EFFECT(sprinkler_object)
     sprinkler_object.vfx.start()
     return sprinkler_object
 def create_spawned_object(cls, inst, mother, definition, loc_type=ItemLocation.ON_LOT):
     scale = GardeningTuning.SCALE_COMMODITY.default_value
     child = None
     try:
         child = create_object(definition, loc_type=loc_type)
         while not GardeningTuning.is_shoot(child) and mother.has_state(GardeningTuning.QUALITY_STATE_VALUE):
             quality_state = mother.get_state(GardeningTuning.QUALITY_STATE_VALUE)
             child.set_state(quality_state.state, quality_state)
             scale *= GardeningTuning.SCALE_VARIANCE.random_float()
             child.set_stat_value(GardeningTuning.SCALE_COMMODITY, scale)
     except:
         logger.exception('Failed to spawn.')
         if child is not None:
             child.destroy(source=mother, cause='Exception spawning child fruit.')
             child = None
     return child
示例#38
0
 def _try_create_in_household_inventory(self, sim_info, obj=None):
     obj = create_object(
         self._definition,
         loc_type=ItemLocation.HOUSEHOLD_INVENTORY) if obj is None else obj
     if obj is None:
         logger.error(
             'Trying to give an object reward to a Sim, {}, and the object created was None. Definition: {}',
             sim_info, self._definition)
         return (False, None)
     obj.update_ownership(sim_info, make_sim_owner=False)
     obj.set_post_bb_fixup_needed()
     if not build_buy.move_object_to_household_inventory(obj):
         logger.error(
             'Failed to add reward definition object {} to household inventory.',
             self._definition,
             owner='rmccord')
示例#39
0
 def replace_for_age_up(self, interaction=None):
     if interaction is not None:
         interaction.set_target(None)
     new_bassinet = create_object(self.definition)
     new_bassinet.location = self.location
     self.replacement_bassinet = new_bassinet
     new_bassinet.set_sim_info(self.sim_info)
     new_bassinet.copy_state_values(self,
                                    state_list=Baby.BABY_AGE_UP.copy_states)
     idle_state_value = Baby.BABY_AGE_UP.idle_state_value
     new_bassinet.set_state(idle_state_value.state, idle_state_value)
     if interaction is not None:
         interaction.set_target(new_bassinet)
     self.destroy(source=self.sim_info,
                  cause='Replacing bassinet for age up.')
     return new_bassinet
示例#40
0
 def _create_automatic_objects(self, venue_tuning):
     zone = services.current_zone()
     for tag_pair in venue_tuning.automatic_objects:
         try:
             existing_objects = set(zone.object_manager.get_objects_with_tag_gen(tag_pair.tag))
             while not existing_objects:
                 obj = create_object(tag_pair.default_value)
                 position = zone.lot.corners[1]
                 position += vector_normalize(zone.lot.position - position)
                 fgl_context = FindGoodLocationContext(starting_position=position, object_id=obj.id, ignored_object_ids=(obj.id,), search_flags=placement.FGLSearchFlagsDefault | placement.FGLSearchFlag.SHOULD_TEST_BUILDBUY, object_footprints=(obj.get_footprint(),))
                 (position, orientation) = find_good_location(fgl_context)
                 if position is not None:
                     obj.location = sims4.math.Location(sims4.math.Transform(position, orientation), routing.SurfaceIdentifier(zone.id, 0, routing.SURFACETYPE_WORLD))
                 else:
                     obj.destroy(source=zone, cause='Failed to place automatic object required by venue.')
         except:
             logger.error('Automatic object {} could not be created in venue {} (zone: {}).', obj_definition, venue_tuning, zone)
示例#41
0
def debug_create_baby(actor_sim, position, gender, routing_surface=None):
    baby = None
    try:
        actor_sim_info = actor_sim.sim_info
        account = actor_sim.sim_info.account
        sim_creator = SimCreator(
            gender=gender,
            age=Age.BABY,
            first_name=SimSpawner.get_random_first_name(
                account, gender == Gender.FEMALE),
            last_name=SimSpawner.get_family_name_for_gender(
                account, actor_sim.last_name, gender == Gender.FEMALE))
        (sim_info_list, _) = SimSpawner.create_sim_infos(
            (sim_creator, ),
            household=actor_sim_info.household,
            account=account,
            zone_id=actor_sim_info.zone_id,
            creation_source='cheat: debug_create_baby')
        sim_info = sim_info_list[0]
        baby_def = Baby.get_default_baby_def()
        baby = create_object(baby_def, sim_info.sim_id)
        baby.set_sim_info(sim_info)
        fgl_context = placement.FindGoodLocationContext(
            starting_position=position,
            object_id=baby.id,
            search_flags=placement.FGLSearchFlagsDefault,
            object_footprints=(baby.get_footprint(), ))
        (trans, orient) = placement.find_good_location(fgl_context)
        if trans is not None:
            baby.location = sims4.math.Location(
                sims4.math.Transform(trans, orient), routing_surface)
        client = services.client_manager().get_client_by_household_id(
            sim_info.household_id)
        while client is not None:
            client.selectable_sims.add_selectable_sim_info(sim_info)
    except Exception as e:
        logger.exception('Create baby fail', e)
        if actor_sim_info.household.sim_in_household(sim_info.sim_id):
            actor_sim_info.household.remove_sim_info(sim_info)
        client = services.client_manager().get_client_by_household_id(
            sim_info.household_id)
        if client is not None:
            client.selectable_sims.remove_selectable_sim_info(sim_info)
        while baby is not None:
            baby.destroy(source=actor_sim, cause='Create baby fail')
def purchase_picker_response(inventory_target, mailman_purchase:bool=False, *def_ids_and_amounts, _connection=None):
    total_price = 0
    current_purchased = 0
    objects_to_buy = []
    definition_manager = services.definition_manager()
    for (def_id, amount) in zip(def_ids_and_amounts[::2], def_ids_and_amounts[1::2]):
        definition = definition_manager.get(def_id)
        if definition is None:
            sims4.commands.output('inventory.purchase_picker_response: Definition not found with id {}'.format(def_id), _connection)
            return False
        purchase_price = definition.price*amount
        total_price += purchase_price
        objects_to_buy.append((definition, amount))
    client = services.client_manager().get(_connection)
    if client is None:
        sims4.commands.output('inventory.purchase_picker_response: No client found to make purchase.', _connection)
        return False
    household = client.household
    if household.funds.money < total_price:
        sims4.commands.output('inventory.purchase_picker_response: Insufficient funds for household to purchase items.', _connection)
        return False
    if mailman_purchase:
        inventory = services.active_lot().get_hidden_inventory()
    else:
        inventory_owner = inventory_target.get_target()
        inventory = inventory_owner.inventory_component
    if inventory is None:
        sims4.commands.output('inventory.purchase_picker_response: Inventory not found for items to be purchased into.', _connection)
        return False
    for (definition, amount) in objects_to_buy:
        obj = create_object(definition)
        if obj is None:
            sims4.commands.output('inventory.purchase_picker_response: Failed to create object with definition {}.'.format(definition), _connection)
        obj.set_stack_count(amount)
        if not inventory.player_try_add_object(obj):
            sims4.commands.output('inventory.purchase_picker_response: Failed to add object into inventory: {}'.format(obj), _connection)
            obj.destroy(source=inventory, cause='inventory.purchase_picker_response: Failed to add object into inventory.')
        obj.set_household_owner_id(household.id)
        obj.try_post_bb_fixup(force_fixup=True, active_household_id=services.active_household_id())
        purchase_price = definition.price*amount
        current_purchased += purchase_price
    household.funds.remove(current_purchased, Consts_pb2.TELEMETRY_OBJECT_BUY)
    return True
示例#43
0
def set_baby_sim_info_with_switch_id(bassinet, sim_info):
    if bassinet.id != sim_info.sim_id:
        new_bassinet = None
        try:
            save_data = bassinet.get_attribute_save_data()
            empty_bassinet_def = bassinet.definition
            baby_in_bassinet_def = Baby.get_corresponding_definition(empty_bassinet_def)
            new_bassinet = create_object(baby_in_bassinet_def, obj_id=sim_info.sim_id)
            new_bassinet.load(save_data)
            new_bassinet.location = bassinet.location
        except:
            logger.error('{} fail to set sim_info {}', bassinet, sim_info)
            if new_bassinet is not None:
                new_bassinet.destroy(source=sim_info, cause='Failed to set sim_info on bassinet')
        finally:
            new_bassinet.set_sim_info(sim_info)
            sim_info.supress_aging()
            bassinet.hide(HiddenReasonFlag.REPLACEMENT)
        return new_bassinet
 def on_choice_selected(self, choice_tag, **kwargs):
     mother = choice_tag
     if mother is None:
         return
     father = self.target
     transferable_states = {}
     for state in self._combine_data.states_to_combine:
         mother_state = mother.get_state(state)
         father_state = father.get_state(state)
         transferable_states[state] = [mother_state, father_state]
         for combine_data in self._combine_data.combination_mapping:
             while combine_data.father_state == father_state and combine_data.mother_state == mother_state:
                 transferable_states[state].append(combine_data.resulting_state)
     if not transferable_states:
         logger.error('CollectionPickerInteraction: {} and {} collectibles have no transferable states', mother, father, owner='camilogarcia')
         return
     states_to_transfer = []
     for states in transferable_states.values():
         states_to_transfer.append(sims4.random.random.choice(states))
     target_match = len(states_to_transfer)
     possible_outcomes = []
     for collectable in self._collectible_data:
         match = 0
         for target_states in collectable.collectable_item.cls._components.state._tuned_values.states:
             while target_states.default_value in states_to_transfer:
                 match += 1
         while match == target_match:
             possible_outcomes.append(collectable.collectable_item)
     if not possible_outcomes:
         logger.error('CollectionPickerInteraction: No possible result when combining  {} and {}', mother, father, owner='camilogarcia')
         return
     definition_to_create = sims4.random.random.choice(possible_outcomes)
     obj = create_object(definition_to_create)
     if obj is None:
         logger.error('CollectionPickerInteraction: Failed to create object when combining  {} and {}', mother, father, owner='camilogarcia')
         return
     obj.update_ownership(self.sim.sim_info)
     if not self.sim.inventory_component.player_try_add_object(obj):
         obj.set_household_owner_id(services.active_household_id())
         build_buy.move_object_to_household_inventory(obj, object_location_type=ObjectOriginLocation.SIM_INVENTORY)
     self._push_continuation(obj)
 def create_spawned_object(cls, inst, spawner_object, definition, loc_type=ItemLocation.ON_LOT):
     obj = create_object(definition, loc_type=loc_type)
     if obj is not None:
         spawner_object.spawner_component._spawned_objects.add(obj)
     return obj
示例#46
0
 def age_up_exit_behavior():
     new_bassinet = create_object(Baby.get_corresponding_definition(middle_bassinet.definition))
     new_bassinet.location = middle_bassinet.location
     middle_bassinet.make_transient()
示例#47
0
 def create_object(self):
     created_object = create_object(self.definition, init=self._setup_created_object, post_add=self._place_object)
     if self._placement_failed:
         created_object.destroy(source=self.interaction, cause='Failed to place object created by basic extra.')
         return
     return created_object