Jump to content

Recommended Posts

Hello. Need some advice or help on next problem.

There are components "edible" and "finiteuses". Is there a way to make food with for example, 3 uses? I assigned these components to item and when i try to use it as eat - it dissapears without using charges. I have thoughts to make straightforward solution to summon this item again with function OnEaten with less charges but this is a little bit stupid. Is there other way to combine "edible" and "finiteuses"?

Edited by Amalleus
Link to comment
https://forums.kleientertainment.com/forums/topic/74734-solved-finiteuses-edible/
Share on other sites

In eater.lua -> function Eater:Eat( food )

 

If you scroll down you can see:

        if food.components.stackable and food.components.stackable.stacksize > 1 and not self.eatwholestack then
            food.components.stackable:Get():Remove()
        else
            food:Remove()
        end

Maybe you could override the Eater:Eat function and add a check for your item name and it's finite uses. If >1 (or 0?) reduce finite uses and skip removing food, otherwise remove food as normal?

4 hours ago, RandomFace said:

In eater.lua -> function Eater:Eat( food )

 

If you scroll down you can see:


        if food.components.stackable and food.components.stackable.stacksize > 1 and not self.eatwholestack then
            food.components.stackable:Get():Remove()
        else
            food:Remove()
        end

Maybe you could override the Eater:Eat function and add a check for your item name and it's finite uses. If >1 (or 0?) reduce finite uses and skip removing food, otherwise remove food as normal?

Thanks for idea. I made this code from your help:

if food.components.edible and food.components.finiteuses and food.prefab == "estus_full" then
	local useAmount = food.components.finiteuses:GetUses()
	if (useAmount > 1) then 
		food.components.finiteuses:Use(1)
	elseif (useAmount == 1) then
		food.components.finiteuses:Use(1)
		food:Remove()
		self.inst.components.inventory:GiveItem(SpawnPrefab("estus_empty"))
	end
end

This willl allow me to do functions which i need.

Another question: I am really newbie in Lua and so could you also tell me how to add this code in Eater:Eat function? I don't understand how "AddPrefabPostInit( "eater", somefunction )" works.

Edited by Amalleus
Mistake

Not sure if it's the best way to do it but I decided to redirect ACTIONS.EAT.fn in actions.lua instead of the eater:eat function

Try it in your items prefab (local fn)

inst:AddComponent("finiteuses")
inst.components.finiteuses:SetMaxUses(3)
inst.components.finiteuses:SetUses(3)


local ActionsEat_old = ACTIONS.EAT.fn
ACTIONS.EAT.fn = function(act)
    local obj = act.target or act.invobject
        if act.doer.components.eater and obj and obj.components.edible then
            if obj.prefab=="estus_full" then
                local useAmount = obj.components.finiteuses:GetUses()
                if (useAmount > 1) then --Decrease finiteuses and give potion bonuses
		        	obj.components.finiteuses:Use(1)
		        	act.doer.components.sanity:DoDelta(10)
		        	act.doer.components.health:DoDelta(10)
		        	return true         --Return true so the character doesnt say "can't do that"
	            elseif (useAmount == 1) then
				obj.components.finiteuses:Use(1)
				act.doer.components.inventory:GiveItem(SpawnPrefab("estus_empty"))
				act.doer.components.sanity:DoDelta(10)
				act.doer.components.health:DoDelta(10)
				return act.doer.components.eater:Eat(obj) --Here we allow the game to consume the item as normal
   				end
   		  	else
        		return act.doer.components.eater:Eat(obj) --Not our item, do normal stuff
    		end
    	end
end

I added the sanity / health increase as an example.

 

7 hours ago, RandomFace said:

Not sure if it's the best way to do it but I decided to redirect ACTIONS.EAT.fn in actions.lua instead of the eater:eat function

Try it in your items prefab (local fn)


inst:AddComponent("finiteuses")
inst.components.finiteuses:SetMaxUses(3)
inst.components.finiteuses:SetUses(3)


local ActionsEat_old = ACTIONS.EAT.fn
ACTIONS.EAT.fn = function(act)
    local obj = act.target or act.invobject
        if act.doer.components.eater and obj and obj.components.edible then
            if obj.prefab=="estus_full" then
                local useAmount = obj.components.finiteuses:GetUses()
                if (useAmount > 1) then --Decrease finiteuses and give potion bonuses
		        	obj.components.finiteuses:Use(1)
		        	act.doer.components.sanity:DoDelta(10)
		        	act.doer.components.health:DoDelta(10)
		        	return true         --Return true so the character doesnt say "can't do that"
	            elseif (useAmount == 1) then
				obj.components.finiteuses:Use(1)
				act.doer.components.inventory:GiveItem(SpawnPrefab("estus_empty"))
				act.doer.components.sanity:DoDelta(10)
				act.doer.components.health:DoDelta(10)
				return act.doer.components.eater:Eat(obj) --Here we allow the game to consume the item as normal
   				end
   		  	else
        		return act.doer.components.eater:Eat(obj) --Not our item, do normal stuff
    		end
    	end
end

I added the sanity / health increase as an example.

 

I see. Actions.eat firstly looks forward my item and then if it's not my redirect to usual action of eating. Good one.

Tested, it is working. Thanks for helping out

No problem.

One thing that occurred to me; In the above code we give the estus_empty bottle before allowing the full one to be removed. This probably isn't a good idea in a situation where the players inventory is full. I would change it to remove the estus_full before giving the estus_empty.

20 hours ago, RandomFace said:

No problem.

One thing that occurred to me; In the above code we give the estus_empty bottle before allowing the full one to be removed. This probably isn't a good idea in a situation where the players inventory is full. I would change it to remove the estus_full before giving the estus_empty.

that's right. because if you will give something it will appear on cursor if inventory is full or on the floor if there is some item on cursor also. i already did this, thanks

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
  • Create New...