diff --git a/res/scripts/stdcmd.lua b/res/scripts/stdcmd.lua index 95ba2639..61dccba8 100644 --- a/res/scripts/stdcmd.lua +++ b/res/scripts/stdcmd.lua @@ -69,21 +69,6 @@ console.add_command( end ) -local function FormattedTime(seconds, format ) -- from gmod - if not seconds then seconds = 0 end - - local hours = math.floor(seconds / 3600) - local minutes = math.floor((seconds / 60) % 60) - local millisecs = (seconds - math.floor(seconds)) * 100 - seconds = math.floor(seconds % 60) - - if format then - return string.format(format, minutes, seconds, millisecs) - else - return {h = hours, m = minutes, s = seconds, ms = millisecs} - end -end - console.add_command( "time.uptime", "Get time elapsed since the engine started", @@ -91,7 +76,7 @@ console.add_command( local uptime = time.uptime() local formatted_uptime = "" - local t = FormattedTime(uptime) + local t = string.formatted_time(uptime) formatted_uptime = t.h .. "h " .. t.m .. "m " .. t.s .. "s" diff --git a/res/scripts/stdlib.lua b/res/scripts/stdlib.lua index d634104d..5895ca06 100644 --- a/res/scripts/stdlib.lua +++ b/res/scripts/stdlib.lua @@ -305,6 +305,147 @@ set_block_rotation = block.set_rotation get_block_user_bits = block.get_user_bits set_block_user_bits = block.set_user_bits +---------------------------------------------- + +function math.clamp(_in, low, high) + return math.min(math.max(_in, low), high) +end + +function math.rand(low, high) + return low + (high - low) * math.random() +end + +---------------------------------------------- + +function table.copy(t) + local copied = {} + + for k, v in pairs(t) do + copied[k] = v + end + + return copied +end + +function table.count(t) + local count = 0 + + for k, v in pairs(t) do + count = count + 1 + end + + return count +end + +function table.random(t) + return t[math.random(1, #t)] +end + +---------------------------------------------- + +local pattern_escape_replacements = { + ["("] = "%(", + [")"] = "%)", + ["."] = "%.", + ["%"] = "%%", + ["+"] = "%+", + ["-"] = "%-", + ["*"] = "%*", + ["?"] = "%?", + ["["] = "%[", + ["]"] = "%]", + ["^"] = "%^", + ["$"] = "%$", + ["\0"] = "%z" +} + +function string.pattern_safe(str) + return string.gsub(str, ".", pattern_escape_replacements) +end + +--local totable = string.ToTable +local string_sub = string.sub +local string_find = string.find +local string_len = string.len +function string.explode(separator, str, withpattern) + --if (separator == "") then return totable(str) end + if (withpattern == nil) then withpattern = false end + + local ret = {} + local current_pos = 1 + + for i = 1, string_len(str) do + local start_pos, end_pos = string_find(str, separator, current_pos, not withpattern) + if (not start_pos) then break end + ret[i] = string_sub(str, current_pos, start_pos - 1) + current_pos = end_pos + 1 + end + + ret[#ret + 1] = string_sub(str, current_pos) + + return ret +end + +function string.split(str, delimiter) + return string.explode(delimiter, str) +end + +function string.formatted_time(seconds, format) + if (not seconds) then seconds = 0 end + local hours = math.floor(seconds / 3600) + local minutes = math.floor((seconds / 60) % 60) + local millisecs = (seconds - math.floor(seconds)) * 100 + seconds = math.floor(seconds % 60) + + if (format) then + return string.format(format, minutes, seconds, millisecs) + else + return { h = hours, m = minutes, s = seconds, ms = millisecs } + end +end + +function string.replace(str, tofind, toreplace) + local tbl = string.Explode(tofind, str) + if (tbl[1]) then return table.concat(tbl, toreplace) end + return str +end + +function string.trim(s, char) + if char then char = string.pattern_safe(char) else char = "%s" end + return string.match(s, "^" .. char .. "*(.-)" .. char .. "*$") or s +end + +function string.trim_right(s, char) + if char then char = string.pattern_safe(char) else char = "%s" end + return string.match(s, "^(.-)" .. char .. "*$") or s +end + +function string.trim_left(s, char) + if char then char = string.pattern_safe(char) else char = "%s" end + return string.match(s, "^" .. char .. "*(.+)$") or s +end + +local meta = getmetatable("") + +function meta:__index(key) + local val = string[key] + if (val ~= nil) then + return val + elseif (tonumber(key)) then + return string.sub(self, key, key) + end +end + +function string.starts_with(str, start) + return string.sub(str, 1, string.len(start)) == start +end + +function string.ends_with(str, endStr) + return endStr == "" or string.sub(str, -string.len(endStr)) == endStr +end + +---------------------------------------------- + function load_script(path, nocache) on_deprecated_call("load_script") return __load_script(path, nocache)