aboutsummaryrefslogtreecommitdiff
path: root/builtin/mainmenu/init.lua
blob: 0c8578cd6c4af9184038f45cf8eab736916107f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
--Minetest
--Copyright (C) 2014 sapier
--
--This program is free software; you can redistribute it and/or modify
--it under the terms of the GNU Lesser General Public License as published by
--the Free Software Foundation; either version 2.1 of the License, or
--(at your option) any later version.
--
--This program is distributed in the hope that it will be useful,
--but WITHOUT ANY WARRANTY; without even the implied warranty of
--MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--GNU Lesser General Public License for more details.
--
--You should have received a copy of the GNU Lesser General Public License along
--with this program; if not, write to the Free Software Foundation, Inc.,
--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

mt_color_grey  = "#AAAAAA"
mt_color_blue  = "#6389FF"
mt_color_green = "#72FF63"
mt_color_dark_green = "#25C191"
mt_color_orange  = "#FF8800"

local menupath = core.get_mainmenu_path()
local basepath = core.get_builtin_path()
defaulttexturedir = core.get_texturepath_share() .. DIR_DELIM .. "base" ..
					DIR_DELIM .. "pack" .. DIR_DELIM

dofile(basepath .. "common" .. DIR_DELIM .. "filterlist.lua")
dofile(basepath .. "fstk" .. DIR_DELIM .. "buttonbar.lua")
dofile(basepath .. "fstk" .. DIR_DELIM .. "dialog.lua")
dofile(basepath .. "fstk" .. DIR_DELIM .. "tabview.lua")
dofile(basepath .. "fstk" .. DIR_DELIM .. "ui.lua")
dofile(menupath .. DIR_DELIM .. "async_event.lua")
dofile(menupath .. DIR_DELIM .. "common.lua")
dofile(menupath .. DIR_DELIM .. "pkgmgr.lua")
dofile(menupath .. DIR_DELIM .. "serverlistmgr.lua")
dofile(menupath .. DIR_DELIM .. "textures.lua")

dofile(menupath .. DIR_DELIM .. "dlg_config_world.lua")
dofile(menupath .. DIR_DELIM .. "dlg_settings_advanced.lua")
dofile(menupath .. DIR_DELIM .. "dlg_contentstore.lua")
dofile(menupath .. DIR_DELIM .. "dlg_create_world.lua")
dofile(menupath .. DIR_DELIM .. "dlg_delete_content.lua")
dofile(menupath .. DIR_DELIM .. "dlg_delete_world.lua")
dofile(menupath .. DIR_DELIM .. "dlg_rename_modpack.lua")

local tabs = {}

tabs.settings = dofile(menupath .. DIR_DELIM .. "tab_settings.lua")
tabs.content  = dofile(menupath .. DIR_DELIM .. "tab_content.lua")
tabs.about    = dofile(menupath .. DIR_DELIM .. "tab_about.lua")
tabs.local_game = dofile(menupath .. DIR_DELIM .. "tab_local.lua")
tabs.play_online = dofile(menupath .. DIR_DELIM .. "tab_online.lua")

--------------------------------------------------------------------------------
local function main_event_handler(tabview, event)
	if event == "MenuQuit" then
		core.close()
	end
	return true
end

