diff --git a/builtin/mainmenu.lua b/builtin/mainmenu.lua index 0bd2b13aa..3e3777227 100644 --- a/builtin/mainmenu.lua +++ b/builtin/mainmenu.lua @@ -20,6 +20,17 @@ menu = {} local tabbuilder = {} local worldlist = nil +-------------------------------------------------------------------------------- +local function filterTP(TPlist) + TPlist2 = {"None"} + for _,i in ipairs(TPlist) do + if i~="base" then + table.insert(TPlist2, i) + end + end + return TPlist2 +end + -------------------------------------------------------------------------------- function menu.render_favorite(spec,render_details) local text = "" @@ -162,6 +173,23 @@ function menu.render_world_list() return retval end +-------------------------------------------------------------------------------- +function menu.render_TP_list(TPlist) + local retval = "" + + --local current_TP = filterlist.get_list(TPlist) + + for i,v in ipairs(TPlist) do + if retval ~= "" then + retval = retval .."," + end + + retval = retval .. v + end + + return retval +end + -------------------------------------------------------------------------------- function menu.init() --init menu data @@ -179,8 +207,7 @@ function menu.init() menu.favorites = engine.get_favorites("local") end - menu.defaulttexturedir = engine.get_gamepath() .. DIR_DELIM .. ".." .. - DIR_DELIM .. "textures" .. DIR_DELIM .. "base" .. + menu.defaulttexturedir = engine.get_texturepath() .. DIR_DELIM .. "base" .. DIR_DELIM .. "pack" .. DIR_DELIM end @@ -307,6 +334,10 @@ function tabbuilder.gettab() retval = retval .. tabbuilder.tab_settings() end + if tabbuilder.current_tab == "texture_packs" then + retval = retval .. tabbuilder.tab_TP() + end + if tabbuilder.current_tab == "credits" then retval = retval .. tabbuilder.tab_credits() end @@ -734,6 +765,23 @@ function tabbuilder.handle_singleplayer_buttons(fields) end end +-------------------------------------------------------------------------------- +function tabbuilder.handle_TP_buttons(fields) + if fields["TPs"] ~= nil then + local event = explode_textlist_event(fields["TPs"]) + if event.typ == "CHG" or event.typ=="DCL" then + local index = engine.get_textlist_index("TPs") + engine.setting_set("mainmenu_last_selected_TP", + index) + local TPlist = filterTP(engine.get_dirlist(engine.get_texturepath(), true)) + local TPname = TPlist[engine.get_textlist_index("TPs")] + local TPpath = engine.get_texturepath()..DIR_DELIM..TPname + if TPname == "None" then TPpath = "" end + engine.setting_set("texture_path", TPpath) + end + end +end + -------------------------------------------------------------------------------- function tabbuilder.tab_header() @@ -798,6 +846,7 @@ function tabbuilder.init() table.insert(tabbuilder.current_buttons,{name="multiplayer", caption="Client"}) table.insert(tabbuilder.current_buttons,{name="server", caption="Server"}) table.insert(tabbuilder.current_buttons,{name="settings", caption="Settings"}) + table.insert(tabbuilder.current_buttons,{name="texture_packs", caption="Texture Packs"}) if engine.setting_getbool("main_menu_game_mgr") then table.insert(tabbuilder.current_buttons,{name="game_mgr", caption="Games"}) @@ -946,6 +995,49 @@ function tabbuilder.tab_singleplayer() menubar.formspec end +-------------------------------------------------------------------------------- +function tabbuilder.tab_TP() + local TPpath = engine.setting_get("texture_path") + local TPlist = filterTP(engine.get_dirlist(engine.get_texturepath(), true)) + local index = tonumber(engine.setting_get("mainmenu_last_selected_TP")) + if index == nil then index = 1 end + if TPpath == "" then + return "label[4,-0.25;Select texture pack:]".. + "vertlabel[0,-0.25;TEXTURE PACKS]" .. + "textlist[4,0.25;7.5,5.0;TPs;" .. + menu.render_TP_list(TPlist) .. + ";" .. index .. "]" .. + menubar.formspec + end + local TPinfofile = TPpath..DIR_DELIM.."info.txt" + local f = io.open(TPinfofile, "r") + if f==nil then + menu.TPinfo = "No information available" + else + menu.TPinfo = f:read("*all") + f:close() + end + local TPscreenfile = TPpath..DIR_DELIM.."screenshot.png" + local f = io.open(TPscreenfile, "r") + if f==nil then + menu.TPscreen = nil + else + menu.TPscreen = TPscreenfile + f:close() + end + + local no_screenshot = engine.get_texturepath()..DIR_DELIM.."base"..DIR_DELIM.."pack"..DIR_DELIM.."no_screenshot.png" + + return "label[4,-0.25;Select texture pack:]".. + "vertlabel[0,-0.25;TEXTURE PACKS]" .. + "textlist[4,0.25;7.5,5.0;TPs;" .. + menu.render_TP_list(TPlist) .. + ";" .. index .. "]" .. + "image[0.65,0.25;4.0,3.7;"..(menu.TPscreen or no_screenshot).."]".. + "textarea[1.0,3.25;3.7,1.5;;"..(menu.TPinfo or "")..";]".. + menubar.formspec +end + -------------------------------------------------------------------------------- function tabbuilder.tab_credits() return "vertlabel[0,-0.5;CREDITS]" .. @@ -1039,6 +1131,10 @@ engine.button_handler = function(fields) tabbuilder.handle_singleplayer_buttons(fields) end + if tabbuilder.current_tab == "texture_packs" then + tabbuilder.handle_TP_buttons(fields) + end + if tabbuilder.current_tab == "multiplayer" then tabbuilder.handle_multiplayer_buttons(fields) end diff --git a/src/game.cpp b/src/game.cpp index 205c34515..cb2a50823 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -3482,6 +3482,7 @@ void the_game( infostream << "\t\t" << i << ":" << texture->getName().getPath().c_str() << std::endl; } + clearTextureNameCache(); infostream << "\tRemaining materials: " << driver-> getMaterialRendererCount () << " (note: irrlicht doesn't support removing renderers)"<< std::endl; diff --git a/src/guiLuaApi.cpp b/src/guiLuaApi.cpp index 485cab883..5d3e9dc12 100644 --- a/src/guiLuaApi.cpp +++ b/src/guiLuaApi.cpp @@ -82,6 +82,7 @@ void guiLuaApi::initialize(lua_State* L,GUIEngine* engine) retval &= API_FCT(set_topleft_text); retval &= API_FCT(get_modpath); retval &= API_FCT(get_gamepath); + retval &= API_FCT(get_texturepath); retval &= API_FCT(get_dirlist); retval &= API_FCT(create_dir); retval &= API_FCT(delete_dir); @@ -829,6 +830,15 @@ int guiLuaApi::l_get_gamepath(lua_State *L) return 1; } +/******************************************************************************/ +int guiLuaApi::l_get_texturepath(lua_State *L) +{ + std::string gamepath + = fs::RemoveRelativePathComponents(porting::path_user + DIR_DELIM + "textures"); + lua_pushstring(L, gamepath.c_str()); + return 1; +} + /******************************************************************************/ int guiLuaApi::l_get_dirlist(lua_State *L) { const char *path = luaL_checkstring(L, 1); diff --git a/src/guiLuaApi.h b/src/guiLuaApi.h index 11b94ba75..9555f00c5 100644 --- a/src/guiLuaApi.h +++ b/src/guiLuaApi.h @@ -164,6 +164,8 @@ private: static int l_get_modpath(lua_State *L); static int l_get_gamepath(lua_State *L); + + static int l_get_texturepath(lua_State *L); static int l_get_dirlist(lua_State *L); diff --git a/src/server.cpp b/src/server.cpp index 4099d9997..f5f6645a2 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -4273,8 +4273,7 @@ void Server::fillMediaCache() paths.push_back(mod.path + DIR_DELIM + "media"); paths.push_back(mod.path + DIR_DELIM + "models"); } - std::string path_all = "textures"; - paths.push_back(path_all + DIR_DELIM + "all"); + paths.push_back(porting::path_user + DIR_DELIM + "textures" + DIR_DELIM + "server"); // Collect media file information from paths into cache for(std::list::iterator i = paths.begin(); diff --git a/src/tile.cpp b/src/tile.cpp index 6e4fde011..726f7f602 100644 --- a/src/tile.cpp +++ b/src/tile.cpp @@ -131,18 +131,6 @@ std::string getTexturePath(const std::string &filename) // Check all filename extensions. Returns "" if not found. fullpath = getImagePath(testpath); } - - /* - Check from $user/textures/all - */ - if(fullpath == "") - { - std::string texture_path = porting::path_user + DIR_DELIM - + "textures" + DIR_DELIM + "all"; - std::string testpath = texture_path + DIR_DELIM + filename; - // Check all filename extensions. Returns "" if not found. - fullpath = getImagePath(testpath); - } /* Check from default data directory @@ -163,6 +151,11 @@ std::string getTexturePath(const std::string &filename) return fullpath; } +void clearTextureNameCache() +{ + g_texturename_to_path_cache.clear(); +} + /* Stores internal information about a texture. */ diff --git a/src/tile.h b/src/tile.h index 8008d2127..23c214350 100644 --- a/src/tile.h +++ b/src/tile.h @@ -57,6 +57,8 @@ std::string getImagePath(std::string path); */ std::string getTexturePath(const std::string &filename); +void clearTextureNameCache(); + /* ITextureSource::generateTextureFromMesh parameters */ diff --git a/src/util/container.h b/src/util/container.h index 9bb388f0e..84616d2db 100644 --- a/src/util/container.h +++ b/src/util/container.h @@ -118,6 +118,11 @@ public: } return result; } + + void clear () + { + m_values.clear(); + } private: std::map m_values; diff --git a/textures/all/textures_here.txt b/textures/all/textures_here.txt deleted file mode 100644 index 37940850a..000000000 --- a/textures/all/textures_here.txt +++ /dev/null @@ -1 +0,0 @@ -If you haven't modified the texture_path setting, you can copy textures of your texture packs into here. Folders are currently not supported. diff --git a/textures/texture_packs_here.txt b/textures/texture_packs_here.txt new file mode 100644 index 000000000..4c9afe18e --- /dev/null +++ b/textures/texture_packs_here.txt @@ -0,0 +1 @@ +Put your texture pack folders in this folder. Textures in the "server" pack will be used by the server.