mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-10-30 23:15:32 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			255 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			255 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| -- Minetest: builtin/misc_helpers.lua
 | |
| 
 | |
| --------------------------------------------------------------------------------
 | |
| function basic_dump2(o)
 | |
| 	if type(o) == "number" then
 | |
| 		return tostring(o)
 | |
| 	elseif type(o) == "string" then
 | |
| 		return string.format("%q", o)
 | |
| 	elseif type(o) == "boolean" then
 | |
| 		return tostring(o)
 | |
| 	elseif type(o) == "function" then
 | |
| 		return "<function>"
 | |
| 	elseif type(o) == "userdata" then
 | |
| 		return "<userdata>"
 | |
| 	elseif type(o) == "nil" then
 | |
| 		return "nil"
 | |
| 	else
 | |
| 		error("cannot dump a " .. type(o))
 | |
| 		return nil
 | |
| 	end
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------
 | |
| function dump2(o, name, dumped)
 | |
| 	name = name or "_"
 | |
| 	dumped = dumped or {}
 | |
| 	io.write(name, " = ")
 | |
| 	if type(o) == "number" or type(o) == "string" or type(o) == "boolean"
 | |
| 			or type(o) == "function" or type(o) == "nil"
 | |
| 			or type(o) == "userdata" then
 | |
| 		io.write(basic_dump2(o), "\n")
 | |
| 	elseif type(o) == "table" then
 | |
| 		if dumped[o] then
 | |
| 			io.write(dumped[o], "\n")
 | |
| 		else
 | |
| 			dumped[o] = name
 | |
| 			io.write("{}\n") -- new table
 | |
| 			for k,v in pairs(o) do
 | |
| 				local fieldname = string.format("%s[%s]", name, basic_dump2(k))
 | |
| 				dump2(v, fieldname, dumped)
 | |
| 			end
 | |
| 		end
 | |
| 	else
 | |
| 		error("cannot dump a " .. type(o))
 | |
| 		return nil
 | |
| 	end
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------
 | |
| function dump(o, dumped)
 | |
| 	dumped = dumped or {}
 | |
| 	if type(o) == "number" then
 | |
| 		return tostring(o)
 | |
| 	elseif type(o) == "string" then
 | |
| 		return string.format("%q", o)
 | |
| 	elseif type(o) == "table" then
 | |
| 		if dumped[o] then
 | |
| 			return "<circular reference>"
 | |
| 		end
 | |
| 		dumped[o] = true
 | |
| 		local t = {}
 | |
| 		for k,v in pairs(o) do
 | |
