Ulysses
General => Developers Corner => Topic started by: Suicidal Dog on May 07, 2017, 08:22:08 AM
-
I am trying to make a sliding health bar for a darkrp/starwarsrp server and I am having an issue with players loading in and then it causing an error because the player is invalid.
local function healthBar()
local plyHealth = LocalPlayer():GetMaxHealth()
smoothHealth = Lerp( 5 * FrameTime(), plyHealth, LocalPlayer():Health() )
draw.RoundedBox( 0, 19, ScrH() - 303, 86, smoothHealth *286 / 100, Color( 200, 50, 50, 255 ))
draw.RoundedBox( 0, 19, ScrH() - 183, 86, 56, Color( 0, 0, 0, 200 ))
surface.SetDrawColor( Color( 200, 200, 200, 255 ) )
surface.DrawOutlinedRect( 15, ScrH() - 180, 94, 50 )
end
That is my current code and all it does is make the health bar jitter as soon as they go below their max health, I have also tried:
local smoothHealth = LocalPlayer():GetMaxHealth()
local function healthBar()
smoothHealth = Lerp( 5 * FrameTime(), smoothHealth, LocalPlayer():Health() )
draw.RoundedBox( 0, 19, ScrH() - 303, 86, smoothHealth *286 / 100, Color( 200, 50, 50, 255 ))
draw.RoundedBox( 0, 19, ScrH() - 183, 86, 56, Color( 0, 0, 0, 200 ))
surface.SetDrawColor( Color( 200, 200, 200, 255 ) )
surface.DrawOutlinedRect( 15, ScrH() - 180, 94, 50 )
end
the second one works but only if the player is loaded in and isn't invalid as it gives me the error:[ERROR] addons/darkrpmodification/lua/darkrp_modules/tcb_hud_1/cl_main.lua:15: Tried to use a NULL entity!
1. GetMaxHealth - [C]:-1
2. unknown - addons/darkrpmodification/lua/darkrp_modules/tcb_hud_1/cl_main.lua:15
3. doInclude - [C]:-1
4. loadModules - gamemodes/darkrp/gamemode/libraries/modificationloader.lua:102
5. Call - gamemodes/darkrp/gamemode/libraries/modificationloader.lua:147
6. unknown - gamemodes/darkrp/gamemode/cl_init.lua:56
Thats to do with the fact the player isn't valid yet as they haven't finished loading so it can't actually get their max health and since it's starwarsrp and health changes due to job I can't just set it to a static value. I want to get the players max health and have smoothHealth be that value so then the Lerp can make it slide to their health and that it scales with their health but I cannot seem to find a working way of doing it so I have come here.
-
Just have the function return nothing and not even try to draw a bar until they are loaded and valid.
you can do this a couple ways. You can check the existence of the value you are checking for and return out of the function if it's non-existent, or you can create some kind of ready check that is set on the player when they fully load in and have clientside code check to see if they're ready. (That's what I do in my gamemodes)
-
I've had this issue before and never actually find a fix if you could show me how and label it so I can understand it myself.
-
Please can someone respond I need a fix and ASAP and I am currently rushed for time lately so I can't do much research into these things.
-
I gave you the way to do it. Please do not come on here demanding that people do work for you. This forum is for getting assistance with things, not for having people do things for you.
If you can't be bothered to do the research yourself.. then no one else can be bothered to do it for you.
-
There are several ways, each with pros/cons.
Perhaps you could use (http://wiki.garrysmod.com/favicon.ico) PLAYER:Loadout (http://wiki.garrysmod.com/page/PLAYER/Loadout) to call that function then return as normal to prevent it from modifying loadout weapons.
-
I gave you the way to do it. Please do not come on here demanding that people do work for you. This forum is for getting assistance with things, not for having people do things for you.
If you can't be bothered to do the research yourself.. then no one else can be bothered to do it for you.
Dude I didn't mean to seem bossy and 'demand' anything but I literally have the most important time of my life in these few weeks with GCSEs and after doing stuff for school I'm tired and can't focus properly but now I've thought about it I've probably figured out an issue so don't jump to a conclusion I am too lazy to do things myself.
-
When trying to do this is still doesn't work and sets the hud to an old look upon joining until I resave the file so it updates on the player.
if IsValid( LocalPlayer() ) then
local smoothHealth = LocalPlayer():GetMaxHealth()
end
local function healtharmorBase()
draw.RoundedBox( 0, 0, ScrH () - 75 - 10, 450, 75, Color( 0, 0, 0, 200 ) )
draw.RoundedBox( 0, 0, ScrH() - 85 - 60, 350, 50, Color( 0, 0, 0, 200 ))
surface.SetDrawColor( Color( 255, 255, 255, 255 ) )
surface.DrawOutlinedRect( -1, ScrH() - 83, 449, 71 )
surface.DrawOutlinedRect( -1, ScrH() - 143, 349, 46 )
end
local function healtharmorBar()
smoothHealth = Lerp( 5 * FrameTime(), smoothHealth, LocalPlayer():Health() )
draw.RoundedBox( 0, 0, ScrH() - 75- 5, 446 * smoothHealth /100, 65, Color( 200, 50, 50 ))
end
-
Code outside of functions gets called when the file is loaded.
Your valid checks need to be in the functions where the information is needed.
-
This one isn't working but the 2nd one works on a different server I've got where I was doing gamemode stuff.
local function healtharmorBar()
maxHealth = LocalPlayer():GetMaxHealth()
smoothHealth = Lerp( 5 * FrameTime(), 100, LocalPlayer():Health() )
surface.SetDrawColor( 200, 50, 50, 255 )
--surface.DrawTexturedRect( 0, ScrH() - 75- 5, 445 * ( LocalPlayer():Health() / LocalPlayer():GetMaxHealth() ) , 65)
draw.RoundedBox( 0, 0, ScrH() - 85 - 55, 345 * smoothHealth / 100, 40,Color( 200, 50, 50 ))
surface.SetDrawColor( 50, 50, 255, 255 )
--surface.DrawTexturedRect( 0, ScrH() - 85 - 55, 345 * ( LocalPlayer():Health() / 100 ) , 40)
draw.RoundedBox( 0, 0, ScrH() - 70 - 11, 245 * ( LocalPlayer():Armor() / 100 ), 16, Color( 30, 30, 255 ) )
end
A short video on what happens when I try the first one on the screen: https://www.youtube.com/watch?v=02dwOjvSiIw&feature=youtu.be
From that video you see the health bar was jumping back and forth between random points it seems, now I've no idea what that could be caused by.
local smoothHealth = 250
local function HealthBar()
smoothHealth = Lerp( 5 * FrameTime(), smoothHealth, LocalPlayer():Health() )
draw.RoundedBox( 0, 12, ScrH() / 2 - 132, 96, 264, Color( 0, 0, 0, 175 ) )
draw.RoundedBox( 0, 19, ScrH() / 2 - 124.25, 82, smoothHealth, Color( 200, 50, 50, 255 ) )
draw.RoundedBox( 0, 12, ScrH() / 2 - 17.5, 96, 35, Color( 0, 0, 0, 175 ) )
surface.SetDrawColor( Color( 200, 200, 200, 255 ) )
surface.DrawOutlinedRect( 15, ScrH() / 2 - 129, 90, 258 )
surface.DrawOutlinedRect( 15, ScrH() / 2 - 16, 90, 30 )
draw.SimpleTextOutlined( LocalPlayer():Health(), "CloseCaption_Bold", 60, ScrH() / 2 - 1, Color( 255, 255, 255 ), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER , 1, Color( 0, 0, 0, 100 ) )
end