code4240 Posted February 19, 2015 Share Posted February 19, 2015 (edited) It's been a while since I made a mod, almost a year. Currently I'm trying to do a very simple change to the firestaff that makes it do 34 damage instead of set things on fire. A mod I made a while back used AddComponentPostInit to successfully overwrite the ReleaseHound function in hounded.lua, so I assumed AddPrefabPostInit worked the same way and tried to duplicate... to no avail. I noticed that all the different staves seem to be stored in staff.lua, at least that's what it looks like to me. So I wrote a modmain.lua that looks like this...PrefabFiles = {}Assets = {}local function setDamage(prefab) prefab.onattack_red = function(inst, attacker, target, skipsanity) if target.components.burnable and not target.components.burnable:IsBurning() then if target.components.freezable and target.components.freezable:IsFrozen() then target.components.freezable:Unfreeze() end end if target.components.freezable then target.components.freezable:AddColdness(-1) --Does this break ice staff? if target.components.freezable:IsFrozen() then target.components.freezable:Unfreeze() end end if target.components.sleeper and target.components.sleeper:IsAsleep() then target.components.sleeper:WakeUp() end if target.components.combat then target.components.combat:SuggestTarget(attacker) if target.sg and target.sg.sg.states.hit and not target:HasTag("player") then target.sg:GoToState("hit") end end if attacker and attacker.components.sanity and not skipsanity then attacker.components.sanity:DoDelta(-TUNING.SANITY_SUPERTINY) end attacker.SoundEmitter:PlaySound("dontstarve/wilson/fireball_explo") target:PushEvent("attacked", {attacker = attacker, damage = 34}) endendAddPrefabPostInit("staff", setDamage)The only change I made to the original function was remove the call to ignite the target, and change the damage at the end from 0 to 34. The mod is completely nonfunctional. When I look at it in the mod list it always says the mod crashed. I clearly have no idea how to use AddPrefabPostInit, so can someone tell me? Edited February 19, 2015 by code4240 Link to comment https://forums.kleientertainment.com/forums/topic/51175-trying-to-modify-firestaff-function-with-addprefabpostinit/ Share on other sites More sharing options...
rezecib Posted February 19, 2015 Share Posted February 19, 2015 @code4240, Although all staffs are in the staff.lua prefab file, that doesn't mean they're the same prefab. AddPrefabPostInit operates on an game prefab object, not the files. There are a few files that return multiple objects, (most notorious being hats.lua), but you must AddPrefabPostInit on each returned prefab separately. Link to comment https://forums.kleientertainment.com/forums/topic/51175-trying-to-modify-firestaff-function-with-addprefabpostinit/#findComment-614564 Share on other sites More sharing options...
code4240 Posted February 19, 2015 Author Share Posted February 19, 2015 @code4240, Although all staffs are in the staff.lua prefab file, that doesn't mean they're the same prefab. AddPrefabPostInit operates on an game prefab object, not the files. There are a few files that return multiple objects, (most notorious being hats.lua), but you must AddPrefabPostInit on each returned prefab separately. Hmm. Well, I've already tried using "firestaff" instead, and I also just tried calling it for all of them like this-AddPrefabPostInit("firestaff", setDamage)AddPrefabPostInit("icestaff", setDamage)AddPrefabPostInit("telestaff", setDamage)AddPrefabPostInit("orangestaff", setDamage)AddPrefabPostInit("greenstaff", setDamage)AddPrefabPostInit("yellowstaff", setDamage)-but I've got no results. Is there some other way I should be handling this? Link to comment https://forums.kleientertainment.com/forums/topic/51175-trying-to-modify-firestaff-function-with-addprefabpostinit/#findComment-614570 Share on other sites More sharing options...
rezecib Posted February 19, 2015 Share Posted February 19, 2015 @code4240, You're providing a function and storing it in inst.onattack_red. This field is never referenced or called anywhere else. onattack_red is a local function in the staff.lua file, but it gets attached to the weapon component on line 513 of staff.lua: inst.components.weapon:SetOnAttack(onattack_red)This is presumably storing it in a field that the weapon component then calls. To give a small example of what you're running into:local number = 5local entity = {}entity.num = numbernumber = 6print(entity.num) -- will print "5"Although in your case there's a few more things thwarting you, because onattack_red is never attached to the entity table, it's just local to the file. Things that are local to a file cannot really be referenced from outside of that file (technically there are ways you might do it, but it's... not a good/reliable thing to do). Link to comment https://forums.kleientertainment.com/forums/topic/51175-trying-to-modify-firestaff-function-with-addprefabpostinit/#findComment-614579 Share on other sites More sharing options...
code4240 Posted February 19, 2015 Author Share Posted February 19, 2015 (edited) <snip> EUREKA! After reading the contents of red(), which contained line 513, I removed the "prefab.onattack_red = function()" line from setDamage and simply did this:AddPrefabPostInit("firestaff", function(inst) inst.components.weapon:SetDamage(34) inst.components.weapon:SetOnAttack(setDamage)end)And it worked! Thanks a ton pal! EDIT: I cannot into forum formatting Edited February 19, 2015 by code4240 Link to comment https://forums.kleientertainment.com/forums/topic/51175-trying-to-modify-firestaff-function-with-addprefabpostinit/#findComment-614672 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