Heiden_Lunark Posted May 22, 2021 Share Posted May 22, 2021 I'm trying to make a modification that changes status in a day/night cycle. local function WorldPhaseChangeSpeed(inst, phase) local spmultplier = 1 local dmultplier = 1 --local healthtest = 1 if not inst:HasTag("playerghost") then if not TheWorld:HasTag("cave") then if phase == "day" then local percent = inst.components.health:GetPercent() spmultplier = 0.8 dmultplier = 0.5 --healthtest = 50 inst.components.health:SetMaxHealth(50) inst.components.health:DoDelta(0) inst.components.health:SetPercent(percent) elseif phase == "dusk" then local percent = inst.components.health:GetPercent() spmultplier = 1.0 dmultplier = 0.8 --healthtest = 100 inst.components.health:SetMaxHealth(100) inst.components.health:DoDelta(0) inst.components.health:SetPercent(percent) elseif phase == "night" then local percent = inst.components.health:GetPercent() spmultplier = 1.4 dmultplier = 1.5 --healthtest = 200 inst.components.health:SetMaxHealth(200) inst.components.health:DoDelta(0) inst.components.health:SetPercent(percent) end inst.components.locomotor:SetExternalSpeedMultiplier(inst, "phase_speed", spmultplier) inst.components.combat.externaldamagemultipliers:SetModifier("phase_power", dmultplier) --TUNING.UNNAMED_HEALTH = healthtest --inst.components.health:DoDelta(0) else if phase == "caveday" then local percent = inst.components.health:GetPercent() spmultplier = 1.2 dmultplier = 1.2 inst.components.health:SetMaxHealth(80) inst.components.health:DoDelta(0) inst.components.health:SetPercent(percent) elseif phase == "cavedusk" then local percent = inst.components.health:GetPercent() spmultplier = 1.2 dmultplier = 1.2 inst.components.health:SetMaxHealth(130) inst.components.health:DoDelta(0) inst.components.health:SetPercent(percent) elseif phase == "cavenight" then local percent = inst.components.health:GetPercent() spmultplier = 1.2 dmultplier = 1.2 inst.components.health:SetMaxHealth(160) inst.components.health:DoDelta(0) inst.components.health:SetPercent(percent) end inst.components.locomotor:SetExternalSpeedMultiplier(inst, "phase_speed", spmultplier) inst.components.combat.externaldamagemultipliers:SetModifier("phase_power", dmultplier) end end end --master_postinit inst:WatchWorldState("phase", WorldPhaseChangeSpeed) WorldPhaseChangeSpeed(inst, TheWorld.state.phase) The code worked on the surface world, but not on the cave world. What part am I doing wrong? My English is not good, sorry if I'm rude. Link to comment Share on other sites More sharing options...
Monti18 Posted May 22, 2021 Share Posted May 22, 2021 In the cave, phase is always considered night, that's why there is no change. You need to add another WatchWorldState that is watching for "cavephase", and there you can enter your section of your function that sets the speed for caves. 2 Link to comment Share on other sites More sharing options...
Heiden_Lunark Posted May 22, 2021 Author Share Posted May 22, 2021 40 minutes ago, Monti18 said: In the cave, phase is always considered night, that's why there is no change. You need to add another WatchWorldState that is watching for "cavephase", and there you can enter your section of your function that sets the speed for caves. Thanks for the reply! I'm still learning to modify it, so I don't know if this is right or not, but it worked! I have separated the functions in the process of trying many times, is it possible to merge them? local function WorldPhaseChangeSpeed(inst, phase) local spmultplier = 1 local dmultplier = 1 if not inst:HasTag("playerghost") then if not TheWorld:HasTag("cave") then if phase == "day" then local percent = inst.components.health:GetPercent() spmultplier = 0.8 dmultplier = 0.5 inst.components.health:SetMaxHealth(50) inst.components.health:DoDelta(0) inst.components.health:SetPercent(percent) elseif phase == "dusk" then local percent = inst.components.health:GetPercent() spmultplier = 1.0 dmultplier = 0.8 inst.components.health:SetMaxHealth(100) inst.components.health:DoDelta(0) inst.components.health:SetPercent(percent) elseif phase == "night" then local percent = inst.components.health:GetPercent() spmultplier = 1.4 dmultplier = 1.5 inst.components.health:SetMaxHealth(200) inst.components.health:DoDelta(0) inst.components.health:SetPercent(percent) end inst.components.locomotor:SetExternalSpeedMultiplier(inst, "phase_speed", spmultplier) inst.components.combat.externaldamagemultipliers:SetModifier("phase_power", dmultplier) end end end --------------------------------------------------------------------- local function WorldPhaseChangeSpeed2(inst, cavephase) local spmultplier = 1 local dmultplier = 1 if not inst:HasTag("playerghost") then if TheWorld:HasTag("cave") then if cavephase == "day" then local percent = inst.components.health:GetPercent() spmultplier = 1.2 dmultplier = 1.2 inst.components.health:SetMaxHealth(80) inst.components.health:DoDelta(0) inst.components.health:SetPercent(percent) elseif cavephase == "dusk" then local percent = inst.components.health:GetPercent() spmultplier = 1.2 dmultplier = 1.2 inst.components.health:SetMaxHealth(130) inst.components.health:DoDelta(0) inst.components.health:SetPercent(percent) elseif cavephase == "night" then local percent = inst.components.health:GetPercent() spmultplier = 1.2 dmultplier = 1.2 inst.components.health:SetMaxHealth(160) inst.components.health:DoDelta(0) inst.components.health:SetPercent(percent) end inst.components.locomotor:SetExternalSpeedMultiplier(inst, "phase_speed", spmultplier) inst.components.combat.externaldamagemultipliers:SetModifier("phase_power", dmultplier) end end end --master_postinit inst:WatchWorldState("phase", WorldPhaseChangeSpeed) WorldPhaseChangeSpeed(inst, TheWorld.state.phase) inst:WatchWorldState("cavephase", WorldPhaseChangeSpeed2) WorldPhaseChangeSpeed2(inst, TheWorld.state.phase) Link to comment Share on other sites More sharing options...
Heiden_Lunark Posted May 22, 2021 Author Share Posted May 22, 2021 During the test play, I noticed that when entering the cave from the ground, it would branch off into the cavephase == "night". If the time is updated in the cave, max health will change. Is there any way to branch to the correct time when I enter the cave? Link to comment Share on other sites More sharing options...
Monti18 Posted May 23, 2021 Share Posted May 23, 2021 (edited) I think you need to change WorldPhaseChangeSpeed2(inst, TheWorld.state.phase) to WorldPhaseChangeSpeed2(inst, TheWorld.state.cavephase) because otherwise, it will still look for the normal phase which is always night in the cave. I think you can just use the function like you had at the beginning, change the phase names to the same ones as on the surface and in your masterpostinit you just change WorldPhaseChangeSpeed2 to WorldPhaseChangeSpeed. Edited May 23, 2021 by Monti18 2 Link to comment Share on other sites More sharing options...
Heiden_Lunark Posted May 23, 2021 Author Share Posted May 23, 2021 2 hours ago, Monti18 said: I think you need to change WorldPhaseChangeSpeed2(inst, TheWorld.state.phase) to WorldPhaseChangeSpeed2(inst, TheWorld.state.cavephase) because otherwise, it will still look for the normal phase which is always night in the cave. I think you can just use the function like you had at the beginning, change the phase names to the same ones as on the surface and in your masterpostinit you just change WorldPhaseChangeSpeed2 to WorldPhaseChangeSpeed. I tried everything I could think of, but it either banished me from the cave or crashed me back to character selection. What am I doing wrong? Spoiler local function WorldPhaseChangeSpeed(inst, phase) local spmultplier = 1 local dmultplier = 1 if not inst:HasTag("playerghost") then if not TheWorld:HasTag("cave") then if phase == "day" then local percent = inst.components.health:GetPercent() spmultplier = 0.8 dmultplier = 0.5 inst.components.health:SetMaxHealth(50) inst.components.health:DoDelta(0) inst.components.health:SetPercent(percent) elseif phase == "dusk" then local percent = inst.components.health:GetPercent() spmultplier = 1.0 dmultplier = 0.8 inst.components.health:SetMaxHealth(100) inst.components.health:DoDelta(0) inst.components.health:SetPercent(percent) elseif phase == "night" then local percent = inst.components.health:GetPercent() spmultplier = 1.4 dmultplier = 1.5 inst.components.health:SetMaxHealth(200) inst.components.health:DoDelta(0) inst.components.health:SetPercent(percent) end inst.components.locomotor:SetExternalSpeedMultiplier(inst, "phase_speed", spmultplier) inst.components.combat.externaldamagemultipliers:SetModifier("phase_power", dmultplier) else if phase == "day" then local percent = inst.components.health:GetPercent() spmultplier = 1.2 dmultplier = 1.2 inst.components.health:SetMaxHealth(80) inst.components.health:DoDelta(0) inst.components.health:SetPercent(percent) elseif phase == "dusk" then local percent = inst.components.health:GetPercent() spmultplier = 1.2 dmultplier = 1.2 inst.components.health:SetMaxHealth(130) inst.components.health:DoDelta(0) inst.components.health:SetPercent(percent) elseif phase == "night" then local percent = inst.components.health:GetPercent() spmultplier = 1.2 dmultplier = 1.2 inst.components.health:SetMaxHealth(160) inst.components.hdsealth:DoDelta(0) inst.components.health:SetPercent(percent) end inst.components.locomotor:SetExternalSpeedMultiplier(inst, "phase_speed", spmultplier) inst.components.combat.externaldamagemultipliers:SetModifier("phase_power", dmultplier) end end end --master_postinit inst:WatchWorldState("phase", WorldPhaseChangeSpeed) WorldPhaseChangeSpeed(inst, TheWorld.state.phase) WorldPhaseChangeSpeed(inst, TheWorld.state.cavephase) Link to comment Share on other sites More sharing options...
Monti18 Posted May 23, 2021 Share Posted May 23, 2021 elseif phase == "night" then local percent = inst.components.health:GetPercent() spmultplier = 1.2 dmultplier = 1.2 inst.components.health:SetMaxHealth(160) inst.components.hdsealth:DoDelta(0) inst.components.health:SetPercent(percent) end You wrote hdsealth instead of health, that's why it was crashing. If you are having crashes when entering caves, you won't always find the error in the server log of the master, you need to also have a look into the server log of the caves. 1 1 Link to comment Share on other sites More sharing options...
Heiden_Lunark Posted May 24, 2021 Author Share Posted May 24, 2021 6 hours ago, Monti18 said: elseif phase == "night" then local percent = inst.components.health:GetPercent() spmultplier = 1.2 dmultplier = 1.2 inst.components.health:SetMaxHealth(160) inst.components.hdsealth:DoDelta(0) inst.components.health:SetPercent(percent) end You wrote hdsealth instead of health, that's why it was crashing. If you are having crashes when entering caves, you won't always find the error in the server log of the master, you need to also have a look into the server log of the caves. I completely overlooked that part. I fixed the code and the error is gone, but the maximum health is no longer updated when the time is updated in the cave. split the function into surface and cave again to test it, and they worked correctly. If I merge, will I no longer get the cave update trigger? By the way, I thought all game errors were output to cliant.log. It really helps me to know that server.log exists. Thank you so much! Link to comment Share on other sites More sharing options...
Monti18 Posted May 24, 2021 Share Posted May 24, 2021 It's strange that it's working if you split the function... I did a little testing and the watchworldstate doesn't set the phase to a new value, that's why I thought phase is probably not the right keyword for watching the state in the caves. This should work if you add it to the master postinit: if TheWorld:HasTag("cave") then inst:WatchWorldState("cavephase", WorldPhaseChangeSpeed) WorldPhaseChangeSpeed(inst, TheWorld.state.cavephase) else inst:WatchWorldState("phase", WorldPhaseChangeSpeed) WorldPhaseChangeSpeed(inst, TheWorld.state.phase) end If you have a server without caves, the errors will be in the client log, but if you have a server with caves, most of them will be in the server log, except for those that happen on the client. Best is to always check both 1 1 Link to comment Share on other sites More sharing options...
Heiden_Lunark Posted May 24, 2021 Author Share Posted May 24, 2021 7 hours ago, Monti18 said: It's strange that it's working if you split the function... I did a little testing and the watchworldstate doesn't set the phase to a new value, that's why I thought phase is probably not the right keyword for watching the state in the caves. This should work if you add it to the master postinit: if TheWorld:HasTag("cave") then inst:WatchWorldState("cavephase", WorldPhaseChangeSpeed) WorldPhaseChangeSpeed(inst, TheWorld.state.cavephase) else inst:WatchWorldState("phase", WorldPhaseChangeSpeed) WorldPhaseChangeSpeed(inst, TheWorld.state.phase) end If you have a server without caves, the errors will be in the client log, but if you have a server with caves, most of them will be in the server log, except for those that happen on the client. Best is to always check both I thought that "inst:WatchWorldState("phase", WorldPhaseChangeSpeed)" was assigning WorldState information to "phase". I'm confused by the fact that it works without changing "if phase" to "if cavephase". Anyway, it's working as I wanted now! I sincerely appreciate your kindness. I'm starting to understand some parts of the DST mod rules. 1 Link to comment Share on other sites More sharing options...
Monti18 Posted May 24, 2021 Share Posted May 24, 2021 If I understand your question correctly, you are wondering why in the function WorldChangeSpeed you don't need to change phase to cavephase for the part of the function that is running in the caves. When using inst:WatchWorldState, you listen to the change of a variable, in this case phase or cavephase. When it's changed, your function, here WorldChangeSpeed, is called with the arguments inst and TheWorld.state.phase or TheWorld.state.cavephase, depending on if you listen to phase or cavephase. When your function is running, you have inst = inst as your first argument and phase = TheWorld.state.phase or phase = TheWorld.state.cavephase. Your second argument can be named whatever you want, as the value will always be given from WatchWorldState. The second part of the master postinit, WorldPhaseChangeSpeed(inst, TheWorld.state.phase), is just your function running once at the beginning, so that the values for your character are correct, as there isn't an event that WatchWorldState could listen to, as the server has just been started. So you run your function once so that all values are correct and when the state changes, WatchWorldState will run the function again with the right arguments. I hope that answers your question, if not, don't hesitate to ask me! That's good to hear, it's always nice when something is finally working. You're welcome, if you have other problems, you can always shoot me a message 1 1 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