lua/caf/addons/client/lifesupport.lua
local LS = {}
local this = LS
local status = false
--Local Stuff
local Display_temperature = CreateClientConVar( "LS_Display_Temperature", "K", true, false )
local Display_hud = CreateClientConVar( "LS_Display_HUD", "1", true, false )
--local ls_sb_mode = false
surface.CreateFont( "LS3HudHeader", {font = "Verdana", size = 18, weight = 500} )
surface.CreateFont( "LS3HudSubtitle", {font = "Verdana", size = 15, weight = 500} )
surface.CreateFont( "LS3HudSubSubtitle", {font = "Verdana", size = 12, weight = 500} )
--Temperate
local Temp_Min = 0
local FairTemp_Min = 283
local FairTemp_Max = 308
local Temp_Max = 546
--Hook Values
local ls_environment = {}
ls_environment.o2 = 0
ls_environment.temperature = 0
local ls_suit = {}
ls_suit.o2 = 0;
ls_suit.coolant = 0;
ls_suit.energy = 0;
local ScH = ScrH()
local MidW = ScrW() / 2
local huds = {}
--Hud 1
local hud1 = {}
hud1.ScH = ScH;
hud1.MidW = MidW;
hud1.Left = hud1.MidW - 80 --70
hud1.Left2 = hud1.MidW - 90 --80
hud1.Right = hud1.MidW + 80 --70
hud1.H1 = hud1.ScH / 8
hud1.H2 = hud1.ScH - hud1.H1
hud1.H3 = hud1.H1 - 5
hud1.TH = { hud1.H2 + 5, hud1.H2 + 20, hud1.H2 + 35, hud1.H2 + 50 }
hud1.Font = "LS3HudHeader"
huds[1] = hud1
hud1 = nil
--Hud2
local hud2 = {}
hud2.ScH = ScH;
hud2.MidW = MidW;
hud2.Width = 224
hud2.Height = 128
hud2.Bottom = hud2.ScH - 32
hud2.Top = hud2.Bottom - hud2.Height
hud2.HalfWidth = math.Round(hud2.Width/2)
hud2.Left = hud2.MidW - hud2.HalfWidth
hud2.Rounding = 8
hud2.Top2 = hud2.ScH + 8
hud2.Font = "LS3HudHeader"
hud2.Font2 = "LS3HudSubtitle"
hud2.Font3 = "LS3HudSubSubtitle"
huds[2] = hud2
hud2 = nil
local colors = {}
colors.White = Color(225,225,225,255)
colors.Black = Color(0,0,0,100)
colors.Cold = Color(0,225,255,255)
colors.Hot = Color(225,0,0,255)
colors.Warn = Color(255,165,0,255)
colors.Grey = Color(150, 150, 150, 255)
colors.Green = Color(0, 225, 0, 255);
local MaxAmounts = 4000
local MaxAmountsDivide = MaxAmounts/100
local function lifesupport_HUDPaint()
if GetConVarString('cl_hudversion') == "" then
local ls_sb_mode = false;
if CAF.GetAddon("Spacebuild") and CAF.GetAddon("Spacebuild").GetStatus() then
ls_sb_mode = true;
end
local ply = LocalPlayer()
if not ply or not ply:Alive() then return end
local hud_to_use = Display_hud:GetInt()
if hud_to_use ~= 0 then
if not ls_sb_mode then
if ply:WaterLevel() > 2 then
local Air = ls_suit.o2 / MaxAmountsDivide
local valcol = colors.White
if Air < 4 then valcol = colors.Warn end
local hud = huds[1]
local air_time_left = math.floor(ls_suit.o2 / 5)
draw.RoundedBox( 8, hud.Left2 , hud.H2, 180, 20, colors.Black)
draw.DrawText( CAF.GetLangVar("Air")..":", hud.Font, hud.Left, hud.H2 + 5, colors.White, 0 )
draw.DrawText( tostring(Air).."% ("..tostring(air_time_left).."s)", hud.Font, hud.Right,hud.H2 + 5, valcol, 2 )
end
else
if ply:WaterLevel() > 2 or ls_environment.o2 < 5 or (ls_environment.temperature > 0 and not (ls_environment.temperature >= FairTemp_Min and ls_environment.temperature <= FairTemp_Max)) or (ply.LSHudOn and ply.LSHudOn == true) then
if hud_to_use == 2 then
local hud = huds[2]
--[[
Draw Left Side
]]
draw.RoundedBox( hud.Rounding, hud.Left , hud.Top, hud.HalfWidth, hud.Height, colors.Black)
surface.SetFont( hud.Font )
local width, height = surface.GetTextSize(CAF.GetLangVar("Suit"))
if width == nil or height == nil then return end
local top = hud.Top
draw.DrawText( CAF.GetLangVar("Suit"), hud.Font, hud.Left + 64 - math.floor(width/2) , top , colors.White, 0 )
top = top + 16
--Oxygen
--top = top + 2
draw.DrawText( CAF.GetLangVar("Air"), hud.Font2, hud.Left + 16, top , colors.White, 0 )
top = top + 16 --18
local Air = ls_suit.o2 / MaxAmountsDivide
top = top + 4
draw.RoundedBox( 0, hud.Left + 16 , top , 8, 10, colors.Hot) -- 0 -> 10
draw.RoundedBox( 0, hud.Left + 24 , top , 12, 10, colors.Warn) -- 10 -> 25
draw.RoundedBox( 0, hud.Left + 36 , top , 60, 10, colors.Green) -- 25 -> 100
surface.SetFont( hud.Font3 )
local air_text = tostring(Air).."%"
width, height = surface.GetTextSize(air_text)
draw.DrawText( air_text, hud.Font3, hud.Left + 16 + 40 - math.floor(width/2) , top , colors.White, 0 ) -- top +6
-- =((8 + 12 + 60)/2)
if Air > 100 then
Air = 100
end
local air_pos = hud.Left + 16 + math.Round(Air * 0.8) --1.6
draw.RoundedBox( 0, air_pos , top -2, 1, 10, colors.Grey)
draw.RoundedBox( 2, air_pos - 3 , top - 4, 6, 6, colors.Grey)
top = top + 8
draw.RoundedBox( 2, air_pos - 3 , top, 6, 6, colors.Grey)
top = top + 4
--Energy
--top = top + 2
draw.DrawText( CAF.GetLangVar("Energy"), hud.Font2, hud.Left + 16, top , colors.White, 0 )
top = top + 16
local Energy = ls_suit.energy / MaxAmountsDivide
top = top + 4
draw.RoundedBox( 0, hud.Left + 16 , top , 8, 10, colors.Hot) -- 0 -> 10
draw.RoundedBox( 0, hud.Left + 24 , top , 12, 10, colors.Warn) -- 10 -> 25
draw.RoundedBox( 0, hud.Left + 36 , top , 60, 10, colors.Green) -- 25 -> 100
surface.SetFont( hud.Font3 )
local energy_text = tostring(Energy).."%"
width, height = surface.GetTextSize(energy_text)
draw.DrawText( energy_text, hud.Font3, hud.Left + 16 + 40 - math.floor(width/2) , top , colors.White, 0 )
if Energy > 100 then
Energy = 100
end
local energy_pos = hud.Left + 16 + math.Round(Energy * 0.8)
draw.RoundedBox( 0, energy_pos , top , 1, 10, colors.Grey)
draw.RoundedBox( 2, energy_pos - 3 , top - 4, 6, 6, colors.Grey)
top = top + 8
draw.RoundedBox( 2, energy_pos - 3 , top, 6, 6, colors.Grey)
top = top + 4
--Coolant
--top = top + 2
draw.DrawText( CAF.GetLangVar("Coolant"), hud.Font2, hud.Left + 16, top , colors.White, 0 )
top = top + 16
local Coolant = ls_suit.coolant / MaxAmountsDivide
top = top + 4
draw.RoundedBox( 0, hud.Left + 16 , top , 33, 10, colors.Hot) -- 0 -> 10
draw.RoundedBox( 0, hud.Left + 24 , top , 12, 10, colors.Warn) -- 10 -> 25
draw.RoundedBox( 0, hud.Left + 36 , top , 60, 10, colors.Green) -- 25 -> 100
surface.SetFont( hud.Font3 )
local coolant_text = tostring(Coolant).."%"
width, height = surface.GetTextSize(coolant_text)
draw.DrawText( coolant_text, hud.Font3, hud.Left + 16 + 40 - math.floor(width/2) , top , colors.White, 0 )
if Coolant > 100 then
Coolant = 100
end
local coolant_pos = hud.Left + 16 + math.Round(Coolant * 0.8)
draw.RoundedBox( 0, coolant_pos , top , 1, 10, colors.Grey)
draw.RoundedBox( 2, coolant_pos - 3 , top - 4, 6, 6, colors.Grey)
top = top + 8
draw.RoundedBox( 2, coolant_pos - 3 , top, 6, 6, colors.Grey)
top = top + 4
--[[
Draw Right Side
]]
top = hud.Top
draw.RoundedBox( hud.Rounding, hud.Left + hud.HalfWidth , hud.Top, hud.HalfWidth, hud.Height, colors.Black)
surface.SetFont( hud.Font )
width, height = surface.GetTextSize(CAF.GetLangVar("Environment"))
draw.DrawText( CAF.GetLangVar("Environment"), hud.Font, hud.Left + hud.HalfWidth + 64 - math.floor(width/2), top , colors.White, 0 )
top = top + 16
--Temperature
--top = top + 2
draw.DrawText( CAF.GetLangVar("Temperature"), hud.Font2, hud.Left + hud.HalfWidth + 16, top , colors.White, 0 )
top = top + 16 --18
top = top + 4
draw.RoundedBox( 0, hud.Left + hud.HalfWidth + 16 , top , 32, 10, colors.Cold) -- 0 -> 273
draw.RoundedBox( 0, hud.Left + hud.HalfWidth + 16 + 32 , top , 3, 10, colors.Warn) -- 273 -> 283
draw.RoundedBox( 0, hud.Left + hud.HalfWidth + 16 + 32 + 3 , top , 6, 10, colors.Green) -- 283 -> 308
draw.RoundedBox( 0, hud.Left + hud.HalfWidth + 16 + 32 + 3 + 6 , top , 3, 10, colors.Warn) -- 308 ->318
draw.RoundedBox( 0, hud.Left + hud.HalfWidth + 16 + 32 + 3 + 6 + 3 , top , 20, 10, colors.Hot) -- 318 ->546
surface.SetFont( hud.Font3 )
--local air_text = tostring(Air).."%"
--width, height = surface.GetTextSize(air_text)
--draw.DrawText( air_text, hud.Font3, hud.Left + hud.HalfWidth + 16 + 40 - math.floor(width/2) , top , colors.White, 0 ) -- top +6
-- =((8 + 12 + 60)/2)
local temp = ls_environment.temperature
temp = temp - 136.5
if temp > 444.6 then
temp = 444.6
elseif temp < 0 then
temp = 0
end
local temp2 = (temp / 273) * 100
local temp_pos = hud.Left + hud.HalfWidth + 16 + math.Round(temp2 * 0.8) --1.6
draw.RoundedBox( 0, temp_pos , top -2, 1, 10, colors.Grey)
draw.RoundedBox( 2, temp_pos - 3 , top - 4, 6, 6, colors.Grey)
top = top + 8
draw.RoundedBox( 2, temp_pos - 3 , top, 6, 6, colors.Grey)
top = top + 4
--Pressure
--top = top + 2
draw.DrawText( CAF.GetLangVar("Pressure"), hud.Font2, hud.Left + hud.HalfWidth + 16, top , colors.White, 0 )
top = top + 16
local Energy = ls_suit.energy / MaxAmountsDivide
top = top + 4
draw.RoundedBox( 0, hud.Left + 16 + hud.HalfWidth , top , 8, 10, colors.Hot) -- 0 -> 10
draw.RoundedBox( 0, hud.Left + 24 + hud.HalfWidth , top , 12, 10, colors.Warn) -- 10 -> 25
draw.RoundedBox( 0, hud.Left + 36 + hud.HalfWidth , top , 60, 10, colors.Green) -- 25 -> 100
surface.SetFont( hud.Font3 )
local energy_text = tostring(Energy).."%"
width, height = surface.GetTextSize(energy_text)
draw.DrawText( energy_text, hud.Font3, hud.Left + hud.HalfWidth + 16 + 40 - math.floor(width/2) , top , colors.White, 0 )
if Energy > 100 then
Energy = 100
end
local energy_pos = hud.Left + hud.HalfWidth + 16 + math.Round(Energy * 0.8)
draw.RoundedBox( 0, energy_pos , top , 1, 10, colors.Grey)
draw.RoundedBox( 2, energy_pos - 3 , top - 4, 6, 6, colors.Grey)
top = top + 8
draw.RoundedBox( 2, energy_pos - 3 , top, 6, 6, colors.Grey)
top = top + 4
--Habitable
--top = top + 2
draw.DrawText( CAF.GetLangVar("Habitable"), hud.Font2, hud.Left + hud.HalfWidth + 16, top , colors.White, 0 )
top = top + 16
local o2 = ls_environment.o2
top = top + 4
draw.RoundedBox( 0, hud.Left + 16 + hud.HalfWidth , top , 4, 10, colors.Hot) -- 0 -> 5
draw.RoundedBox( 0, hud.Left + 20 + hud.HalfWidth , top , 8, 10, colors.Warn) -- 5 -> 15
draw.RoundedBox( 0, hud.Left + 28 + hud.HalfWidth , top , 68, 10, colors.Green) -- 15 -> 100
surface.SetFont( hud.Font3 )
--local coolant_text = tostring(Coolant).."%"
--width, height = surface.GetTextSize(coolant_text)
--draw.DrawText( coolant_text, hud.Font3, hud.Left + hud.HalfWidth + 16 + 40 - math.floor(width/2) , top , colors.White, 0 )
if o2 > 100 then
o2 = 100
end
local hab_pos = hud.Left + hud.HalfWidth + 16 + math.Round( o2 * 0.8)
draw.RoundedBox( 0, hab_pos , top , 1, 10, colors.Grey)
draw.RoundedBox( 2, hab_pos - 3 , top - 4, 6, 6, colors.Grey)
top = top + 8
draw.RoundedBox( 2, hab_pos - 3 , top, 6, 6, colors.Grey)
top = top + 4
else
local hud = huds[1]
local Temp = ls_environment.temperature
local Air = ls_suit.o2 / MaxAmountsDivide
local Coolant = ls_suit.coolant / MaxAmountsDivide
local Energy = ls_suit.energy / MaxAmountsDivide
local ValCol = { colors.White, colors.White, colors.White, colors.White }
if Temp < FairTemp_Min then ValCol[1] = colors.Cold
elseif Temp > FairTemp_Max then ValCol[1] = colors.Hot
end
if Air < 4 then ValCol[2] = colors.Warn end
if Coolant < 4 then ValCol[3] = colors.Warn end
if Energy < 4 then ValCol[4] = colors.Warn end
draw.RoundedBox( 8, hud.Left2 , hud.H2, 180, hud.H3, colors.Black)
local d_temp = Temp;
local d_temp_type = "K";
if string.upper(Display_temperature:GetString()) == "C" then
d_temp = Temp - 273
d_temp_type = "C"
elseif string.upper(Display_temperature:GetString()) == "F" then
d_temp = (Temp * (9/5)) - 459.67
d_temp_type = "F"
end
local air_time_left = math.floor(ls_suit.o2 / 5)
local energy_time_left = math.floor(ls_suit.energy / 5)
local coolant_time_left = math.floor(ls_suit.coolant / 5)
draw.DrawText( CAF.GetLangVar("Temperature")..":", hud.Font, hud.Left, hud.TH[1], colors.White,0 )
draw.DrawText( tostring(d_temp).." "..d_temp_type, hud.Font, hud.Right,hud.TH[1], ValCol[1], 2 )
draw.DrawText( CAF.GetLangVar("Air")..":", hud.Font, hud.Left, hud.TH[2], colors.White,0 )
draw.DrawText( tostring(Air).."% ("..tostring(air_time_left).."s)", hud.Font, hud.Right,hud.TH[2], ValCol[2], 2 )
draw.DrawText( CAF.GetLangVar("Coolant")..":", hud.Font, hud.Left, hud.TH[3], colors.White,0 )
draw.DrawText( tostring(Coolant).."% ("..tostring(coolant_time_left).."s)", hud.Font, hud.Right,hud.TH[3], ValCol[3], 2 )
draw.DrawText( CAF.GetLangVar("Energy")..":", hud.Font, hud.Left, hud.TH[4], colors.White,0 )
draw.DrawText( tostring(Energy).."% ("..tostring(energy_time_left).."s)", hud.Font, hud.Right,hud.TH[4], ValCol[4], 2 )
end
end
end
end
end
end
local function LS_umsg_hook1( um )
ls_environment.o2 = um:ReadFloat()
ls_suit.o2 = um:ReadShort()
ls_environment.temperature = um:ReadShort()
ls_suit.coolant = um:ReadShort()
ls_suit.energy = um:ReadShort()
end
usermessage.Hook("LS_umsg1", LS_umsg_hook1)
local function LS_umsg_hook2( um )
ls_suit.o2 = um:ReadShort()
end
usermessage.Hook("LS_umsg2", LS_umsg_hook2)
--The Class
--[[
The Constructor for this Custom Addon Class
]]
function LS.__Construct()
hook.Add("HUDPaint", "LS_Core_HUDPaint", lifesupport_HUDPaint)
status = true
CAF.AddHook("think3", lifesupport_think)
local RD = CAF.GetAddon("Resource Distribution")
RD.AddProperResourceName("energy", CAF.GetLangVar("Energy"))
RD.AddProperResourceName("water", CAF.GetLangVar("Water"))
RD.AddProperResourceName("nitrogen", CAF.GetLangVar("Nitrogen"))
RD.AddProperResourceName("hydrogen", CAF.GetLangVar("Hydrogen"))
RD.AddProperResourceName("oxygen", CAF.GetLangVar("Oxygen"))
RD.AddProperResourceName("carbon dioxide", CAF.GetLangVar("Carbon Dioxide"))
RD.AddProperResourceName("steam", CAF.GetLangVar("Steam"))
RD.AddProperResourceName("heavy water", CAF.GetLangVar("Heavy Water"))
RD.AddProperResourceName("liquid nitrogen", CAF.GetLangVar("Liquid Nitrogen"))
return true
--return false , CAF.GetLangVar("No Implementation yet")
end
--[[
The Destructor for this Custom Addon Class
]]
function LS.__Destruct()
hook.Remove("HUDPaint", "LS_Core_HUDPaint")
CAF.RemoveHook("think3", lifesupport_think)
status = false
return true
--return false , CAF.GetLangVar("No Implementation yet")
end
--[[
Get the required Addons for this Addon Class
]]
function LS.GetRequiredAddons()
return {"Resource Distribution"}
end
--[[
Get the Boolean Status from this Addon Class
]]
function LS.GetStatus()
return status
end
--[[
Get the Version of this Custom Addon Class
]]
function LS.GetVersion()
return 3.1, CAF.GetLangVar("Beta")
end
local isuptodatecheck;
--[[
Update check
]]
function LS.IsUpToDate(callBackfn)
if not CAF.HasInternet then
return
end
if isuptodatecheck ~= nil then
callBackfn(isuptodatecheck);
return
end
--[[http.Get("http://www.snakesvx.net/versions/ls.txt","",
function(html,size)
local version = tonumber(html);
if(version) then
local latest = version;
if(latest > LS.GetVersion()) then
isuptodatecheck = false;
callBackfn(false)
else
isuptodatecheck = true;
callBackfn(true)
end
end
end
);]]
end
--[[
Get any custom options this Custom Addon Class might have
]]
function LS.GetExtraOptions()
return {}
end
--[[
Gets a menu from this Custom Addon Class
]]
function LS.GetMenu(menutype, menuname) --Name is nil for main menu, String for others
local data = {}
if not menutype then
--Create Info Menu
data["Info"] = {}
local tmp = data["Info"];
tmp["Wiki Home"] = {}
tmp["Wiki Home"].localurl = "test/test.html";
tmp["Wiki Home"].interneturl = "http://www.snakesvx.net/index.php/module_Wiki/title_Garrysmod_Info_Life_Support";
--Create Help Menu
data["Help"] = {}
tmp = data["Help"];
tmp["Wiki Home"] = {}
tmp["Wiki Home"].localurl = "test/test.html";
tmp["Wiki Home"].interneturl = "http://www.snakesvx.net/index.php/module_Wiki/title_Garrysmod_Info_Life_Support";
end
return data
end
--[[
Get the Custom String Status from this Addon Class
]]
function LS.GetCustomStatus()
return ; --CAF.GetLangVar("Not Implemented Yet")
end
function LS.AddResourcesToSend()
end
--[[
Returns a table containing the Description of this addon
]]
function LS.GetDescription()
return {
"Life Support 3",
"",
""
}
end
CAF.RegisterAddon("Life Support", LS, "2")