def _TakePill ( targetSimHandler: argument_helpers.RequiredTargetParam, pillsObjectHandler: argument_helpers.RequiredTargetParam, requiresPill: bool = True, removePill: bool = True, showGeneralFeedback: bool = True, _connection: int = None) -> None: try: targetSimInfo = targetSimHandler.get_target(services.sim_info_manager()) if not isinstance(targetSimInfo, sim_info.SimInfo): raise ValueError("Failed to get the target sim, %s is not a valid sim id." % targetSimHandler.target_id) pillsObject = services.inventory_manager().get(pillsObjectHandler.target_id) # type: typing.Optional[script_object.ScriptObject] if pillsObject is None: pillsObject = services.object_manager().get(pillsObjectHandler.target_id) # type: typing.Optional[script_object.ScriptObject] if not isinstance(pillsObject, script_object.ScriptObject): raise ValueError("Failed to get the pills object, %s is not a valid script object id." % targetSimHandler.target_id) SafetyEmergencyContraceptivePill.TakePill(targetSimInfo, pillsObject = pillsObject, requiresPill = requiresPill, removePill = removePill, showGeneralFeedback = showGeneralFeedback) except: output = commands.CheatOutput(_connection) output("Failed to run the take pill command for the target sim.") Debug.Log("Failed to run the take pill command for the target sim.", This.Mod.Namespace, Debug.LogLevels.Exception, group = This.Mod.Namespace, owner = __name__)
def load(self, crafting_process_message): recipe_manager = services.get_instance_manager(sims4.resources.Types.RECIPE) self.recipe = recipe_manager.get(crafting_process_message.recipe_id) for phase in self.recipe.phases.values(): if phase.id == crafting_process_message.phase_id: self.phase = phase else: while phase.id == crafting_process_message.previous_phase_id: self._previous_phase = phase current_ico = services.object_manager().get(crafting_process_message.current_ico) if current_ico is None: current_ico = services.inventory_manager().get(crafting_process_message.current_ico) if current_ico is not None: self._current_ico_ref = current_ico.ref() if crafting_process_message.crafter_sim_id != 0: self._crafter_sim_id = crafting_process_message.crafter_sim_id self.add_order(self._crafter_sim_id, self.recipe) if crafting_process_message.HasField('inscription'): self.inscription = crafting_process_message.inscription if crafting_process_message.HasField('crafted_value'): self.crafted_value = crafting_process_message.crafted_value statistic_component = self.get_component(objects.components.types.STATISTIC_COMPONENT) statistic_tracker = statistic_component.get_statistic_tracker() if statistic_tracker is not None: statistic_tracker.load(crafting_process_message.statistic_tracker.statistics)
def _exec_on_objects_in_inventory(self, func): inventory_manager = services.inventory_manager() for obj in inventory_manager.objects: if not self.is_affected_object(obj): continue func( obj.get_component( objects.components.types.INVENTORY_ITEM_COMPONENT))
def get_created_object(self): created_object = None if self._created_object_id is not None: created_object = services.inventory_manager().get( self._created_object_id) if created_object is None: created_object = services.object_manager().get( self._created_object_id) return created_object
def water_scooter(self): water_scooter = None if self._water_scooter_object_id is not None: water_scooter = services.object_manager().get( self._water_scooter_object_id) if water_scooter is None: water_scooter = services.inventory_manager().get( self._water_scooter_object_id) return water_scooter
def _claim_object(cls, obj_id): obj_man = services.object_manager() obj = obj_man.get(obj_id) if obj is None: obj = services.inventory_manager().get(obj_id) if obj is not None: obj.claim() else: obj_man.set_claimed_item(obj_id)
def get_bait(self): if not self.target.has_component(STORED_OBJECT_INFO_COMPONENT): return stored_object_info_component = self.target.get_component( STORED_OBJECT_INFO_COMPONENT) bait_id = stored_object_info_component.get_stored_object_info_id( self.bait_stored_info_category) inventory_manager = services.inventory_manager() bait = inventory_manager.get(bait_id) return bait
def _remove_object(self, obj_id): obj = services.object_manager().get(obj_id) if obj is None: obj = services.inventory_manager().get(obj_id) if obj is None: logger.error( '{} cannot remove object. Object with id {} is not in Object or Inventory Manager', type(self), obj_id) return obj.make_transient()
def save(self): data = SimObjectAttributes_pb2.PersistableFavoritesTracker() if self._favorites is not None: for (tag, (object_id, object_def_id)) in self._favorites.items(): with ProtocolBufferRollback(data.favorites) as entry: entry.favorite_type = tag if object_id is not None: entry.favorite_id = object_id if object_def_id is not None: entry.favorite_def_id = object_def_id if not len(self._favorite_stacks): return data sim = self._owner.get_sim_instance() if sim is None: logger.warn( 'Failed to get sim {}. Unable to save stack favorites.', sim) return data inventory = sim.inventory_component inventory_manager = services.inventory_manager() zone = services.current_zone() for key_data in self._favorite_stacks: key = key_data[KEY_ID] custom_key = key_data[CUSTOM_KEY_ID] stack_type = key_data[STACK_TYPE_ID] if stack_type == StackScheme.NONE: obj = zone.find_object(key) if obj is None: continue if obj.get_sim_owner_id( ) != sim.id and obj.get_household_owner_id( ) != sim.household_id: continue elif inventory is None: logger.warn( 'Sim {} has no inventory component. Unable to save stack data: {}.', sim, key_data) else: stack_id = inventory_manager.get_stack_id_from_key( key, custom_key, stack_type) if len(inventory.get_stack_items(stack_id)) == 0: continue stack_msg = data.stack_favorites.add() if key is not None: stack_msg.key = key if custom_key is not None: stack_msg.custom_key = custom_key stack_msg.stack_scheme = stack_type stack_msg = data.stack_favorites.add() if key is not None: stack_msg.key = key if custom_key is not None: stack_msg.custom_key = custom_key stack_msg.stack_scheme = stack_type return data
def destroy_unentitled_craftables(): entitlement_map = {} objects_to_destroy = list() for obj in itertools.chain(services.object_manager().values(), services.inventory_manager().values()): crafting_component = obj.crafting_component while crafting_component is not None: recipe = crafting_component.get_recipe() if recipe is not None and recipe.entitlement: if recipe.entitlement in entitlement_map: entitled = entitlement_map[recipe.entitlement] else: entitled = mtx.has_entitlement(recipe.entitlement) entitlement_map[recipe.entitlement] = entitled if not entitled: objects_to_destroy.append(obj) for obj in objects_to_destroy: obj.destroy(source=obj, cause='Destroying unentitled craftables.')
def sim_inventory_sell_multiple(msg:str, _connection=None): proto = UI_pb2.InventorySellRequest() text_format.Merge(msg, proto) if proto is None: return sim_info = services.sim_info_manager().get(proto.sim_id) if sim_info is None: return inventory_component = sim_info.get_sim_instance().inventory_component if inventory_component is None: return sell_value = 0 objs = [] inventory_stack_items = inventory_component.get_stack_items_map(proto.stacks) if proto.stacks is not None: for stack_id in proto.stacks: stack_items = inventory_stack_items.get(stack_id, None) if stack_items is None: continue for item in stack_items: if item.non_deletable_by_user: break sell_value += item.current_value*item.stack_count() objs.append(item) if proto.items is not None: inventory_manager = services.inventory_manager() for item_data in proto.items: if item_data not in inventory_component: continue item = inventory_manager.get(item_data.id) if item is None: continue if item.non_deletable_by_user: continue sell_value += item.current_value*item_data.count item.update_stack_count(-item_data.count) if item.stack_count() < 1: objs.append(item) else: inventory_component.push_inventory_item_update_msg(item) if objs: services.active_household().funds.add(sell_value, Consts_pb2.TELEMETRY_OBJECT_SELL, sim_info) services.get_reset_and_delete_service().trigger_batch_destroy(objs) op = SendUIMessage('InventorySellItemsComplete') Distributor.instance().add_op_with_no_owner(op)
def destroy_unentitled_craftables(): entitlement_map = {} objects_to_destroy = list() for obj in itertools.chain(services.object_manager().values(), services.inventory_manager().values()): crafting_component = obj.crafting_component while crafting_component is not None: recipe = crafting_component.get_recipe() if recipe is not None and recipe.entitlement: if recipe.entitlement in entitlement_map: entitled = entitlement_map[recipe.entitlement] else: entitled = mtx.has_entitlement(recipe.entitlement) entitlement_map[recipe.entitlement] = entitled if not entitled: objects_to_destroy.append(obj) for obj in objects_to_destroy: obj.destroy(source=obj, cause='Destroying unentitled craftables.')
def sim_inventory_favorite_multiple(sim_id:int=0, is_add:bool=False, *items:int, _connection=None): sim_info = services.sim_info_manager().get(sim_id) if sim_info is None: return favorites_tracker = sim_info.favorites_tracker if favorites_tracker is None: return inventory_component = sim_info.get_sim_instance().inventory_component if inventory_component is None: return inventory_manager = services.inventory_manager() for item_id in items: item = inventory_manager.get(item_id) if is_add: favorites_tracker.set_favorite_stack(item) else: favorites_tracker.unset_favorite_stack(item) inventory_component.push_inventory_item_stack_update_msg(item)
def get_objects(self, resolver, *args, **kwargs): owner = resolver.get_participant(self.participant, *args, **kwargs) if owner is None: return () if not owner.is_sim: return () stored_object_component = owner.sim_info.get_component( types.STORED_OBJECT_INFO_COMPONENT) if stored_object_component is None: return () else: obj_id = stored_object_component.get_stored_object_info_id( self.stored_object_type) stored_object = services.object_manager().get(obj_id) if stored_object is None: stored_object = services.inventory_manager().get(obj_id) if stored_object is not None: return (stored_object, ) return ()
def on_enter(self): super().on_enter() services.household_manager().load_households() zone = services.current_zone() zone_spin_up_service = zone.zone_spin_up_service household_id = zone_spin_up_service._client_connect_data.household_id household = zone.household_manager.get(household_id) client = zone_spin_up_service._client_connect_data.client services.account_service().on_load_options(client) for sim_info in household.sim_info_gen(): client.add_selectable_sim_info(sim_info, send_relationship_update=False) zone.on_households_and_sim_infos_loaded() zone.service_manager.on_all_households_and_sim_infos_loaded(client) services.ui_dialog_service().send_dialog_options_to_client() client.clean_and_send_remaining_relationship_info() services.current_zone().lot.send_lot_display_info() for obj in itertools.chain(services.object_manager().values(), services.inventory_manager().values()): while obj.live_drag_component is not None: obj.live_drag_component.set_active_household_live_drag_permission( ) return _ZoneSpinUpStateResult.DONE
def on_enter(self): super().on_enter() services.household_manager().load_households() zone = services.current_zone() zone_spin_up_service = zone.zone_spin_up_service household_id = zone_spin_up_service._client_connect_data.household_id household = zone.household_manager.get(household_id) client = zone_spin_up_service._client_connect_data.client services.account_service().on_load_options(client) for sim_info in household.sim_info_gen(): client.add_selectable_sim_info(sim_info, send_relationship_update=False) zone.on_households_and_sim_infos_loaded() zone.service_manager.on_all_households_and_sim_infos_loaded(client) services.ui_dialog_service().send_dialog_options_to_client() client.clean_and_send_remaining_relationship_info() services.current_zone().lot.send_lot_display_info() for obj in itertools.chain(services.object_manager().values(), services.inventory_manager().values()): while obj.live_drag_component is not None: obj.live_drag_component.set_active_household_live_drag_permission( ) return _ZoneSpinUpStateResult.DONE
def on_enter(self): super().on_enter() services.household_manager().load_households() zone = services.current_zone() zone_spin_up_service = zone.zone_spin_up_service household_id = zone_spin_up_service._client_connect_data.household_id household = services.household_manager().get(household_id) client = zone_spin_up_service._client_connect_data.client account_service = services.account_service() account_service.on_load_options(client) zone.service_manager.on_zone_load() game_services.service_manager.on_zone_load() sims4.core_services.service_manager.on_zone_load() for sim_info in household.sim_info_gen(): client.add_selectable_sim_info(sim_info, send_relationship_update=False) zone.on_households_and_sim_infos_loaded() zone.service_manager.on_all_households_and_sim_infos_loaded(client) game_services.service_manager.on_all_households_and_sim_infos_loaded( client) sims4.core_services.service_manager.on_all_households_and_sim_infos_loaded( client) organization_service = services.organization_service() if organization_service is not None: organization_service.post_game_services_zone_load() roommate_service = services.get_roommate_service() if roommate_service is not None: roommate_service.initialize_roommates() services.ui_dialog_service().send_dialog_options_to_client() client.clean_and_send_remaining_relationship_info() services.current_zone().lot.send_lot_display_info() for obj in itertools.chain(services.object_manager().values(), services.inventory_manager().values()): if obj.live_drag_component is not None: obj.live_drag_component.resolve_live_drag_household_permission( ) return _ZoneSpinUpStateResult.DONE
def purchase_picker_response_by_ids(inventory_target:RequiredTargetParam, inventory_source:RequiredTargetParam, mailman_purchase:bool=False, object_ids_or_definition_ids:bool=False, *ids_and_amounts_and_price:int, _connection=None): total_price = 0 current_purchased = 0 objects_to_buy = [] definition_manager = services.definition_manager() inventory_manager = services.inventory_manager() for (def_or_obj_id, amount, price) in zip(ids_and_amounts_and_price[::3], ids_and_amounts_and_price[1::3], ids_and_amounts_and_price[2::3]): if object_ids_or_definition_ids: obj_or_definition = inventory_manager.get(def_or_obj_id) else: obj_or_definition = definition_manager.get(def_or_obj_id) if obj_or_definition is None: sims4.commands.output('inventory.purchase_picker_response: Object or Definition not found with id {}'.format(def_or_obj_id), _connection) return False if price == USE_DEFINITION_PRICE: price = obj_or_definition.definition.price purchase_price = price*amount total_price += purchase_price objects_to_buy.append((obj_or_definition, price, 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: to_inventory = services.active_lot().get_hidden_inventory() else: to_inventory_owner = inventory_target.get_target() to_inventory = to_inventory_owner.inventory_component if to_inventory is None: sims4.commands.output('inventory.purchase_picker_response: Inventory not found for items to be purchased into.', _connection) return False if inventory_source.target_id != 0: from_inventory_owner = inventory_source.get_target() from_inventory = from_inventory_owner.inventory_component else: from_inventory_owner = None from_inventory = None if object_ids_or_definition_ids and from_inventory is None: sims4.commands.output('inventory.purchase_picker_response: Source Inventory not found for items to be cloned from.', _connection) return False inventory_manager = services.inventory_manager() for (obj_or_def, price, amount) in objects_to_buy: amount_left = amount while amount_left > 0: if object_ids_or_definition_ids: from_inventory.try_remove_object_by_id(obj_or_def.id, obj_or_def.stack_count()) obj = obj_or_def.clone() from_inventory.system_add_object(obj_or_def) else: obj = create_object(obj_or_def) if obj is None: sims4.commands.output('inventory.purchase_picker_response: Failed to create object with definition {}.'.format(obj_or_def), _connection) amount_left = 0 else: if obj.inventoryitem_component.stack_scheme == StackScheme.NONE: amount_left = amount_left - 1 else: obj.set_stack_count(amount) amount_left = 0 obj.set_household_owner_id(household.id) if not to_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=to_inventory, cause='inventory.purchase_picker_response: Failed to add object into inventory.') else: obj.try_post_bb_fixup(force_fixup=True, active_household_id=services.active_household_id()) purchase_price = price if obj.inventoryitem_component.stack_scheme == StackScheme.NONE else price*amount current_purchased += purchase_price if obj.inventoryitem_component.stack_scheme == StackScheme.NONE: amount_left = amount_left - 1 else: obj.set_stack_count(amount) amount_left = 0 obj.set_household_owner_id(household.id) if not to_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=to_inventory, cause='inventory.purchase_picker_response: Failed to add object into inventory.') else: obj.try_post_bb_fixup(force_fixup=True, active_household_id=services.active_household_id()) purchase_price = price if obj.inventoryitem_component.stack_scheme == StackScheme.NONE else price*amount current_purchased += purchase_price return household.funds.try_remove(current_purchased, Consts_pb2.TELEMETRY_OBJECT_BUY)
def get_stack_id(self): if self._stack_id is None: self._stack_id = services.inventory_manager().get_stack_id(self.owner, self.stack_scheme) return self._stack_id