RedHairedHero Posted May 7, 2018 Share Posted May 7, 2018 (edited) Hello, I'm creating a Frying Pan for a character and am trying to give it two modes. The first is just the plain old Frying Pan, the second becomes a Hot Frying Pan after you cook it on a fire. The main issue I'm running into is the durability, in order to cook the pan it has to have a separate prefab and thus a completely separate durability. I was wondering if anyone knew how to store a value (the weapons uses) without it being overwritten. Here is the code I have so far. local assets= { Asset("ANIM", "anim/pan.zip"), Asset("ANIM", "anim/swap_pan.zip"), Asset("ATLAS", "images/inventoryimages/pan.xml"), Asset("IMAGE", "images/inventoryimages/pan.tex"), Asset("ATLAS", "images/inventoryimages/hotpan.xml"), Asset("IMAGE", "images/inventoryimages/hotpan.tex"), Asset("INV_IMAGE", "pan") } local function OnSave(inst, data) --If pan is hot save the amount of time remaining. end local function OnLoad(inst, data) --If the pan is hot load it's remaining time. end local function OnEquip(inst, owner) owner.AnimState:OverrideSymbol("swap_object", "swap_pan", "pan") owner.AnimState:Show("ARM_carry") owner.AnimState:Hide("ARM_normal") end local function OnEquip_Hot(inst, owner) owner.AnimState:OverrideSymbol("swap_object", "swap_pan", "hotpan") owner.AnimState:Show("ARM_carry") owner.AnimState:Hide("ARM_normal") end local function OnUnequip(inst, owner) owner.AnimState:Hide("ARM_carry") owner.AnimState:Show("ARM_normal") end local function cooked_timer(inst, owner) local pantime = inst.components.pantimer:Getptimer() --print (pantime) local owner = ThePlayer local anim = inst.entity:AddAnimState() if pantime == 0 then print ("Timer Done") inst.components.weapon:SetDamage(34) inst.components.heater:SetThermics(false, false) anim:SetBank("pan") anim:SetBuild("pan") anim:PlayAnimation("idle") inst.components.inventoryitem.imagename = "pan" inst.components.inventoryitem.atlasname = "images/inventoryimages/pan.xml" inst.components.inventoryitem:ChangeImageName ("pan")--required? inst._light.Light:Enable(false) inst.SoundEmitter:PlaySound("dontstarve/common/fireOut") inst.components.equippable:SetOnEquip( OnEquip ) inst.hottask:Cancel() else inst.components.pantimer:SetTimer(pantime-1) end print("cooked_timer function") end local function Stored(inst) local remaining_uses = inst.components.finiteuses:GetUses() --print (remaining_uses) --print("Stored Function") --print(remaining_uses) return remaining_uses end local function pan() local inst = CreateEntity() local trans = inst.entity:AddTransform() local anim = inst.entity:AddAnimState() inst.entity:AddNetwork() inst.entity:AddSoundEmitter() MakeInventoryPhysics(inst) anim:SetBank("pan") anim:SetBuild("pan") anim:PlayAnimation("idle") inst.entity:SetPristine() if not TheWorld.ismastersim then return inst end inst:AddComponent("cookable") inst:AddComponent("equippable") inst:AddComponent("finiteuses") inst:AddComponent("inspectable") inst:AddComponent("inventoryitem") --inst:AddComponent("pantimer") inst:AddComponent("weapon") inst.components.cookable:SetOnCookedFn(Stored) inst.components.cookable.product = "hotpan"--when cooked perform SpawnPrefab("hotpan") inst.components.inventoryitem.imagename = "pan" inst.components.inventoryitem.atlasname = "images/inventoryimages/pan.xml" inst.components.weapon:SetDamage(34) inst.components.finiteuses:SetMaxUses(300) inst.components.finiteuses:SetUses(300) inst.components.finiteuses:SetOnFinished(inst.Remove) inst.components.equippable:SetOnEquip( OnEquip ) inst.components.equippable:SetOnUnequip( OnUnequip ) MakeHauntableLaunch(inst) print ("pan fuction") return inst end local function hot_pan() local inst = CreateEntity() local trans = inst.entity:AddTransform() local anim = inst.entity:AddAnimState() inst.entity:AddNetwork() inst.entity:AddSoundEmitter() MakeInventoryPhysics(inst) anim:SetBank("pan") anim:SetBuild("pan") anim:PlayAnimation("hot")--Changes ground anim to the hotpan inst.entity:SetPristine() if not TheWorld.ismastersim then return inst end inst:AddComponent("cookable") inst:AddComponent("cooker") inst:AddComponent("equippable") inst:AddComponent("finiteuses") inst:AddComponent("heater") inst:AddComponent("inspectable") inst:AddComponent("inventoryitem") inst:AddComponent("pantimer") inst:AddComponent("weapon") inst.components.cookable.product = "hotpan" inst.components.inventoryitem.imagename = "hotpan" inst.components.inventoryitem.atlasname = "images/inventoryimages/hotpan.xml" inst.components.weapon:SetDamage(42.5) inst.components.finiteuses:SetMaxUses(300) inst.components.finiteuses:SetUses(300)--set uses based on remaining uses before it was cooked. inst.components.finiteuses:SetOnFinished(inst.Remove) inst.components.equippable:SetOnEquip( OnEquip_Hot ) inst.components.equippable:SetOnUnequip( OnUnequip ) MakeHauntableLaunch(inst) inst.components.heater:SetThermics(true, false) inst.components.heater.heat = 40 inst.components.pantimer:SetTimer(5)--how long hot pan lasts inst.hottask = inst:DoPeriodicTask(1, cooked_timer ) inst._light = SpawnPrefab("panlight") inst._light.entity:AddFollower() inst._light.Follower:FollowSymbol(inst.GUID, "swap_object", 0, -110, 0) inst._light.Light:Enable(true) print ("hot_pan fuction") return inst end local function lightfn() local inst = CreateEntity() inst.entity:AddTransform() inst.entity:AddLight() inst.entity:AddNetwork() inst:AddTag("FX") inst.Light:SetRadius(.6) inst.Light:SetFalloff(1) inst.Light:SetIntensity(.5) inst.Light:SetColour(235 / 255, 165 / 255, 12 / 255) inst.Light:Enable(false) inst.entity:SetPristine() if not TheWorld.ismastersim then return inst end inst.persists = false --print ("light fuction") return inst end return Prefab("pan", pan, assets), Prefab("hotpan", hot_pan, assets), Prefab("panlight", lightfn) Any help is appreciated. If you can think of another way around the method I'm using I'm all ears(eyes). Thanks, Nathan Edited May 8, 2018 by RedHairedHero Solved the issue Link to comment Share on other sites More sharing options...
IronHunter Posted May 8, 2018 Share Posted May 8, 2018 Rather than cooking it on the fire, maybe use a similar method to the heatrock/Thermal Stone? Where it heats up when near a heat source. You can even make it so if its currently in a inventory it won't heat up only if its on the ground near a source. You can set your own range if you don't want it becoming too hot or cold etc. You don't need to copy the part where it heats up you character btw, but it is a good alternative. The cookable component will destroy the old prefab and spawn a replacement one, I know the component transfers some data over in the form of perish stat, but not much else. To transfer over durability like you desire would require modifying the cookable component to have an exception for your item and return the original for anything else. Another alternative idea is to make your item have a custom component action and function when used on a fire that just heats it up rather than cooking it, this way you don't have to use two prefabs as well. This is a little more complex than other methods of copy pasting and tweaking. Hope that gives you some ideas to work with. Link to comment Share on other sites More sharing options...
RedHairedHero Posted May 8, 2018 Author Share Posted May 8, 2018 2 hours ago, IronHunter said: Rather than cooking it on the fire, maybe use a similar method to the heatrock/Thermal Stone? Where it heats up when near a heat source. You can even make it so if its currently in a inventory it won't heat up only if its on the ground near a source. You can set your own range if you don't want it becoming too hot or cold etc. You don't need to copy the part where it heats up you character btw, but it is a good alternative. The cookable component will destroy the old prefab and spawn a replacement one, I know the component transfers some data over in the form of perish stat, but not much else. To transfer over durability like you desire would require modifying the cookable component to have an exception for your item and return the original for anything else. Another alternative idea is to make your item have a custom component action and function when used on a fire that just heats it up rather than cooking it, this way you don't have to use two prefabs as well. This is a little more complex than other methods of copy pasting and tweaking. Hope that gives you some ideas to work with. Thanks for the ideas, I decided to go the Thermal Stone route and it's working how I was wanting, removed the cold part of it and added the perks (additional damage and ability to cook) was way easier then the route I was taking. Link to comment Share on other sites More sharing options...
IronHunter Posted May 8, 2018 Share Posted May 8, 2018 24 minutes ago, RedHairedHero said: Thanks for the ideas, I decided to go the Thermal Stone route and it's working how I was wanting, removed the cold part of it and added the perks (additional damage and ability to cook) was way easier then the route I was taking. I am glad that I could help =] Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now