1 os.setlocale("C", "numeric")
3 local scriptpath = engine.get_scriptdir()
5 dofile(scriptpath .. DIR_DELIM .. "mainmenu_worldlist.lua")
6 dofile(scriptpath .. DIR_DELIM .. "modmgr.lua")
7 dofile(scriptpath .. DIR_DELIM .. "modstore.lua")
8 dofile(scriptpath .. DIR_DELIM .. "gamemgr.lua")
15 --------------------------------------------------------------------------------
16 function render_favourite(spec,render_details)
19 if spec.name ~= nil then
20 text = text .. fs_escape_string(spec.name:trim())
22 -- if spec.description ~= nil and
23 -- fs_escape_string(spec.description):trim() ~= "" then
24 -- text = text .. " (" .. fs_escape_string(spec.description) .. ")"
27 if spec.address ~= nil then
28 text = text .. spec.address:trim()
32 if not render_details then
37 if spec.password == true then
38 details = details .. "*"
40 details = details .. "_"
44 details = details .. "C"
46 details = details .. "_"
50 details = details .. "D"
52 details = details .. "_"
56 details = details .. "P"
58 details = details .. "_"
60 details = details .. " "
62 return fs_escape_string(details) .. text
65 --------------------------------------------------------------------------------
66 os.tempfolder = function()
67 local filetocheck = os.tmpname()
68 os.remove(filetocheck)
70 local randname = "MTTempModFolder_" .. math.random(0,10000)
71 if DIR_DELIM == "\\" then
72 local tempfolder = os.getenv("TEMP")
73 return tempfolder .. filetocheck
75 local backstring = filetocheck:reverse()
76 return filetocheck:sub(0,filetocheck:len()-backstring:find(DIR_DELIM)+1) ..randname
81 --------------------------------------------------------------------------------
82 function cleanup_path(temppath)
84 local parts = temppath:split("-")
87 if temppath ~= "" then
88 temppath = temppath .. "_"
90 temppath = temppath .. parts[i]
93 parts = temppath:split(".")
96 if temppath ~= "" then
97 temppath = temppath .. "_"
99 temppath = temppath .. parts[i]
102 parts = temppath:split("'")
105 if temppath ~= "" then
106 temppath = temppath .. ""
108 temppath = temppath .. parts[i]
111 parts = temppath:split(" ")
114 if temppath ~= "" then
117 temppath = temppath .. parts[i]
123 --------------------------------------------------------------------------------
125 function menu.set_texture(identifier,gamedetails)
126 local texture_set = false
127 if menu.texturepack ~= nil and gamedetails ~= nil then
128 local path = menu.basetexturedir ..
129 gamedetails.id .. "_menu_" .. identifier .. ".png"
131 if engine.set_background(identifier,path) then
136 if not texture_set and gamedetails ~= nil then
137 local path = gamedetails.path .. DIR_DELIM .."menu" ..
138 DIR_DELIM .. identifier .. ".png"
139 if engine.set_background(identifier,path) then
144 if not texture_set then
145 local path = menu.basetexturedir .. DIR_DELIM .."menu_" ..
147 if engine.set_background(identifier,path) then
152 if not texture_set then
153 local path = menu.defaulttexturedir .. DIR_DELIM .."menu_" ..
155 engine.set_background(identifier,path)
159 --------------------------------------------------------------------------------
160 function menu.update_gametype()
164 if (menu.game_last_check == nil or
165 menu.game_last_check ~= menu.last_game) and
166 tabbuilder.current_tab == "singleplayer" then
168 local gamedetails = menu.lastgame()
169 engine.set_topleft_text(gamedetails.name)
170 filterlist.set_filtercriteria(worldlist,gamedetails.id)
173 local background_set = false
174 if menu.texturepack ~= nil then
175 local path_background_texture = menu.basetexturedir ..
176 gamedetails.id .. "_menu_background.png"
178 if engine.set_background("background",path_background_texture) then
179 background_set = true
180 engine.set_clouds(false)
184 if not background_set then
185 local path_background_texture = gamedetails.path .. DIR_DELIM .."menu" ..
186 DIR_DELIM .. "background.png"
187 if engine.set_background("background",path_background_texture) then
188 background_set = true
189 engine.set_clouds(false)
193 if not background_set then
194 engine.set_clouds(true)
197 menu.set_texture("overlay",gamedetails)
198 menu.set_texture("header",gamedetails)
199 menu.set_texture("footer",gamedetails)
201 menu.game_last_check = menu.last_game
203 if menu.game_last_check ~= menu.last_game then
204 menu.game_last_check = menu.last_game
205 menu.reset_gametype()
210 --------------------------------------------------------------------------------
211 function menu.reset_gametype()
212 filterlist.set_filtercriteria(worldlist,nil)
213 menu.game_last_check = nil
215 local path_background_texture = menu.basetexturedir .. "menu_background.png"
217 if engine.set_background("background",path_background_texture) then
218 background_set = true
219 engine.set_clouds(false)
221 engine.set_clouds(true)
224 menu.set_texture("overlay",nil)
225 menu.set_texture("header",nil)
226 menu.set_texture("footer",nil)
227 engine.set_topleft_text("")
230 --------------------------------------------------------------------------------
231 function get_last_folder(text,count)
232 local parts = text:split(DIR_DELIM)
240 retval = retval .. parts[#parts - (count-i)] .. DIR_DELIM
246 --------------------------------------------------------------------------------
247 function init_globals()
249 gamedata.worldindex = 0
251 worldlist = filterlist.create(
254 function(element,uid)
255 if element.name == uid then
259 end, --unique id compare fct
260 function(element,gameid)
261 if element.gameid == gameid then
268 filterlist.add_sort_mechanism(worldlist,"alphabetic",sort_worlds_alphabetic)
269 filterlist.set_sortmode(worldlist,"alphabetic")
273 --------------------------------------------------------------------------------
274 function identify_filetype(name)
276 if name:sub(-3):lower() == "zip" then
283 if name:sub(-6):lower() == "tar.gz" or
284 name:sub(-3):lower() == "tgz"then
291 if name:sub(-6):lower() == "tar.bz2" then
298 if name:sub(-2):lower() == "7z" then
311 --------------------------------------------------------------------------------
312 function update_menu()
314 local formspec = "size[12,5.2]"
317 if gamedata.errormessage ~= nil then
318 formspec = formspec ..
319 "field[1,2;10,2;;ERROR: " ..
320 gamedata.errormessage ..
322 "button[4.5,4.2;3,0.5;btn_error_confirm;Ok]"
324 formspec = formspec .. tabbuilder.gettab()
327 engine.update_formspec(formspec)
330 --------------------------------------------------------------------------------
331 function menu.render_world_list()
334 local current_worldlist = filterlist.get_list(worldlist)
336 for i,v in ipairs(current_worldlist) do
338 retval = retval ..","
341 retval = retval .. v.name ..
342 " \\[" .. v.gameid .. "\\]"
348 --------------------------------------------------------------------------------
351 gamemgr.update_gamelist()
353 menu.last_game = tonumber(engine.setting_get("main_menu_last_game_idx"))
355 if type(menu.last_game) ~= "number" then
359 if engine.setting_getbool("public_serverlist") then
360 menu.favorites = engine.get_favorites("online")
362 menu.favorites = engine.get_favorites("local")
366 menu.defaulttexturedir = engine.get_gamepath() .. DIR_DELIM .. ".." ..
367 DIR_DELIM .. "textures" .. DIR_DELIM .. "base" ..
368 DIR_DELIM .. "pack" .. DIR_DELIM
369 menu.basetexturedir = menu.defaulttexturedir
371 menu.texturepack = engine.setting_get("texture_path")
373 if menu.texturepack ~= nil then
374 menu.basetexturedir = menu.texturepack .. DIR_DELIM
378 --------------------------------------------------------------------------------
379 function menu.lastgame()
380 if menu.last_game > 0 and menu.last_game <= #gamemgr.games then
381 return gamemgr.games[menu.last_game]
384 if #gamemgr.games >= 1 then
386 return gamemgr.games[menu.last_game]
393 --------------------------------------------------------------------------------
394 function menu.update_last_game()
396 local current_world = filterlist.get_raw_element(worldlist,
397 engine.setting_get("mainmenu_last_selected_world")
400 if current_world == nil then
404 for i=1,#gamemgr.games,1 do
405 if gamemgr.games[i].id == current_world.gameid then
407 engine.setting_set("main_menu_last_game_idx",menu.last_game)
413 --------------------------------------------------------------------------------
414 function menu.handle_key_up_down(fields,textlist,settingname)
416 if fields["key_up"] then
417 local oldidx = engine.get_textlist_index(textlist)
420 local newidx = oldidx -1
421 engine.setting_set(settingname,
422 filterlist.get_engine_index(worldlist,newidx))
426 if fields["key_down"] then
427 local oldidx = engine.get_textlist_index(textlist)
429 if oldidx < filterlist.size(worldlist) then
430 local newidx = oldidx + 1
431 engine.setting_set(settingname,
432 filterlist.get_engine_index(worldlist,newidx))
438 --------------------------------------------------------------------------------
439 function menubar.handle_buttons(fields)
440 for i=1,#menubar.buttons,1 do
441 if fields[menubar.buttons[i].btn_name] ~= nil then
442 menu.last_game = menubar.buttons[i].index
443 engine.setting_set("main_menu_last_game_idx",menu.last_game)
444 menu.update_gametype()
449 --------------------------------------------------------------------------------
450 function menubar.refresh()
451 menubar.formspec = "box[-0.3,5.625;12.4,1.3;000000]" ..
452 "box[-0.3,5.6;12.4,0.05;FFFFFF]"
455 local button_base = -0.25
457 local maxbuttons = #gamemgr.games
459 if maxbuttons > 10 then
463 for i=1,maxbuttons,1 do
465 local btn_name = "menubar_btn_" .. gamemgr.games[i].id
466 local buttonpos = button_base + (i-1) * 1.245
467 if gamemgr.games[i].menuicon_path ~= nil and
468 gamemgr.games[i].menuicon_path ~= "" then
470 menubar.formspec = menubar.formspec ..
471 "image_button[" .. buttonpos .. ",5.7;1.3,1.3;" ..
472 gamemgr.games[i].menuicon_path .. ";" .. btn_name .. ";;true;false]"
475 local part1 = gamemgr.games[i].id:sub(1,5)
476 local part2 = gamemgr.games[i].id:sub(6,10)
477 local part3 = gamemgr.games[i].id:sub(11)
479 local text = part1 .. "\n" .. part2
482 text = text .. "\n" .. part3
484 menubar.formspec = menubar.formspec ..
485 "image_button[" .. buttonpos .. ",5.7;1.3,1.3;;" ..btn_name ..
486 ";" .. text .. ";true;true]"
494 table.insert(menubar.buttons,toadd)
498 --------------------------------------------------------------------------------
499 function tabbuilder.dialog_create_world()
500 local mapgens = {"v6", "v7", "indev", "singlenode", "math"}
502 local current_mg = engine.setting_get("mg_name")
507 for k,v in pairs(mapgens) do
508 if current_mg == v then
512 mglist = mglist .. v .. ","
514 mglist = mglist:sub(1, -2)
517 "label[2,0;World name]"..
518 "label[2,1;Mapgen]"..
519 "field[4.5,0.4;6,0.5;te_world_name;;]" ..
521 "button[5,4.5;2.6,0.5;world_create_confirm;Create]" ..
522 "button[7.5,4.5;2.8,0.5;world_create_cancel;Cancel]" ..
523 "dropdown[4.2,1;6.3;dd_mapgen;" .. mglist .. ";" .. selindex .. "]" ..
524 "textlist[4.2,1.9;5.8,2.3;games;" ..
525 gamemgr.gamelist() ..
526 ";" .. menu.last_game .. ";true]"
531 --------------------------------------------------------------------------------
532 function tabbuilder.dialog_delete_world()
533 return "label[2,2;Delete World \"" .. filterlist.get_raw_list(worldlist)[menu.world_to_del].name .. "\"?]"..
534 "button[3.5,4.2;2.6,0.5;world_delete_confirm;Yes]" ..
535 "button[6,4.2;2.8,0.5;world_delete_cancel;No]"
538 --------------------------------------------------------------------------------
539 function tabbuilder.gettab()
542 if tabbuilder.show_buttons then
543 retval = retval .. tabbuilder.tab_header()
546 if tabbuilder.current_tab == "singleplayer" then
547 retval = retval .. tabbuilder.tab_singleplayer()
550 if tabbuilder.current_tab == "multiplayer" then
551 retval = retval .. tabbuilder.tab_multiplayer()
554 if tabbuilder.current_tab == "server" then
555 retval = retval .. tabbuilder.tab_server()
558 if tabbuilder.current_tab == "settings" then
559 retval = retval .. tabbuilder.tab_settings()
562 if tabbuilder.current_tab == "credits" then
563 retval = retval .. tabbuilder.tab_credits()
566 if tabbuilder.current_tab == "dialog_create_world" then
567 retval = retval .. tabbuilder.dialog_create_world()
570 if tabbuilder.current_tab == "dialog_delete_world" then
571 retval = retval .. tabbuilder.dialog_delete_world()
574 retval = retval .. modmgr.gettab(tabbuilder.current_tab)
575 retval = retval .. gamemgr.gettab(tabbuilder.current_tab)
576 retval = retval .. modstore.gettab(tabbuilder.current_tab)
581 --------------------------------------------------------------------------------
582 function tabbuilder.handle_create_world_buttons(fields)
584 if fields["world_create_confirm"] or
585 fields["key_enter"] then
587 local worldname = fields["te_world_name"]
588 local gameindex = engine.get_textlist_index("games")
595 if not filterlist.uid_exists(worldlist,worldname) then
596 engine.setting_set("mg_name",fields["dd_mapgen"])
597 message = engine.create_world(worldname,gameindex)
599 message = "A world named \"" .. worldname .. "\" already exists"
602 if message ~= nil then
603 gamedata.errormessage = message
605 menu.last_game = gameindex
606 engine.setting_set("main_menu_last_game_idx",gameindex)
608 filterlist.refresh(worldlist)
609 engine.setting_set("mainmenu_last_selected_world",
610 filterlist.engine_index_by_uid(worldlist,worldname))
613 gamedata.errormessage = "No worldname given or no game selected"
617 if fields["games"] then
618 tabbuilder.skipformupdate = true
623 tabbuilder.is_dialog = false
624 tabbuilder.show_buttons = true
625 tabbuilder.current_tab = engine.setting_get("main_menu_tab")
628 --------------------------------------------------------------------------------
629 function tabbuilder.handle_delete_world_buttons(fields)
631 if fields["world_delete_confirm"] then
632 if menu.world_to_del > 0 and
633 menu.world_to_del <= #filterlist.get_raw_list(worldlist) then
634 engine.delete_world(menu.world_to_del)
635 menu.world_to_del = 0
636 filterlist.refresh(worldlist)
640 tabbuilder.is_dialog = false
641 tabbuilder.show_buttons = true
642 tabbuilder.current_tab = engine.setting_get("main_menu_tab")
645 --------------------------------------------------------------------------------
646 function tabbuilder.handle_multiplayer_buttons(fields)
648 if fields["te_name"] ~= nil then
649 gamedata.playername = fields["te_name"]
650 engine.setting_set("name", fields["te_name"])
653 if fields["favourites"] ~= nil then
654 local event = explode_textlist_event(fields["favourites"])
655 if event.typ == "DCL" then
656 gamedata.address = menu.favorites[event.index].address
657 gamedata.port = menu.favorites[event.index].port
658 gamedata.playername = fields["te_name"]
659 if fields["te_pwd"] ~= nil then
660 gamedata.password = fields["te_pwd"]
662 gamedata.selected_world = 0
664 if menu.favorites ~= nil then
665 gamedata.servername = menu.favorites[event.index].name
666 gamedata.serverdescription = menu.favorites[event.index].description
669 if gamedata.address ~= nil and
670 gamedata.port ~= nil then
676 if event.typ == "CHG" then
677 local address = menu.favorites[event.index].address
678 local port = menu.favorites[event.index].port
680 if address ~= nil and
682 engine.setting_set("address",address)
683 engine.setting_set("port",port)
686 menu.fav_selected = event.index
691 if fields["key_up"] ~= nil or
692 fields["key_down"] ~= nil then
694 local fav_idx = engine.get_textlist_index("favourites")
696 if fields["key_up"] ~= nil and fav_idx > 1 then
698 else if fields["key_down"] and fav_idx < #menu.favorites then
702 local address = menu.favorites[fav_idx].address
703 local port = menu.favorites[fav_idx].port
705 if address ~= nil and
707 engine.setting_set("address",address)
708 engine.setting_set("port",port)
711 menu.fav_selected = fav_idx
715 if fields["cb_public_serverlist"] ~= nil then
716 engine.setting_setbool("public_serverlist",
717 tabbuilder.tobool(fields["cb_public_serverlist"]))
719 if engine.setting_getbool("public_serverlist") then
720 menu.favorites = engine.get_favorites("online")
722 menu.favorites = engine.get_favorites("local")
724 menu.fav_selected = nil
728 if fields["btn_delete_favorite"] ~= nil then
729 local current_favourite = engine.get_textlist_index("favourites")
730 engine.delete_favorite(current_favourite)
731 menu.favorites = engine.get_favorites()
732 menu.fav_selected = nil
734 engine.setting_set("address","")
735 engine.setting_get("port","")
740 if fields["btn_mp_connect"] ~= nil or
741 fields["key_enter"] then
743 gamedata.playername = fields["te_name"]
744 gamedata.password = fields["te_pwd"]
745 gamedata.address = fields["te_address"]
746 gamedata.port = fields["te_port"]
748 local fav_idx = engine.get_textlist_index("favourites")
750 if fav_idx > 0 and fav_idx <= #menu.favorites and
751 menu.favorites[fav_idx].address == fields["te_address"] and
752 menu.favorites[fav_idx].port == fields["te_port"] then
754 gamedata.servername = menu.favorites[fav_idx].name
755 gamedata.serverdescription = menu.favorites[fav_idx].description
757 gamedata.servername = ""
758 gamedata.serverdescription = ""
761 gamedata.selected_world = 0
768 --------------------------------------------------------------------------------
769 function tabbuilder.handle_server_buttons(fields)
771 local world_doubleclick = false
773 if fields["srv_worlds"] ~= nil then
774 local event = explode_textlist_event(fields["srv_worlds"])
776 if event.typ == "DCL" then
777 world_doubleclick = true
779 if event.typ == "CHG" then
780 engine.setting_set("mainmenu_last_selected_world",
781 filterlist.get_engine_index(worldlist,engine.get_textlist_index("srv_worlds")))
785 menu.handle_key_up_down(fields,"srv_worlds","mainmenu_last_selected_world")
787 if fields["cb_creative_mode"] then
788 engine.setting_setbool("creative_mode",tabbuilder.tobool(fields["cb_creative_mode"]))
791 if fields["cb_enable_damage"] then
792 engine.setting_setbool("enable_damage",tabbuilder.tobool(fields["cb_enable_damage"]))
795 if fields["cb_server_announce"] then
796 engine.setting_setbool("server_announce",tabbuilder.tobool(fields["cb_server_announce"]))
799 if fields["start_server"] ~= nil or
801 fields["key_enter"] then
802 local selected = engine.get_textlist_index("srv_worlds")
804 gamedata.playername = fields["te_playername"]
805 gamedata.password = fields["te_passwd"]
806 gamedata.port = fields["te_serverport"]
807 gamedata.address = ""
808 gamedata.selected_world = filterlist.get_engine_index(worldlist,selected)
810 menu.update_last_game(gamedata.selected_world)
815 if fields["world_create"] ~= nil then
816 tabbuilder.current_tab = "dialog_create_world"
817 tabbuilder.is_dialog = true
818 tabbuilder.show_buttons = false
821 if fields["world_delete"] ~= nil then
822 local selected = engine.get_textlist_index("srv_worlds")
824 selected <= filterlist.size(worldlist) then
825 local world = filterlist.get_list(worldlist)[selected]
827 world.name ~= nil and
828 world.name ~= "" then
829 menu.world_to_del = filterlist.get_engine_index(worldlist,selected)
830 tabbuilder.current_tab = "dialog_delete_world"
831 tabbuilder.is_dialog = true
832 tabbuilder.show_buttons = false
834 menu.world_to_del = 0
839 if fields["world_configure"] ~= nil then
840 selected = engine.get_textlist_index("srv_worlds")
842 modmgr.world_config_selected_world = filterlist.get_engine_index(worldlist,selected)
843 if modmgr.init_worldconfig() then
844 tabbuilder.current_tab = "dialog_configure_world"
845 tabbuilder.is_dialog = true
846 tabbuilder.show_buttons = false
852 --------------------------------------------------------------------------------
853 function tabbuilder.tobool(text)
854 if text == "true" then
861 --------------------------------------------------------------------------------
862 function tabbuilder.handle_settings_buttons(fields)
863 if fields["cb_fancy_trees"] then
864 engine.setting_setbool("new_style_leaves",tabbuilder.tobool(fields["cb_fancy_trees"]))
867 if fields["cb_smooth_lighting"] then
868 engine.setting_setbool("smooth_lighting",tabbuilder.tobool(fields["cb_smooth_lighting"]))
870 if fields["cb_3d_clouds"] then
871 engine.setting_setbool("enable_3d_clouds",tabbuilder.tobool(fields["cb_3d_clouds"]))
873 if fields["cb_opaque_water"] then
874 engine.setting_setbool("opaque_water",tabbuilder.tobool(fields["cb_opaque_water"]))
877 if fields["cb_mipmapping"] then
878 engine.setting_setbool("mip_map",tabbuilder.tobool(fields["cb_mipmapping"]))
880 if fields["cb_anisotrophic"] then
881 engine.setting_setbool("anisotropic_filter",tabbuilder.tobool(fields["cb_anisotrophic"]))
883 if fields["cb_bilinear"] then
884 engine.setting_setbool("bilinear_filter",tabbuilder.tobool(fields["cb_bilinear"]))
886 if fields["cb_trilinear"] then
887 engine.setting_setbool("trilinear_filter",tabbuilder.tobool(fields["cb_trilinear"]))
890 if fields["cb_shaders"] then
891 engine.setting_setbool("enable_shaders",tabbuilder.tobool(fields["cb_shaders"]))
893 if fields["cb_pre_ivis"] then
894 engine.setting_setbool("preload_item_visuals",tabbuilder.tobool(fields["cb_pre_ivis"]))
896 if fields["cb_particles"] then
897 engine.setting_setbool("enable_particles",tabbuilder.tobool(fields["cb_particles"]))
899 if fields["cb_finite_liquid"] then
900 engine.setting_setbool("liquid_finite",tabbuilder.tobool(fields["cb_finite_liquid"]))
903 if fields["btn_change_keys"] ~= nil then
904 engine.show_keys_menu()
908 --------------------------------------------------------------------------------
909 function tabbuilder.handle_singleplayer_buttons(fields)
911 local world_doubleclick = false
913 if fields["sp_worlds"] ~= nil then
914 local event = explode_textlist_event(fields["sp_worlds"])
916 if event.typ == "DCL" then
917 world_doubleclick = true
920 if event.typ == "CHG" then
921 engine.setting_set("mainmenu_last_selected_world",
922 filterlist.get_engine_index(worldlist,engine.get_textlist_index("sp_worlds")))
926 menu.handle_key_up_down(fields,"sp_worlds","mainmenu_last_selected_world")
928 if fields["cb_creative_mode"] then
929 engine.setting_setbool("creative_mode",tabbuilder.tobool(fields["cb_creative_mode"]))
932 if fields["cb_enable_damage"] then
933 engine.setting_setbool("enable_damage",tabbuilder.tobool(fields["cb_enable_damage"]))
936 if fields["play"] ~= nil or
938 fields["key_enter"] then
939 local selected = engine.get_textlist_index("sp_worlds")
941 gamedata.selected_world = filterlist.get_engine_index(worldlist,selected)
942 gamedata.singleplayer = true
944 menu.update_last_game(gamedata.selected_world)
950 if fields["world_create"] ~= nil then
951 tabbuilder.current_tab = "dialog_create_world"
952 tabbuilder.is_dialog = true
953 tabbuilder.show_buttons = false
956 if fields["world_delete"] ~= nil then
957 local selected = engine.get_textlist_index("sp_worlds")
959 selected <= filterlist.size(worldlist) then
960 local world = filterlist.get_list(worldlist)[selected]
962 world.name ~= nil and
963 world.name ~= "" then
964 menu.world_to_del = filterlist.get_engine_index(worldlist,selected)
965 tabbuilder.current_tab = "dialog_delete_world"
966 tabbuilder.is_dialog = true
967 tabbuilder.show_buttons = false
969 menu.world_to_del = 0
974 if fields["world_configure"] ~= nil then
975 selected = engine.get_textlist_index("sp_worlds")
977 modmgr.world_config_selected_world = filterlist.get_engine_index(worldlist,selected)
978 if modmgr.init_worldconfig() then
979 tabbuilder.current_tab = "dialog_configure_world"
980 tabbuilder.is_dialog = true
981 tabbuilder.show_buttons = false
987 --------------------------------------------------------------------------------
988 function tabbuilder.tab_header()
990 if tabbuilder.last_tab_index == nil then
991 tabbuilder.last_tab_index = 1
996 for i=1,#tabbuilder.current_buttons,1 do
1002 toadd = toadd .. tabbuilder.current_buttons[i].caption
1004 return "tabheader[-0.3,-0.99;main_tab;" .. toadd ..";" .. tabbuilder.last_tab_index .. ";true;false]"
1007 --------------------------------------------------------------------------------
1008 function tabbuilder.handle_tab_buttons(fields)
1010 if fields["main_tab"] then
1011 local index = tonumber(fields["main_tab"])
1012 tabbuilder.last_tab_index = index
1013 tabbuilder.current_tab = tabbuilder.current_buttons[index].name
1015 engine.setting_set("main_menu_tab",tabbuilder.current_tab)
1018 --handle tab changes
1019 if tabbuilder.current_tab ~= tabbuilder.old_tab then
1020 if tabbuilder.current_tab ~= "singleplayer" then
1021 menu.reset_gametype()
1025 if tabbuilder.current_tab == "singleplayer" then
1026 menu.update_gametype()
1029 tabbuilder.old_tab = tabbuilder.current_tab
1032 --------------------------------------------------------------------------------
1033 function tabbuilder.init()
1034 tabbuilder.current_tab = engine.setting_get("main_menu_tab")
1036 if tabbuilder.current_tab == nil or
1037 tabbuilder.current_tab == "" then
1038 tabbuilder.current_tab = "singleplayer"
1039 engine.setting_set("main_menu_tab",tabbuilder.current_tab)
1043 --initialize tab buttons
1044 tabbuilder.last_tab = nil
1045 tabbuilder.show_buttons = true
1047 tabbuilder.current_buttons = {}
1048 table.insert(tabbuilder.current_buttons,{name="singleplayer", caption="Singleplayer"})
1049 table.insert(tabbuilder.current_buttons,{name="multiplayer", caption="Client"})
1050 table.insert(tabbuilder.current_buttons,{name="server", caption="Server"})
1051 table.insert(tabbuilder.current_buttons,{name="settings", caption="Settings"})
1053 if engine.setting_getbool("main_menu_game_mgr") then
1054 table.insert(tabbuilder.current_buttons,{name="game_mgr", caption="Games"})
1057 if engine.setting_getbool("main_menu_mod_mgr") then
1058 table.insert(tabbuilder.current_buttons,{name="mod_mgr", caption="Mods"})
1060 table.insert(tabbuilder.current_buttons,{name="credits", caption="Credits"})
1063 for i=1,#tabbuilder.current_buttons,1 do
1064 if tabbuilder.current_buttons[i].name == tabbuilder.current_tab then
1065 tabbuilder.last_tab_index = i
1069 menu.update_gametype()
1072 --------------------------------------------------------------------------------
1073 function tabbuilder.tab_multiplayer()
1076 "vertlabel[0,-0.25;CLIENT]" ..
1077 "label[1,-0.25;Favorites:]"..
1078 "label[1,4.25;Address/Port]"..
1079 "label[9,2.75;Name/Password]" ..
1080 "field[1.25,5.25;5.5,0.5;te_address;;" ..engine.setting_get("address") .."]" ..
1081 "field[6.75,5.25;2.25,0.5;te_port;;" ..engine.setting_get("port") .."]" ..
1082 "checkbox[1,3.6;cb_public_serverlist;Public Serverlist;" ..
1083 dump(engine.setting_getbool("public_serverlist")) .. "]"
1085 if not engine.setting_getbool("public_serverlist") then
1087 "button[6.45,3.95;2.25,0.5;btn_delete_favorite;Delete]"
1091 "button[9,4.95;2.5,0.5;btn_mp_connect;Connect]" ..
1092 "field[9.3,3.75;2.5,0.5;te_name;;" ..engine.setting_get("name") .."]" ..
1093 "pwdfield[9.3,4.5;2.5,0.5;te_pwd;]" ..
1094 "textarea[9.3,0.25;2.5,2.75;;"
1095 if menu.fav_selected ~= nil and
1096 menu.favorites[menu.fav_selected].description ~= nil then
1098 fs_escape_string(menu.favorites[menu.fav_selected].description,true)
1103 "textlist[1,0.35;7.5,3.35;favourites;"
1105 local render_details = engine.setting_getbool("public_serverlist")
1107 if #menu.favorites > 0 then
1108 retval = retval .. render_favourite(menu.favorites[1],render_details)
1110 for i=2,#menu.favorites,1 do
1111 retval = retval .. "," .. render_favourite(menu.favorites[i],render_details)
1115 if menu.fav_selected ~= nil then
1116 retval = retval .. ";" .. menu.fav_selected .. "]"
1118 retval = retval .. ";0]"
1124 --------------------------------------------------------------------------------
1125 function tabbuilder.tab_server()
1127 local index = filterlist.get_current_index(worldlist,
1128 tonumber(engine.setting_get("mainmenu_last_selected_world"))
1132 "button[4,4.15;2.6,0.5;world_delete;Delete]" ..
1133 "button[6.5,4.15;2.8,0.5;world_create;New]" ..
1134 "button[9.2,4.15;2.55,0.5;world_configure;Configure]" ..
1135 "button[8.5,4.9;3.25,0.5;start_server;Start Game]" ..
1136 "label[4,-0.25;Select World:]"..
1137 "vertlabel[0,-0.25;START SERVER]" ..
1138 "checkbox[0.5,0.25;cb_creative_mode;Creative Mode;" ..
1139 dump(engine.setting_getbool("creative_mode")) .. "]"..
1140 "checkbox[0.5,0.7;cb_enable_damage;Enable Damage;" ..
1141 dump(engine.setting_getbool("enable_damage")) .. "]"..
1142 "checkbox[0.5,1.15;cb_server_announce;Public;" ..
1143 dump(engine.setting_getbool("server_announce")) .. "]"..
1144 "field[0.8,3.2;3,0.5;te_playername;Name;" ..
1145 engine.setting_get("name") .. "]" ..
1146 "pwdfield[0.8,4.2;3,0.5;te_passwd;Password]" ..
1147 "field[0.8,5.2;3,0.5;te_serverport;Server Port;30000]" ..
1148 "textlist[4,0.25;7.5,3.7;srv_worlds;" ..
1149 menu.render_world_list() ..
1155 --------------------------------------------------------------------------------
1156 function tabbuilder.tab_settings()
1157 return "vertlabel[0,0;SETTINGS]" ..
1158 "checkbox[1,0.75;cb_fancy_trees;Fancy trees;" .. dump(engine.setting_getbool("new_style_leaves")) .. "]"..
1159 "checkbox[1,1.25;cb_smooth_lighting;Smooth Lighting;".. dump(engine.setting_getbool("smooth_lighting")) .. "]"..
1160 "checkbox[1,1.75;cb_3d_clouds;3D Clouds;" .. dump(engine.setting_getbool("enable_3d_clouds")) .. "]"..
1161 "checkbox[1,2.25;cb_opaque_water;Opaque Water;" .. dump(engine.setting_getbool("opaque_water")) .. "]"..
1163 "checkbox[4,0.75;cb_mipmapping;Mip-Mapping;" .. dump(engine.setting_getbool("mip_map")) .. "]"..
1164 "checkbox[4,1.25;cb_anisotrophic;Anisotropic Filtering;".. dump(engine.setting_getbool("anisotropic_filter")) .. "]"..
1165 "checkbox[4,1.75;cb_bilinear;Bi-Linear Filtering;" .. dump(engine.setting_getbool("bilinear_filter")) .. "]"..
1166 "checkbox[4,2.25;cb_trilinear;Tri-Linear Filtering;" .. dump(engine.setting_getbool("trilinear_filter")) .. "]"..
1168 "checkbox[7.5,0.75;cb_shaders;Shaders;" .. dump(engine.setting_getbool("enable_shaders")) .. "]"..
1169 "checkbox[7.5,1.25;cb_pre_ivis;Preload item visuals;".. dump(engine.setting_getbool("preload_item_visuals")) .. "]"..
1170 "checkbox[7.5,1.75;cb_particles;Enable Particles;" .. dump(engine.setting_getbool("enable_particles")) .. "]"..
1171 "checkbox[7.5,2.25;cb_finite_liquid;Finite Liquid;" .. dump(engine.setting_getbool("liquid_finite")) .. "]"..
1173 "button[1,3.75;2.25,0.5;btn_change_keys;Change keys]"
1176 --------------------------------------------------------------------------------
1177 function tabbuilder.tab_singleplayer()
1179 local index = filterlist.get_current_index(worldlist,
1180 tonumber(engine.setting_get("mainmenu_last_selected_world"))
1183 return "button[4,4.15;2.6,0.5;world_delete;Delete]" ..
1184 "button[6.5,4.15;2.8,0.5;world_create;New]" ..
1185 "button[9.2,4.15;2.55,0.5;world_configure;Configure]" ..
1186 "button[8.5,4.95;3.25,0.5;play;Play]" ..
1187 "label[4,-0.25;Select World:]"..
1188 "vertlabel[0,-0.25;SINGLE PLAYER]" ..
1189 "checkbox[0.5,0.25;cb_creative_mode;Creative Mode;" ..
1190 dump(engine.setting_getbool("creative_mode")) .. "]"..
1191 "checkbox[0.5,0.7;cb_enable_damage;Enable Damage;" ..
1192 dump(engine.setting_getbool("enable_damage")) .. "]"..
1193 "textlist[4,0.25;7.5,3.7;sp_worlds;" ..
1194 menu.render_world_list() ..
1195 ";" .. index .. "]" ..
1199 --------------------------------------------------------------------------------
1200 function tabbuilder.tab_credits()
1201 return "vertlabel[0,-0.5;CREDITS]" ..
1202 "label[0.5,3;Minetest " .. engine.get_version() .. "]" ..
1203 "label[0.5,3.3;http://minetest.net]" ..
1204 "image[0.5,1;" .. menu.defaulttexturedir .. "logo.png]" ..
1205 "textlist[3.5,-0.25;8.5,5.8;list_credits;" ..
1206 "#FFFF00Core Developers," ..
1207 "Perttu Ahola (celeron55) <celeron55@gmail.com>,"..
1208 "Ryan Kwolek (kwolekr) <kwolekr@minetest.net>,"..
1209 "PilzAdam <pilzadam@minetest.net>," ..
1210 "IIya Zhuravlev (thexyz) <xyz@minetest.net>,"..
1211 "Lisa Milne (darkrose) <lisa@ltmnet.com>,"..
1212 "Maciej Kasatkin (RealBadAngel) <mk@realbadangel.pl>,"..
1213 "proller <proler@gmail.com>,"..
1214 "sfan5 <sfan5@live.de>,"..
1215 "kahrl <kahrl@gmx.net>,"..
1217 "#FFFF00Active Contributors," ..
1219 "Vanessa Ezekowitz (VanessaE) <vanessaezekowitz@gmail.com>,"..
1220 "Jurgen Doser (doserj) <jurgen.doser@gmail.com>,"..
1221 "Jeija <jeija@mesecons.net>,"..
1222 "MirceaKitsune <mirceakitsune@gmail.com>,"..
1224 "dannydark <the_skeleton_of_a_child@yahoo.co.uk>,"..
1225 "0gb.us <0gb.us@0gb.us>,"..
1227 "#FFFF00Previous Contributors," ..
1228 "Guiseppe Bilotta (Oblomov) <guiseppe.bilotta@gmail.com>,"..
1229 "Jonathan Neuschafer <j.neuschaefer@gmx.net>,"..
1230 "Nils Dagsson Moskopp (erlehmann) <nils@dieweltistgarnichtso.net>,"..
1231 "Constantin Wenger (SpeedProg) <constantin.wenger@googlemail.com>,"..
1232 "matttpt <matttpt@gmail.com>,"..
1233 "JacobF <queatz@gmail.com>,"..
1237 --------------------------------------------------------------------------------
1238 function tabbuilder.checkretval(retval)
1240 if retval ~= nil then
1241 if retval.current_tab ~= nil then
1242 tabbuilder.current_tab = retval.current_tab
1245 if retval.is_dialog ~= nil then
1246 tabbuilder.is_dialog = retval.is_dialog
1249 if retval.show_buttons ~= nil then
1250 tabbuilder.show_buttons = retval.show_buttons
1253 if retval.skipformupdate ~= nil then
1254 tabbuilder.skipformupdate = retval.skipformupdate
1259 --------------------------------------------------------------------------------
1260 --------------------------------------------------------------------------------
1261 -- initialize callbacks
1262 --------------------------------------------------------------------------------
1263 --------------------------------------------------------------------------------
1264 engine.button_handler = function(fields)
1265 --print("Buttonhandler: tab: " .. tabbuilder.current_tab .. " fields: " .. dump(fields))
1267 if fields["btn_error_confirm"] then
1268 gamedata.errormessage = nil
1271 local retval = modmgr.handle_buttons(tabbuilder.current_tab,fields)
1272 tabbuilder.checkretval(retval)
1274 retval = gamemgr.handle_buttons(tabbuilder.current_tab,fields)
1275 tabbuilder.checkretval(retval)
1277 retval = modstore.handle_buttons(tabbuilder.current_tab,fields)
1278 tabbuilder.checkretval(retval)
1280 if tabbuilder.current_tab == "dialog_create_world" then
1281 tabbuilder.handle_create_world_buttons(fields)
1284 if tabbuilder.current_tab == "dialog_delete_world" then
1285 tabbuilder.handle_delete_world_buttons(fields)
1288 if tabbuilder.current_tab == "singleplayer" then
1289 tabbuilder.handle_singleplayer_buttons(fields)
1292 if tabbuilder.current_tab == "multiplayer" then
1293 tabbuilder.handle_multiplayer_buttons(fields)
1296 if tabbuilder.current_tab == "settings" then
1297 tabbuilder.handle_settings_buttons(fields)
1300 if tabbuilder.current_tab == "server" then
1301 tabbuilder.handle_server_buttons(fields)
1305 tabbuilder.handle_tab_buttons(fields)
1308 menubar.handle_buttons(fields)
1310 if not tabbuilder.skipformupdate then
1314 tabbuilder.skipformupdate = false
1318 --------------------------------------------------------------------------------
1319 engine.event_handler = function(event)
1320 if event == "MenuQuit" then
1321 if tabbuilder.is_dialog then
1322 tabbuilder.is_dialog = false
1323 tabbuilder.show_buttons = true
1324 tabbuilder.current_tab = engine.setting_get("main_menu_tab")
1325 menu.update_gametype()
1333 --------------------------------------------------------------------------------
1334 --------------------------------------------------------------------------------
1336 --------------------------------------------------------------------------------
1337 --------------------------------------------------------------------------------