コード例 #1
0
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__)
コード例 #2
0
 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)
コード例 #3
0
 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))
コード例 #4
0
 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
コード例 #5
0
 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
コード例 #6
0
 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)
コード例 #7
0
 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
コード例 #8
0
 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()
コード例 #9
0
 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
コード例 #10
0
ファイル: recipe.py プロジェクト: johndpope/sims4-ai-engine
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.')
コード例 #11
0
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)
コード例 #12
0
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.')
コード例 #13
0
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)
コード例 #14
0
 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 ()
コード例 #15
0
 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
コード例 #16
0
 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
コード例 #17
0
 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
コード例 #18
0
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)
コード例 #19
0
 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