--------------------------------------------------------------------------------
local function init_globals()
	-- Init gamedata
	gamedata.worldindex = 0

	menudata.worldlist = filterlist.create(
		core.get_worlds,
		compare_worlds,
		-- Unique id comparison function
		function(element, uid)
			return element.name == uid
		end,
		-- Filter function
		function(element, gameid)
			return element.gameid == gameid
		end
	)

	menudata.worldlist:add_sort_mechanism("alphabetic", sort_worlds_alphabetic)
	menudata.worldlist:set_sortmode("alphabetic")

	if not core.settings:get("menu_last_game") then
		local default_game = core.settings:get("default_game") or "minetest"
		core.settings:set("menu_last_game", default_game)
	end

	mm_texture.init()

	-- Create main tabview
	local tv_main = tabview_create("maintab", {x = 12, y = 5.4}, {x = 0, y = 0})

	tv_main:set_autosave_tab(true)
	tv_main:add(tabs.local_game)
	tv_main:add(tabs.play_online)

	tv_main:add(tabs.content)
	tv_main:add(tabs.settings)
	tv_main:add(tabs.about)

	tv_main:set_global_event_handler(main_event_handler)
	tv_main:set_fixed_size(false)

	local last_tab = core.settings:get("maintab_LAST")
	if last_tab and tv_main.current_tab ~= last_tab then
		tv_main:set_tab(last_tab)
	end

	-- In case the folder of the last selected game has been deleted,
	-- display "Minetest" as a header
	if tv_main.current_tab == "local" then
		local game = pkgmgr.find_by_gameid(core.settings:get("menu_last_game"))
		if game == nil then
			mm_texture.reset()
		end
	end

	ui.set_default("maintab")
	tv_main:show()

	ui.update()

	core.sound_play("main_menu", true)
end

