summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--builtin/mainmenu.lua100
-rw-r--r--src/game.cpp1
-rw-r--r--src/guiLuaApi.cpp10
-rw-r--r--src/guiLuaApi.h2
-rw-r--r--src/server.cpp3
-rw-r--r--src/tile.cpp17
-rw-r--r--src/tile.h2
-rw-r--r--src/util/container.h5
-rw-r--r--textures/all/textures_here.txt1
-rw-r--r--textures/texture_packs_here.txt1
10 files changed, 125 insertions, 17 deletions
diff --git a/builtin/mainmenu.lua b/builtin/mainmenu.lua
index 0bd2b13aa..3e3777227 100644
--- a/builtin/mainmenu.lua
+++ b/builtin/mainmenu.lua
@@ -21,6 +21,17 @@ 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 = ""
@@ -163,6 +174,23 @@ function menu.render_world_list()
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
gamemgr.update_gamelist()
@@ -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
@@ -735,6 +766,23 @@ function tabbuilder.handle_singleplayer_buttons(fields)
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()
if tabbuilder.last_tab_index == nil then
@@ -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"})
@@ -947,6 +996,49 @@ function tabbuilder.tab_singleplayer()
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]" ..
"label[0.5,3;Minetest " .. engine.get_version() .. "]" ..
@@ -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);
@@ -830,6 +831,15 @@ int guiLuaApi::l_get_gamepath(lua_State *L)
}
/******************************************************************************/
+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);
bool dironly = lua_toboolean(L, 2);
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<std::string>::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<Key, Value> 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.