| 			t[#t+1] = "[" .. dump(k, dumped) .. "] = " .. dump(v, dumped)
 | |
| 		end
 | |
| 		return "{" .. table.concat(t, ", ") .. "}"
 | |
| 	elseif type(o) == "boolean" then
 | |
| 		return tostring(o)
 | |
| 	elseif type(o) == "function" then
 | |
| 		return "<function>"
 | |
| 	elseif type(o) == "userdata" then
 | |
| 		return "<userdata>"
 | |
| 	elseif type(o) == "nil" then
 | |
| 		return "nil"
 | |
| 	else
 | |
| 		error("cannot dump a " .. type(o))
 | |
| 		return nil
 | |
| 	end
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------
 | |
| function string:split(sep)
 | |
| 	local sep, fields = sep or ",", {}
 | |
| 	local pattern = string.format("([^%s]+)", sep)
 | |
| 	self:gsub(pattern, function(c) fields[#fields+1] = c end)
 | |
| 	return fields
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------
 | |
| function file_exists(filename)
 | |
| 	local f = io.open(filename, "r")
 | |
| 	if f==nil then
 | |
| 		return false
 | |
| 	else
 | |
| 		f:close()
 | |
| 		return true
 | |
| 	end
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------
 | |
| function string:trim()
 | |
| 	return (self:gsub("^%s*(.-)%s*$", "%1"))
 | |
| end
 | |
| 
 | |
| assert(string.trim("\n \t\tfoo bar\t ") == "foo bar")
 | |
| 
 | |
| --------------------------------------------------------------------------------
 | |
| function math.hypot(x, y)
 | |
| 	local t
 | |
| 	x = math.abs(x)
 | |
| 	y = math.abs(y)
 | |
| 	t = math.min(x, y)
 | |
| 	x = math.max(x, y)
 | |
| 	if x == 0 then return 0 end
 | |
| 	t = t / x
 | |
| 	return x * math.sqrt(1 + t * t)
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------
 | |
| function explode_textlist_event(text)
 | |
| 	
 | |
| 	local retval = {}
 | |
| 	retval.typ = "INV"
 | |
| 	
 | |
| 	local parts = text:split(":")
 | |
| 				
 | |
| 	if #parts == 2 then
 | |
| 		retval.typ = parts[1]:trim()
 | |
| 		retval.index= tonumber(parts[2]:trim())
 | |
| 		
 | |
| 		if type(retval.index) ~= "number" then
 | |
| 			retval.typ = "INV"
 | |
| 		end
 | |
| 	end
 | |
| 	
 | |
| 	return retval
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------
 | |
| function get_last_folder(text,count)
 | |
| 	local parts = text:split(DIR_DELIM)
 | |
| 	
 | |
| 	if count == nil then
 | |
| 		return parts[#parts]
 | |
| 	end
 | |
| 	
 | |
| 	local retval = ""
 | |
| 	for i=1,count,1 do
 | |
| 		retval = retval .. parts[#parts - (count-i)] .. DIR_DELIM
 | |
| 	end
 | |
| 	
 | |
| 	return retval
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------
 | |
| function cleanup_path(temppath)
 | |
| 	
 | |
| 	local parts = temppath:split("-")
 | |
| 	temppath = ""	
 | |
| 	for i=1,#parts,1 do
 | |
| 		if temppath ~= "" then
 | |
| 			temppath = temppath .. "_"
 | |
| 		end
 | |
| 		temppath = temppath .. parts[i]
 | |
| 	end
 | |
| 	
 | |
| 	parts = temppath:split(".")
 | |
| 	temppath = ""	
 | |
| 	for i=1,#parts,1 do
 | |
| 		if temppath ~= "" then
 | |
| 			temppath = temppath .. "_"
 | |
| 		end
 | |
| 		temppath = temppath .. parts[i]
 | |
| 	end
 | |
| 	
 | |
| 	parts = temppath:split("'")
 | |
| 	temppath = ""	
 | |
| 	for i=1,#parts,1 do
 | |
| 		if temppath ~= "" then
 | |
| 			temppath = temppath .. ""
 | |
| 		end
 | |
| 		temppath = temppath .. parts[i]
 | |
| 	end
 | |
| 	
 | |
| 	parts = temppath:split(" ")
 | |
| 	temppath = ""	
 | |
| 	for i=1,#parts,1 do
 | |
| 		if temppath ~= "" then
 | |
| 			temppath = temppath
 | |
| 		end
 | |
| 		temppath = temppath .. parts[i]
 | |
| 	end
 | |
| 	
 | |
| 	return temppath
 | |
| end
 | |
| 
 | |
| local tbl = engine or minetest
 | |
| function tbl.formspec_escape(text)
 | |
| 	if text ~= nil then
 | |
| 		text = string.gsub(text,"\\","\\\\")
 | |
| 		text = string.gsub(text,"%]","\\]")
 | |
| 		text = string.gsub(text,"%[","\\[")
 | |
| 		text = string.gsub(text,";","\\;")
 | |
| 		text = string.gsub(text,",","\\,")
 | |
| 	end
 | |
| 	return text
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------
 | |
| -- mainmenu only functions
 | |
| --------------------------------------------------------------------------------
 | |
| if engine ~= nil then
 | |
| 	engine.get_game = function(index)
 | |
| 		local games = game.get_games()
 | |
| 		
 | |
| 		if index > 0 and index <= #games then
 | |
| 			return games[index]
 | |
| 		end
 | |
| 		
 | |
| 		return nil
 | |
| 	end
 | |
| 	
 | |
| 	function fgettext(text, ...)
 | |
| 		text = engine.gettext(text)
 | |
| 		local arg = {n=select('#', ...), ...}
 | |
| 		if arg.n >= 1 then
 | |
| 			-- Insert positional parameters ($1, $2, ...)
 | |
| 			result = ''
 | |
| 			pos = 1
 | |
| 			while pos <= text:len() do
 | |
| 				newpos = text:find('[$]', pos)
 | |
| 				if newpos == nil then
 | |
| 					result = result .. text:sub(pos)
 | |
| 					pos = text:len() + 1
 | |
| 				else
 | |
| 					paramindex = tonumber(text:sub(newpos+1, newpos+1))
 | |
| 					result = result .. text:sub(pos, newpos-1) .. tostring(arg[paramindex])
 | |
| 					pos = newpos + 2
 | |
| 				end
 | |
| 			end
 | |
| 			text = result
 | |
| 		end
 | |
| 		return engine.formspec_escape(text)
 | |
| 	end
 | |
| end
 | |
| --------------------------------------------------------------------------------
 | |
| -- core only fct
 | |
| --------------------------------------------------------------------------------
 | |
| if minetest ~= nil then
 | |
| 	--------------------------------------------------------------------------------
 | |
| 	function minetest.pos_to_string(pos)
 | |
| 		return "(" .. pos.x .. "," .. pos.y .. "," .. pos.z .. ")"
 | |
| 	end
 | |
| end
 | |
| 
 |