localcryptid Posted December 13, 2021 Share Posted December 13, 2021 I want to have my character's sanity drain when players near them have low health or sanity. Any idea how to do this? Here's what I have in master_postinit. Quote inst:DoPeriodicTask(1.0, function(inst) -- Do nothing if the player is dead. if inst.components.health:IsDead() or inst:HasTag("playerghost") then return end -- Store the position of the player in x, y, z variables. local x,y,z = inst.Transform:GetWorldPosition() -- Description of important function, which finds specific entities within a range: -- TheSim:FindEntities(x, y, z, radius, mustHaveTags, cantHaveTags, mustHaveOneOfTheseTags) -- We have limited it to any player that is not a ghost or in limbo. -- I have set the radius to be the one used for standard negative auras. You can set it to whatever radius you want. local ents = TheSim:FindEntities(x, y, z, TUNING.SANITY_EFFECT_RANGE, {"player"}, {"playerghost", "INLIMBO"}, nil) for i, v in ipairs(ents) do if v and v:IsValid() then -- If any player near them has low HP, drain sanity local health_percent = {"player"}.components.health:GetPercent() -- Player health local sanity_percent = {"player"}.components.sanity:GetPercent() -- Player sanity if (health_percent < .5 or sanity_percent < .5) then -- If player health or sanity is less than half inst.components.sanity.dapperness = -1 -- Drain Nibs' sanity end if v.prefab == "bolt" then -- When near Bolt, gain sanity and do more damage inst.components.sanity:DoDelta(1, true) -- Sanity gain if not inst:HasTag("killmode") and inst.issecretnibs == nil and not inst:HasTag("playerghost") then -- If killmode is not already engaged inst.components.combat.damagemultiplier = 1.5 -- Damage buff end elseif v.prefab == "cobalt" then -- Sanity gain around Cobalt inst.components.sanity:DoDelta(1, true) -- "true" disables the pulse on the badge and disables that it plays a sound. end elseif v and not v:IsValid() then -- Turn off damage mod when not around Bolt inst.components.combat.damagemultiplier = 1 inst.components.sanity.dapperness = 0 end end end) It's crashing when trying to grab the teammate health and sanity values. Link to comment https://forums.kleientertainment.com/forums/topic/136086-drain-sanity-based-on-another-players-health/ Share on other sites More sharing options...
CarlZalph Posted December 13, 2021 Share Posted December 13, 2021 1 hour ago, localcryptid said: local health_percent = {"player"}.components.health:GetPercent() -- Player health local sanity_percent = {"player"}.components.sanity:GetPercent() -- Player sanity Should be `v` instead of `{"player"}`. You'll want to look over your logic after it, some of your if/then/elseifs don't look right at a glance for what you're intending to do. Link to comment https://forums.kleientertainment.com/forums/topic/136086-drain-sanity-based-on-another-players-health/#findComment-1522200 Share on other sites More sharing options...
localcryptid Posted December 13, 2021 Author Share Posted December 13, 2021 Quote inst:DoPeriodicTask(1.0, function(inst) -- Do nothing if the player is dead. if inst.components.health:IsDead() or inst:HasTag("playerghost") then return end -- Store the position of the player in x, y, z variables. local x,y,z = inst.Transform:GetWorldPosition() -- Description of important function, which finds specific entities within a range: -- TheSim:FindEntities(x, y, z, radius, mustHaveTags, cantHaveTags, mustHaveOneOfTheseTags) -- We have limited it to any player that is not a ghost or in limbo. -- I have set the radius to be the one used for standard negative auras. You can set it to whatever radius you want. local ents = TheSim:FindEntities(x, y, z, TUNING.SANITY_EFFECT_RANGE, {"player"}, {"playerghost", "INLIMBO"}, nil) for i, v in ipairs(ents) do if v and v:IsValid() then -- If any player near them has low HP, drain sanity inst.components.talker:Say("Near a player") if (v.components.health:GetPercent() < .5 or v.components.sanity:GetPercent() < .5) then -- If player health or sanity is less than half inst.components.sanity:DoDelta(-1, true) -- Drain Nibs' sanity inst.components.talker:Say("Low HP/Sanity player, draining sanity") end if v.prefab == "bolt" then -- When near Bolt, gain sanity and do more damage inst.components.sanity:DoDelta(1, true) -- Sanity gain inst.components.talker:Say("Bolt sanity gain") if not inst:HasTag("killmode") and inst.issecretnibs == nil and not inst:HasTag("playerghost") then -- If killmode is not already engaged inst.components.talker:Say("Bolt damage mod") inst.components.combat.damagemultiplier = 1.5 -- Damage buff end elseif v.prefab == "cobalt" then -- Sanity gain around Cobalt inst.components.talker:Say("Bolt sanity gain") inst.components.sanity:DoDelta(1, true) -- "true" disables the pulse on the badge and disables that it plays a sound. end elseif v and not v:IsValid() then -- Turn off damage mod when not around Bolt if not inst:HasTag("killmode") and inst.issecretnibs == nil and not inst:HasTag("playerghost") then -- If killmode is not already engaged inst.components.talker:Say("Not near Bolt, damage multiplier reset") inst.components.combat.damagemultiplier = 1 end end end end) Added a few print statements. Turns out "Near a player" is printing at all times now. Link to comment https://forums.kleientertainment.com/forums/topic/136086-drain-sanity-based-on-another-players-health/#findComment-1522301 Share on other sites More sharing options...
CarlZalph Posted December 14, 2021 Share Posted December 14, 2021 20 hours ago, localcryptid said: Added a few print statements. Turns out "Near a player" is printing at all times now. It's including the player entity itself, exclude it with a check like `if v ~= inst`. 1 Link to comment https://forums.kleientertainment.com/forums/topic/136086-drain-sanity-based-on-another-players-health/#findComment-1522847 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