mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
266 lines
8.8 KiB
Lua
266 lines
8.8 KiB
Lua
--[[
|
|
| This file was obtained through the combined efforts
|
|
| of Madbluntz & Plymouth Antiquarian Society.
|
|
|
|
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
|
| Maloy, DrPepper10 @ RIP, Atle!
|
|
|
|
|
| Visit for more: https://plymouth.thetwilightzone.ru/
|
|
--]]
|
|
|
|
-- Holds temperature and wind
|
|
--[[-------------------------------------------------------------------------
|
|
Temperature is not universal. A few contries cling on to fahrenheit,
|
|
so we need another function to display the temperature correctly.
|
|
|
|
StormFox runs on celsius, but can convert the temperature to whatever you wish.
|
|
|
|
Clients have to use these functions:
|
|
StormFox2.Temperature.GetDisplay() -- Returns the temperature in what their setting is set to.
|
|
StormFox2.Temperature.GetDisplaySymbol() -- Returns the temperature symbol for their setting.
|
|
StormFox2.Temperature.GetDisplayDefault() -- Returns the default temperature setting for their country.
|
|
StormFox2.Temperature.GetDisplayType() -- Returns the temperature setting clients have set to.
|
|
|
|
Fun facts:
|
|
At -90C, we need specialized air or our brain "forgets" to breathe.
|
|
You'll be unconscious in an hour in 10C water. Dead in 3.
|
|
At -180C oxygen will liquidfy.
|
|
Coldest recorded temp on Earth is -90C
|
|
|
|
---------------------------------------------------------------------------]]
|
|
StormFox2.Temperature = {}
|
|
local convert_from,convert_to = {},{}
|
|
local p1,p2,p3,p4,p5 = 3 / 2, 33 / 100, 4 / 5, 21 / 40,240 / 54
|
|
convert_to["fahrenheit"] = function(nC) return nC * 1.8 + 32 end
|
|
convert_to["kelvin"] = function(nC) return nC + 273.15 end
|
|
convert_to["rankine"] = function(nC) return (nC + 273.15) * 1.8 end
|
|
convert_to["delisle"] = function(nC) return (100 - nC) * p1 end
|
|
convert_to["newton"] = function(nC) return nC * p2 end
|
|
convert_to["réaumur"] = function(nC) return nC * p3 end
|
|
convert_to["rømer"] = function(nC) return nC * p4 + 7.5 end
|
|
convert_to["wedgwood"] = function(nC) return (nC - 580.8) * p5 end
|
|
convert_to["gas_mark"] = function(nC)
|
|
if nC >= 135 then
|
|
return 1 + (nC - 135) / 13.9
|
|
else
|
|
return 1 / ((135 - nC) / 13.9 * 2)
|
|
end
|
|
end
|
|
convert_to["banana"] = function(nC) -- 380 kJ of energy in an average size banana. Takes about 344,49kJ to heat up an avage room by 10c. 1 banana = 1.1c
|
|
return 10 * (nC - 10) / 11
|
|
end
|
|
local p1,p2,p3,p4,p5,p6 = 5 / 9, 2 / 3, 100 / 33, 5 / 4, 40 / 21,54 / 240
|
|
convert_from["fahrenheit"] = function(nF) return (nF - 32) / 1.8 end
|
|
convert_from["kelvin"] = function(nK) return nK - 273.15 end
|
|
convert_from["rankine"] = function(nR) return (nR - 491.67) * p1 end
|
|
convert_from["delisle"] = function(nD) return 100 - nD * p2 end
|
|
convert_from["newton"] = function(nN) return nN * p3 end
|
|
convert_from["réaumur"] = function(nR) return nR * p4 end
|
|
convert_from["rømer"] = function(nR) return (nR - 7.5) * p5 end
|
|
convert_from["wedgwood"] = function(nW) return (nW * p6) + 580.8 end
|
|
convert_from["gas_mark"] = function(nG)
|
|
if nG >= 1 then
|
|
return 0.1 * (139 * nG + 1211)
|
|
else
|
|
return 135 - 6.95 / nG
|
|
end
|
|
end
|
|
convert_from["banana"] = function(nB)
|
|
return 1.1 * nB + 10
|
|
end
|
|
local symbol = {
|
|
["celsius"] = "°C",
|
|
["fahrenheit"] = "°F",
|
|
["rankine"] = "°R",
|
|
["delisle"] = "°D",
|
|
["newton"] = "°N",
|
|
["réaumur"] = "°Ré",
|
|
["rømer"] = "°Rø",
|
|
["wedgwood"] = "°W",
|
|
["gas_mark"] = "°G",
|
|
["banana"] = "°B",
|
|
["kelvin"] = "K"
|
|
}
|
|
--[[<Shared>------------------------------------------------------------------
|
|
Returns the current temperature. Valid temperatures:
|
|
- celsius : default
|
|
- fahrenheit
|
|
- kelvin
|
|
- rankine
|
|
- delisle
|
|
- newton
|
|
- réaumur
|
|
- rømer
|
|
---------------------------------------------------------------------------]]
|
|
local tempOverwrite
|
|
|
|
---Returns the current temperature. sType can be "celsius" (default), "fahrenheit", "kelvin" .. ect
|
|
---@param sType? string
|
|
---@return Color
|
|
---@shared
|
|
function StormFox2.Temperature.Get(sType)
|
|
local n = tempOverwrite or StormFox2.Data.Get( "Temp", 20 )
|
|
if not sType or sType == "celsius" then return n end
|
|
if not convert_to[sType] then
|
|
StormFox2.Warning("Invalid temperature type [" .. tostring(sType) .. "].", true)
|
|
end
|
|
return convert_to[sType](n)
|
|
end
|
|
--[[<Shared>-----------------------------------------------------------------
|
|
Returns the list of valid temperatures.
|
|
- celsius : default
|
|
- fahrenheit
|
|
- kelvin
|
|
- rankine
|
|
- delisle
|
|
- newton
|
|
- réaumur
|
|
- rømer
|
|
---------------------------------------------------------------------------]]
|
|
|
|
---Returns all temperature units supported.
|
|
---@return table
|
|
---@shared
|
|
function StormFox2.Temperature.GetTypes()
|
|
local t = table.GetKeys(convert_to)
|
|
table.insert(t,"celsius")
|
|
return t
|
|
end
|
|
|
|
--[[<Shared>-----------------------------------------------------------------
|
|
Converts temperature between two types
|
|
Valid temperatures:
|
|
- celsius : default
|
|
- fahrenheit
|
|
- kelvin
|
|
- rankine
|
|
- delisle
|
|
- newton
|
|
- réaumur
|
|
- rømer
|
|
- wedgwood
|
|
---------------------------------------------------------------------------]]
|
|
|
|
---Converts temperature from one unit to another. E.g StormFox2.Temperature.Convert("celsius","fahrenheit",0) -> 32.
|
|
---@param sTypeFrom string
|
|
---@param sTypeTo string
|
|
---@param nNumber number
|
|
---@return number
|
|
---@shared
|
|
function StormFox2.Temperature.Convert(sTypeFrom,sTypeTo,nNumber)
|
|
if sTypeFrom and sTypeFrom ~= "celsius" then
|
|
if not convert_from[sTypeFrom] then
|
|
error("Invalid temperature type [" .. sTypeFrom .. "].")
|
|
end
|
|
nNumber = convert_from[sTypeFrom](nNumber)
|
|
end
|
|
if sTypeTo and sTypeTo ~= "celsius" then
|
|
if not convert_to[sTypeTo] then
|
|
error("Invalid temperature type [" .. sTypeTo .. "].")
|
|
end
|
|
nNumber = convert_to[sTypeTo](nNumber)
|
|
end
|
|
return nNumber
|
|
end
|
|
|
|
if SERVER then
|
|
---Sets the temperature in ceilsius. Second argument is the lerp time in seconds (default: 2).
|
|
---@param nCelsius number
|
|
---@param nLerpTime? number
|
|
---@server
|
|
function StormFox2.Temperature.Set(nCelsius,nLerpTime)
|
|
if nCelsius < -273.15 then -- ( In space, there are 270.45 C )
|
|
nCelsius = -273.15
|
|
end
|
|
StormFox2.Network.Set("Temp",nCelsius,nLerpTime or 2 * StormFox2.Time.GetSpeed_RAW())
|
|
end
|
|
else
|
|
local country = system.GetCountry() or "UK"
|
|
local fahrenheit_countries = {"BS","PW","BZ","KY","FM","MH","US","PR","VI","GU"}
|
|
--[[Bahamas, Palau, Belize, the Cayman Islands, the Federated States of Micronesia, the Marshall Islands,
|
|
and the United States and its territories such as Puerto Rico, the U.S. Virgin Islands, and Guam.
|
|
]]
|
|
local default_temp = table.HasValue(fahrenheit_countries, country) and "fahrenheit" or "celsius"
|
|
local temp_type = default_temp
|
|
--[[<Client>------------------------------------------------------------------
|
|
Sets the display temperature. Returns true if given a valid temperature-type.
|
|
Valid temperatures:
|
|
- celsius : default
|
|
- fahrenheit
|
|
- kelvin
|
|
- rankine
|
|
- delisle
|
|
- newton
|
|
- réaumur
|
|
- rømer
|
|
---------------------------------------------------------------------------]]
|
|
|
|
---Sets the display temperature.
|
|
---@param sType string
|
|
---@return boolean success
|
|
---@client
|
|
function StormFox2.Temperature.SetDisplayType(sType)
|
|
StormFox2.Setting.Set("display_temperature",convert_to[sType] and sType or "celsius")
|
|
if convert_to[sType] then
|
|
return true
|
|
end
|
|
return sType == "celsius"
|
|
end
|
|
|
|
---Returns the current display temperature type.
|
|
---@return string
|
|
---@client
|
|
function StormFox2.Temperature.GetDisplayType()
|
|
return temp_type
|
|
end
|
|
|
|
---Converts the current (or given) temperature to the clients temperature-unit. Ideal for displays.
|
|
---@param nCelcius number
|
|
---@return number
|
|
---@client
|
|
function StormFox2.Temperature.GetDisplay(nCelcius)
|
|
if nCelcius then
|
|
return StormFox2.Temperature.Convert(nil,temp_type,nCelcius)
|
|
end
|
|
return StormFox2.Temperature.Get(temp_type)
|
|
end
|
|
|
|
---Returns the clients temperature-unit symbol. ("°C", "°F" ..)
|
|
---@return string
|
|
---@client
|
|
function StormFox2.Temperature.GetDisplaySymbol()
|
|
return symbol[temp_type] or "°C"
|
|
end
|
|
|
|
---Returns the default temperature, based on client-country.
|
|
---@return string
|
|
---@client
|
|
function StormFox2.Temperature.GetDisplayDefault()
|
|
return default_temp
|
|
end
|
|
-- Load the temperature settings.
|
|
-- Setup setting
|
|
StormFox2.Setting.AddCL("display_temperature",default_temp)
|
|
local t = {}
|
|
for k, v in pairs(symbol) do
|
|
if t[k] then continue end
|
|
t[k] = string.upper(k[1]) .. string.sub(k, 2) .. " " .. v
|
|
end
|
|
StormFox2.Setting.SetType( "display_temperature", t, {"celsius", "fahrenheit", "kelvin"} )
|
|
StormFox2.Setting.Callback("display_temperature",function(sType)
|
|
temp_type = convert_to[sType] and sType or "celsius"
|
|
end,"StormFox2.temp.type")
|
|
-- Load setting
|
|
local sType = StormFox2.Setting.Get("display_temperature",default_temp)
|
|
temp_type = convert_to[sType] and sType or "celsius"
|
|
|
|
hook.Remove("stormfox2.postlib", "StormFox2.TemperatureSettings")
|
|
|
|
---Sets the "local" temperature. This will override the server variable until called again with 'nil'.
|
|
---@param nCelcius? number
|
|
---@client
|
|
function StormFox2.Temperature.SetLocal( nCelcius )
|
|
tempOverwrite = nCelcius
|
|
end
|
|
|
|
end |