init_globals()
lass="hl str">";" .. image_column(fgettext("Ping")) .. ",padding=0.25;" .. "color,span=3;" .. "text,align=right;" .. -- clients "text,align=center,padding=0.25;" .. -- "/" "text,align=right,padding=0.25;" .. -- clients_max image_column(fgettext("Creative mode"), "creative") .. ",padding=1;" .. image_column(fgettext("Damage enabled"), "damage") .. ",padding=0.25;" .. image_column(fgettext("PvP enabled"), "pvp") .. ",padding=0.25;" .. "color,span=1;" .. "text,padding=1]" .. "table[-0.15,0.6;7.75,5.15;favourites;" if menudata.search_result then for i = 1, #menudata.search_result do local favs = core.get_favorites("local") local server = menudata.search_result[i] for fav_id = 1, #favs do if server.address == favs[fav_id].address and server.port == favs[fav_id].port then server.is_favorite = true end end if i ~= 1 then retval = retval .. "," end retval = retval .. render_serverlist_row(server, server.is_favorite) end elseif #menudata.favorites > 0 then local favs = core.get_favorites("local") if #favs > 0 then for i = 1, #favs do for j = 1, #menudata.favorites do if menudata.favorites[j].address == favs[i].address and menudata.favorites[j].port == favs[i].port then table.insert(menudata.favorites, i, table.remove(menudata.favorites, j)) end end if favs[i].address ~= menudata.favorites[i].address then table.insert(menudata.favorites, i, favs[i]) end end end retval = retval .. render_serverlist_row(menudata.favorites[1], (#favs > 0)) for i = 2, #menudata.favorites do retval = retval .. "," .. render_serverlist_row(menudata.favorites[i], (i <= #favs)) end end if tabdata.fav_selected then retval = retval .. ";" .. tabdata.fav_selected .. "]" else retval = retval .. ";0]" end return retval end -------------------------------------------------------------------------------- local function main_button_handler(tabview, fields, name, tabdata) local serverlist = menudata.search_result or menudata.favorites if fields.te_name then gamedata.playername = fields.te_name core.settings:set("name", fields.te_name) end if fields.favourites then local event = core.explode_table_event(fields.favourites) local fav = serverlist[event.row] if event.type == "DCL" then if event.row <= #serverlist then if menudata.favorites_is_public and not is_server_protocol_compat_or_error( fav.proto_min, fav.proto_max) then return true end gamedata.address = fav.address gamedata.port = fav.port gamedata.playername = fields.te_name gamedata.selected_world = 0 if fields.te_pwd then gamedata.password = fields.te_pwd end gamedata.servername = fav.name gamedata.serverdescription = fav.description if gamedata.address and gamedata.port then core.settings:set("address", gamedata.address) core.settings:set("remote_port", gamedata.port) core.start() end end return true end if event.type == "CHG" then if event.row <= #serverlist then gamedata.fav = false local favs = core.get_favorites("local") local address = fav.address local port = fav.port gamedata.serverdescription = fav.description for i = 1, #favs do if fav.address == favs[i].address and fav.port == favs[i].port then gamedata.fav = true end end if address and port then core.settings:set("address", address) core.settings:set("remote_port", port) end tabdata.fav_selected = event.row end return true end end if fields.key_up or fields.key_down then local fav_idx = core.get_table_index("favourites") local fav = serverlist[fav_idx] if fav_idx then if fields.key_up and fav_idx > 1 then fav_idx = fav_idx - 1 elseif fields.key_down and fav_idx < #menudata.favorites then fav_idx = fav_idx + 1 end else fav_idx = 1 end if not menudata.favorites or not fav then tabdata.fav_selected = 0 return true end local address = fav.address local port = fav.port gamedata.serverdescription = fav.description if address and port then core.settings:set("address", address) core.settings:set("remote_port", port) end tabdata.fav_selected = fav_idx return true end if fields.btn_delete_favorite then local current_favourite = core.get_table_index("favourites") if not current_favourite then return end core.delete_favorite(current_favourite) asyncOnlineFavourites() tabdata.fav_selected = nil core.settings:set("address", "") core.settings:set("remote_port", "30000") return true end if fields.btn_mp_search or fields.key_enter_field == "te_search" then tabdata.fav_selected = 1 local input = fields.te_search:lower() tabdata.search_for = fields.te_search if #menudata.favorites < 2 then return true end menudata.search_result = {} -- setup the keyword list local keywords = {} for word in input:gmatch("%S+") do word = word:gsub("(%W)", "%%%1") table.insert(keywords, word) end if #keywords == 0 then menudata.search_result = nil return true end -- Search the serverlist local search_result = {} for i = 1, #menudata.favorites do local server = menudata.favorites[i] local found = 0 for k = 1, #keywords do local keyword = keywords[k] if server.name then local sername = server.name:lower() local _, count = sername:gsub(keyword, keyword) found = found + count * 4 end if server.description then local desc = server.description:lower() local _, count = desc:gsub(keyword, keyword) found = found + count * 2 end end if found > 0 then local points = (#menudata.favorites - i) / 5 + found server.points = points table.insert(search_result, server) end end if #search_result > 0 then table.sort(search_result, function(a, b) return a.points > b.points end) menudata.search_result = search_result local first_server = search_result[1] core.settings:set("address", first_server.address) core.settings:set("remote_port", first_server.port) gamedata.serverdescription = first_server.description end return true end if fields.btn_mp_refresh then asyncOnlineFavourites() return true end if (fields.btn_mp_connect or fields.key_enter) and fields.te_address ~= "" and fields.te_port then gamedata.playername = fields.te_name gamedata.password = fields.te_pwd gamedata.address = fields.te_address gamedata.port = fields.te_port gamedata.selected_world = 0 local fav_idx = core.get_table_index("favourites") local fav = serverlist[fav_idx] if fav_idx and fav_idx <= #serverlist and fav.address == fields.te_address and fav.port == fields.te_port then gamedata.servername = fav.name gamedata.serverdescription = fav.description if menudata.favorites_is_public and not is_server_protocol_compat_or_error( fav.proto_min, fav.proto_max) then return true end else gamedata.servername = "" gamedata.serverdescription = "" end core.settings:set("address", fields.te_address) core.settings:set("remote_port", fields.te_port) core.start() return true end return false end local function on_change(type, old_tab, new_tab) if type == "LEAVE" then return end asyncOnlineFavourites() end -------------------------------------------------------------------------------- return { name = "online", caption = fgettext("Join Game"), cbf_formspec = get_formspec, cbf_button_handler = main_button_handler, on_change = on_change }