aboutsummaryrefslogtreecommitdiff
path: root/gamemode/client/hud
diff options
context:
space:
mode:
authorAlexander Pickering <alexandermpickering@gmail.com>2017-01-04 23:27:36 -0500
committerAlexander Pickering <alexandermpickering@gmail.com>2017-01-04 23:27:36 -0500
commit4879eb1d78520ce0ac9b0bb0ef5244cf65ad7c99 (patch)
treeac47724191a8959c19b2408d4da384d64b6098ec /gamemode/client/hud
parent2c4329e2b6e19182a441f79a5c3010011f8ae767 (diff)
downloadartery-4879eb1d78520ce0ac9b0bb0ef5244cf65ad7c99.tar.gz
artery-4879eb1d78520ce0ac9b0bb0ef5244cf65ad7c99.tar.bz2
artery-4879eb1d78520ce0ac9b0bb0ef5244cf65ad7c99.zip
Started refactoring item and inventory system
Diffstat (limited to 'gamemode/client/hud')
-rw-r--r--gamemode/client/hud/cl_healthbar.lua153
1 files changed, 153 insertions, 0 deletions
diff --git a/gamemode/client/hud/cl_healthbar.lua b/gamemode/client/hud/cl_healthbar.lua
new file mode 100644
index 0000000..67a3090
--- /dev/null
+++ b/gamemode/client/hud/cl_healthbar.lua
@@ -0,0 +1,153 @@
+
+hook.Add( "HUDShouldDraw", "HideHUD", function( name )
+ if name == "CHudHealth" then return false end
+end )
+
+--A function that rotates a point around another point
+local function rotatepoint(x,y,cx,cy,rot)
+ rot = math.rad(rot)
+ local cs,sn = math.cos(rot),math.sin(rot)
+ local px = x * cs - y * sn;
+ local py = x * sn + y * cs;
+ return px,py
+end
+
+--Add a function to the draw library to draw elipses for blood
+local segments = 20
+local fade = 0.5
+function draw.DrawElipse(x,y,radius,elong,rotation)
+ rotation = math.rad(rotation)
+ local cir = {}
+ table.insert( cir, { x = x, y = y, u = fade, v = fade } )
+ for i = 0, segments do
+ local a = math.rad( ( i / segments ) * -360 )
+ local xu,yu = math.sin(a),math.cos(a)
+ local xpos = xu * radius * elong
+ local ypos = yu * radius
+ local cs,sn = math.cos(rotation),math.sin(rotation)
+ xpos,ypos = xpos * cs - ypos * sn, xpos * sn + ypos * cs
+ table.insert( cir, {
+ x = x + xpos,
+ y = y + ypos,
+ u = 1,
+ v = 1 } )
+ end
+ surface.DrawPoly( cir )
+end
+
+local width,height = ScrW(),ScrH()
+local padding = height / 32
+local barheight = height / 16
+local bubbles = {}
+local blobs = {}
+local lastpos = 0
+local bubbleradius = height/64
+local delpoint = height
+hook.Add( "Tick", "Hudpaintbloodtick",function()
+ for k,v in pairs(blobs) do
+ if v.y > delpoint then
+ blobs[k] = nil
+ else
+ blobs[k] = {
+ ["x"] = v.x + v.xv,
+ ["y"] = v.y + v.yv,
+ ["xv"] = v.xv,
+ ["yv"] = v.yv + 1,
+ }
+ end
+ end
+ for k,v in pairs(bubbles) do
+ if v.y < height - padding - barheight -bubbleradius then
+ bubbles[k] = nil
+ else
+ local subheight = v.y - (1.5 + math.sin((v.y/4) + (v.x*10)))/5
+ bubbles[k].y = subheight
+ end
+ end
+end)
+
+local lasthealth
+local obarlength = width / 4
+local barlength = obarlength
+local xs,ys = padding,height - padding - barheight
+local bubblespawnrate,bubblespawnchance = 1,0.7
+
+timer.Create("Healthbar_bubble_timer",bubblespawnrate,0,function()
+ if math.random() < bubblespawnchance then
+ local newbubble = {
+ ["x"] = math.random(xs + bubbleradius,barlength-bubbleradius),
+ ["y"] = height - padding + bubbleradius
+ }
+ table.insert(bubbles,newbubble)
+ end
+end)
+
+hook.Add( "HUDPaint", "HUD_DrawHealth", function()
+
+ --Spawn a bunch of blobs if our health has changed
+ local health = LocalPlayer():Health()
+ if lasthealth == nil then
+ lasthealth = health
+ end
+ if health ~= lasthealth then
+ local difference = lasthealth - health
+ barlength = obarlength * (health/100)
+ for i=0,difference*3 do
+ local rtime = math.random()
+ timer.Simple(rtime,function()
+ local yvel = -20 + math.random(10)
+ local xvel = (math.random()*5)
+ local xpos = padding + xs + barlength - difference - 5
+ local ypos = ys + (math.random() * barheight)
+ table.insert(blobs,{
+ x = xpos,
+ y = ypos,
+ xv = xvel,
+ yv = yvel,
+ })
+ end)
+ end
+ lasthealth = health
+ end
+ --Draw the current health thing
+ --Background
+ surface.SetDrawColor(100,100,100,100)
+ surface.DrawRect( xs, ys, obarlength, barheight)
+ --Foreground
+ surface.SetDrawColor( 150, 0, 0, 255 )
+ surface.DrawRect( xs, ys, barlength, barheight )
+
+ --Heighlighting/shadows
+ local heighlightheight = barheight/3
+ for k = 1, heighlightheight do
+ local perc = Lerp(k/heighlightheight,100,0)
+ surface.SetDrawColor( 150+perc, perc, perc, 255)
+ surface.DrawRect( xs, ys+k, barlength, 1)
+ end
+ for k = 1, heighlightheight do
+ local perc = Lerp(k/heighlightheight,0,100)
+ surface.SetDrawColor( 150 - perc, 0, 0, 255)
+ surface.DrawRect(xs, ys+k+(2*heighlightheight), barlength, 1)
+ end
+
+ --Draw bubbles
+ render.SetScissorRect( xs, ys, xs + barlength, ys + barheight, true ) -- Enable the rect
+ surface.SetDrawColor(250,150,150,10)
+ for k,v in pairs(bubbles) do
+ surface.DrawCircle(v.x,v.y,bubbleradius,250,150,150,30)
+ draw.DrawElipse(v.x,v.y,bubbleradius,1,0)
+ end
+ render.SetScissorRect( 0, 0, 0, 0, false ) -- Disable after you are done
+
+ --Draw the animation for blobs
+ surface.SetDrawColor(150,0,0,255)
+ for k,v in pairs(blobs) do
+ --Elongation is based on velocity
+ local elong = (v.yv^2 + v.xv^2)^0.5
+ elong = elong/5
+ elong = math.Clamp(elong,1,3)
+ --Rotation is also based on velcotiy
+ local rot = math.deg(math.atan(v.yv/v.xv))
+ draw.DrawElipse(v.x,v.y,10/elong,elong, rot)
+ end
+end )