Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local Tag="3DHeart"
- local hp=false
- local armor=false
- local LocalPlayer=LocalPlayer
- local heart_model=nil
- local scale=1
- local EyeVectorOffset= Vector(-100,150,0)
- local EyeAngleOffset = Angle(0,180,0)
- local accel=0
- local oldhp=nil
- timer.Create(Tag,0.05,0,function()
- local p = LocalPlayer()
- if not p:IsValid() then return end
- hp = p:Alive() and p:Health() or false
- armor = p:Armor()>0 and p:Armor()
- oldhp=oldhp or hp
- --MsgN("O: ",accel,"\t",hp,"\t",oldhp)
- if not hp then accel=0 oldhp=100 return end
- if oldhp!=hp then
- local diff=oldhp-hp
- if diff > 0 then
- accel=accel+diff*0.01
- end
- end
- accel=(accel<0 and 0) or (accel>1000 and 1000) or accel
- --MsgN("N: ",accel,"\t",hp,"\t",oldhp)
- oldhp=hp
- if not IsValid(heart_model) then
- heart_model=ClientsideModel("models/Items/hevsuit.mdl",RENDERGROUP_OPAQUE)
- heart_model:SetNoDraw(true)
- --heart_model:SetMaterial"brick/brick_model"
- end
- end)
- local function CalcOffset(pos,ang,off)
- return pos + ang:Right() * off.x + ang:Forward() * off.y + ang:Up() * off.z;
- end
- local function DrawHUDScreen()
- if not IsValid(heart_model) or !hp then return end
- accel=accel*0.95
- local RenderPos = EyePos()
- local RenderAng = EyeAngles()
- --local rotatespeed=hp > 100 and 100 or hp < 1 and 1
- --rotatespeed=100-rotatespeed
- cam.Start3D( RenderPos, RenderAng )
- cam.IgnoreZ( true )
- render.SuppressEngineLighting( true )
- render.EnableClipping( true );
- RenderPos=CalcOffset(RenderPos,RenderAng,EyeVectorOffset)
- --RenderAng:RotateAroundAxis(RenderAng:Forward(),EyeAngleOffset.p)
- RenderAng:RotateAroundAxis(RenderAng:Up(),CurTime()%360*100* (1-accel))
- --RenderAng:RotateAroundAxis(RenderAng:Right(),EyeAngleOffset.r)
- heart_model:SetRenderAngles(RenderAng)
- heart_model:SetRenderOrigin(RenderPos)
- local mn, mx = heart_model:GetRenderBounds()
- local Up = (mx-mn):GetNormal()
- local Bottom = RenderPos + mn;
- local Top = RenderPos + mx;
- local Fraction = hp>100 and 1 or hp < 1 and 0 or hp/100
- local Lerped = LerpVector( Fraction, Top, Bottom )
- local normal = -EyeAngles():Up()
- local distance = normal:Dot( Lerped );
- --heart_model:SetModelScale(Vector()*(1+math.sin(CurTime()*5)*0.1))
- -- render.SetAmbientLight(255,255,255)
- render.SetBlend( 1 ) -- ugly with less than 1
- render.PushCustomClipPlane( -normal, -distance );
- --heart_model:SetMaterial""
- heart_model:DrawModel()
- render.PopCustomClipPlane()
- render.SetBlend( 0.7+math.sin(CurTime())*0.3 )
- --render.ResetModelLighting()
- render.PushCustomClipPlane( normal, distance );
- --heart_model:SetMaterial"models/debug/debugwhite"
- render.SetColorModulation( 5,0.4,0.4)
- heart_model:DrawModel()
- render.PopCustomClipPlane()
- render.EnableClipping( false )
- render.SuppressEngineLighting( false )
- cam.IgnoreZ( false )
- cam.End3D()
- end
- hook.Add("RenderScreenspaceEffects",Tag, DrawHUDScreen)
Advertisement
Add Comment
Please, Sign In to add comment