mirror of https://github.com/minetest/minetest.git
Revert "Merge branch 'master' of https://github.com/minetest/minetest"
This reverts commit6388be3057
, reversing changes made to036095e237
.
This commit is contained in:
parent
6388be3057
commit
cbdcc3de38
|
@ -16,7 +16,7 @@ See the README.txt in it.
|
|||
Further documentation
|
||||
----------------------
|
||||
- Website: http://minetest.net/
|
||||
- Wiki: http://wiki.minetest.net/
|
||||
- Wiki: http://wiki.minetest.com/
|
||||
- Developer wiki: http://dev.minetest.net/
|
||||
- Forum: http://forum.minetest.net/
|
||||
- Github: https://github.com/minetest/minetest/
|
||||
|
|
|
@ -11,20 +11,18 @@ math.randomseed(os.time())
|
|||
os.setlocale("C", "numeric")
|
||||
|
||||
-- Load other files
|
||||
local modpath = minetest.get_modpath("__builtin")
|
||||
dofile(modpath.."/serialize.lua")
|
||||
dofile(modpath.."/misc_helpers.lua")
|
||||
dofile(modpath.."/item.lua")
|
||||
dofile(modpath.."/misc_register.lua")
|
||||
dofile(modpath.."/item_entity.lua")
|
||||
dofile(modpath.."/deprecated.lua")
|
||||
dofile(modpath.."/misc.lua")
|
||||
dofile(modpath.."/privileges.lua")
|
||||
dofile(modpath.."/auth.lua")
|
||||
dofile(modpath.."/chatcommands.lua")
|
||||
dofile(modpath.."/static_spawn.lua")
|
||||
dofile(modpath.."/detached_inventory.lua")
|
||||
dofile(modpath.."/falling.lua")
|
||||
dofile(modpath.."/features.lua")
|
||||
dofile(modpath.."/voxelarea.lua")
|
||||
dofile(modpath.."/vector.lua")
|
||||
dofile(minetest.get_modpath("__builtin").."/serialize.lua")
|
||||
dofile(minetest.get_modpath("__builtin").."/misc_helpers.lua")
|
||||
dofile(minetest.get_modpath("__builtin").."/item.lua")
|
||||
dofile(minetest.get_modpath("__builtin").."/misc_register.lua")
|
||||
dofile(minetest.get_modpath("__builtin").."/item_entity.lua")
|
||||
dofile(minetest.get_modpath("__builtin").."/deprecated.lua")
|
||||
dofile(minetest.get_modpath("__builtin").."/misc.lua")
|
||||
dofile(minetest.get_modpath("__builtin").."/privileges.lua")
|
||||
dofile(minetest.get_modpath("__builtin").."/auth.lua")
|
||||
dofile(minetest.get_modpath("__builtin").."/chatcommands.lua")
|
||||
dofile(minetest.get_modpath("__builtin").."/static_spawn.lua")
|
||||
dofile(minetest.get_modpath("__builtin").."/detached_inventory.lua")
|
||||
dofile(minetest.get_modpath("__builtin").."/falling.lua")
|
||||
dofile(minetest.get_modpath("__builtin").."/features.lua")
|
||||
dofile(minetest.get_modpath("__builtin").."/voxelarea.lua")
|
||||
|
|
|
@ -272,9 +272,6 @@ minetest.register_chatcommand("teleport", {
|
|||
local teleportee = nil
|
||||
local p = {}
|
||||
p.x, p.y, p.z = string.match(param, "^([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$")
|
||||
p.x = tonumber(p.x)
|
||||
p.y = tonumber(p.y)
|
||||
p.z = tonumber(p.z)
|
||||
teleportee = minetest.get_player_by_name(name)
|
||||
if teleportee and p.x and p.y and p.z then
|
||||
minetest.chat_send_player(name, "Teleporting to ("..p.x..", "..p.y..", "..p.z..")")
|
||||
|
@ -305,9 +302,6 @@ minetest.register_chatcommand("teleport", {
|
|||
local p = {}
|
||||
local teleportee_name = nil
|
||||
teleportee_name, p.x, p.y, p.z = string.match(param, "^([^ ]+) +([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$")
|
||||
p.x = tonumber(p.x)
|
||||
p.y = tonumber(p.y)
|
||||
p.z = tonumber(p.z)
|
||||
if teleportee_name then
|
||||
teleportee = minetest.get_player_by_name(teleportee_name)
|
||||
end
|
||||
|
|
|
@ -1,309 +0,0 @@
|
|||
--Minetest
|
||||
--Copyright (C) 2013 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.
|
||||
|
||||
gamemgr = {}
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function gamemgr.dialog_new_game()
|
||||
local retval =
|
||||
"label[2,2;Game Name]"..
|
||||
"field[4.5,2.4;6,0.5;te_game_name;;]" ..
|
||||
"button[5,4.2;2.6,0.5;new_game_confirm;Create]" ..
|
||||
"button[7.5,4.2;2.8,0.5;new_game_cancel;Cancel]"
|
||||
|
||||
return retval
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function gamemgr.handle_games_buttons(fields)
|
||||
if fields["gamelist"] ~= nil then
|
||||
local event = explode_textlist_event(fields["gamelist"])
|
||||
gamemgr.selected_game = event.index
|
||||
end
|
||||
|
||||
if fields["btn_game_mgr_edit_game"] ~= nil then
|
||||
return {
|
||||
is_dialog = true,
|
||||
show_buttons = false,
|
||||
current_tab = "dialog_edit_game"
|
||||
}
|
||||
end
|
||||
|
||||
if fields["btn_game_mgr_new_game"] ~= nil then
|
||||
return {
|
||||
is_dialog = true,
|
||||
show_buttons = false,
|
||||
current_tab = "dialog_new_game"
|
||||
}
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function gamemgr.handle_new_game_buttons(fields)
|
||||
|
||||
if fields["new_game_confirm"] and
|
||||
fields["te_game_name"] ~= nil and
|
||||
fields["te_game_name"] ~= "" then
|
||||
local gamepath = engine.get_gamepath()
|
||||
|
||||
if gamepath ~= nil and
|
||||
gamepath ~= "" then
|
||||
local gamefolder = cleanup_path(fields["te_game_name"])
|
||||
|
||||
--TODO check for already existing first
|
||||
engine.create_dir(gamepath .. DIR_DELIM .. gamefolder)
|
||||
engine.create_dir(gamepath .. DIR_DELIM .. gamefolder .. DIR_DELIM .. "mods")
|
||||
engine.create_dir(gamepath .. DIR_DELIM .. gamefolder .. DIR_DELIM .. "menu")
|
||||
|
||||
local gameconf =
|
||||
io.open(gamepath .. DIR_DELIM .. gamefolder .. DIR_DELIM .. "game.conf","w")
|
||||
|
||||
if gameconf then
|
||||
gameconf:write("name = " .. fields["te_game_name"])
|
||||
gameconf:close()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return {
|
||||
is_dialog = false,
|
||||
show_buttons = true,
|
||||
current_tab = engine.setting_get("main_menu_tab")
|
||||
}
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function gamemgr.handle_edit_game_buttons(fields)
|
||||
local current_game = gamemgr.get_game(gamemgr.selected_game)
|
||||
|
||||
if fields["btn_close_edit_game"] ~= nil or
|
||||
current_game == nil then
|
||||
return {
|
||||
is_dialog = false,
|
||||
show_buttons = true,
|
||||
current_tab = engine.setting_get("main_menu_tab")
|
||||
}
|
||||
end
|
||||
|
||||
if fields["btn_remove_mod_from_game"] ~= nil then
|
||||
gamemgr.delete_mod(current_game,engine.get_textlist_index("mods_current"))
|
||||
end
|
||||
|
||||
if fields["btn_add_mod_to_game"] ~= nil then
|
||||
local modindex = engine.get_textlist_index("mods_available")
|
||||
|
||||
if modindex > 0 and
|
||||
modindex <= #modmgr.global_mods then
|
||||
|
||||
local sourcepath =
|
||||
engine.get_modpath() .. DIR_DELIM .. modmgr.global_mods[modindex]
|
||||
|
||||
gamemgr.add_mod(current_game,sourcepath)
|
||||
end
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function gamemgr.add_mod(gamespec,sourcepath)
|
||||
if gamespec.gamemods_path ~= nil and
|
||||
gamespec.gamemods_path ~= "" then
|
||||
|
||||
local modname = get_last_folder(sourcepath)
|
||||
|
||||
engine.copy_dir(sourcepath,gamespec.gamemods_path .. DIR_DELIM .. modname);
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function gamemgr.delete_mod(gamespec,modindex)
|
||||
if gamespec.gamemods_path ~= nil and
|
||||
gamespec.gamemods_path ~= "" then
|
||||
local game_mods = {}
|
||||
get_mods(gamespec.gamemods_path,game_mods)
|
||||
|
||||
if modindex > 0 and
|
||||
#game_mods >= modindex then
|
||||
|
||||
local modname = game_mods[modindex]
|
||||
|
||||
if modname:find("<MODPACK>") ~= nil then
|
||||
modname = modname:sub(0,modname:find("<") -2)
|
||||
end
|
||||
|
||||
local modpath = gamespec.gamemods_path .. DIR_DELIM .. modname
|
||||
if modpath:sub(0,gamespec.gamemods_path:len()) == gamespec.gamemods_path then
|
||||
engine.delete_dir(modpath)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function gamemgr.get_game_mods(gamespec)
|
||||
|
||||
local retval = ""
|
||||
|
||||
if gamespec.gamemods_path ~= nil and
|
||||
gamespec.gamemods_path ~= "" then
|
||||
local game_mods = {}
|
||||
get_mods(gamespec.gamemods_path,game_mods)
|
||||
|
||||
for i=1,#game_mods,1 do
|
||||
if retval ~= "" then
|
||||
retval = retval..","
|
||||
end
|
||||
retval = retval .. game_mods[i]
|
||||
end
|
||||
end
|
||||
return retval
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function gamemgr.gettab(name)
|
||||
local retval = ""
|
||||
|
||||
if name == "dialog_edit_game" then
|
||||
retval = retval .. gamemgr.dialog_edit_game()
|
||||
end
|
||||
|
||||
if name == "dialog_new_game" then
|
||||
retval = retval .. gamemgr.dialog_new_game()
|
||||
end
|
||||
|
||||
if name == "game_mgr" then
|
||||
retval = retval .. gamemgr.tab()
|
||||
end
|
||||
|
||||
return retval
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function gamemgr.tab()
|
||||
if gamemgr.selected_game == nil then
|
||||
gamemgr.selected_game = 1
|
||||
end
|
||||
|
||||
local retval =
|
||||
"vertlabel[0,-0.25;GAMES]" ..
|
||||
"label[1,-0.25;Games:]" ..
|
||||
"textlist[1,0.25;4.5,4.4;gamelist;" ..
|
||||
gamemgr.gamelist() ..
|
||||
";" .. gamemgr.selected_game .. "]"
|
||||
|
||||
local current_game = gamemgr.get_game(gamemgr.selected_game)
|
||||
|
||||
if current_game ~= nil then
|
||||
if current_game.menuicon_path ~= nil and
|
||||
current_game.menuicon_path ~= "" then
|
||||
retval = retval ..
|
||||
"image[5.8,-0.25;2,2;" .. current_game.menuicon_path .. "]"
|
||||
end
|
||||
|
||||
retval = retval ..
|
||||
"field[8,-0.25;6,2;;" .. current_game.name .. ";]"..
|
||||
"label[6,1.4;Mods:]" ..
|
||||
"button[9.7,1.5;2,0.2;btn_game_mgr_edit_game;edit game]" ..
|
||||
"textlist[6,2;5.5,3.3;game_mgr_modlist;"
|
||||
.. gamemgr.get_game_mods(current_game) ..";0]" ..
|
||||
"button[1,4.75;3.2,0.5;btn_game_mgr_new_game;new game]"
|
||||
end
|
||||
return retval
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function gamemgr.dialog_edit_game()
|
||||
local current_game = gamemgr.get_game(gamemgr.selected_game)
|
||||
if current_game ~= nil then
|
||||
local retval =
|
||||
"vertlabel[0,-0.25;EDIT GAME]" ..
|
||||
"label[0,-0.25;" .. current_game.name .. "]" ..
|
||||
"button[11.55,-0.2;0.75,0.5;btn_close_edit_game;x]"
|
||||
|
||||
if current_game.menuicon_path ~= nil and
|
||||
current_game.menuicon_path ~= "" then
|
||||
retval = retval ..
|
||||
"image[5.25,0;2,2;" .. current_game.menuicon_path .. "]"
|
||||
end
|
||||
|
||||
retval = retval ..
|
||||
"textlist[0.5,0.5;4.5,4.3;mods_current;"
|
||||
.. gamemgr.get_game_mods(current_game) ..";0]"
|
||||
|
||||
|
||||
retval = retval ..
|
||||
"textlist[7,0.5;4.5,4.3;mods_available;"
|
||||
.. modmgr.get_mods_list() .. ";0]"
|
||||
|
||||
retval = retval ..
|
||||
"button[0.55,4.95;4.7,0.5;btn_remove_mod_from_game;Remove selected mod]"
|
||||
|
||||
retval = retval ..
|
||||
"button[7.05,4.95;4.7,0.5;btn_add_mod_to_game;<<-- Add mod]"
|
||||
|
||||
return retval
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function gamemgr.handle_buttons(tab,fields)
|
||||
local retval = nil
|
||||
|
||||
if tab == "dialog_edit_game" then
|
||||
retval = gamemgr.handle_edit_game_buttons(fields)
|
||||
end
|
||||
|
||||
if tab == "dialog_new_game" then
|
||||
retval = gamemgr.handle_new_game_buttons(fields)
|
||||
end
|
||||
|
||||
if tab == "game_mgr" then
|
||||
retval = gamemgr.handle_games_buttons(fields)
|
||||
end
|
||||
|
||||
return retval
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function gamemgr.get_game(index)
|
||||
if index > 0 and index <= #gamemgr.games then
|
||||
return gamemgr.games[index]
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function gamemgr.update_gamelist()
|
||||
gamemgr.games = engine.get_games()
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function gamemgr.gamelist()
|
||||
local retval = ""
|
||||
if #gamemgr.games > 0 then
|
||||
retval = retval .. gamemgr.games[1].id
|
||||
|
||||
for i=2,#gamemgr.games,1 do
|
||||
retval = retval .. "," .. gamemgr.games[i].name
|
||||
end
|
||||
end
|
||||
return retval
|
||||
end
|
|
@ -311,9 +311,12 @@ function minetest.handle_node_drops(pos, drops, digger)
|
|||
end
|
||||
|
||||
function minetest.node_dig(pos, node, digger)
|
||||
minetest.debug("node_dig")
|
||||
|
||||
local def = ItemStack({name=node.name}):get_definition()
|
||||
-- Check if def ~= 0 because we always want to be able to remove unknown nodes
|
||||
if #def ~= 0 and not def.diggable or (def.can_dig and not def.can_dig(pos,digger)) then
|
||||
minetest.debug("not diggable")
|
||||
minetest.log("info", digger:get_player_name() .. " tried to dig "
|
||||
.. node.name .. " which is not diggable "
|
||||
.. minetest.pos_to_string(pos))
|
||||
|
@ -327,12 +330,10 @@ function minetest.node_dig(pos, node, digger)
|
|||
local drops = minetest.get_node_drops(node.name, wielded:get_name())
|
||||
|
||||
-- Wear out tool
|
||||
if not minetest.setting_getbool("creative_mode") then
|
||||
local tp = wielded:get_tool_capabilities()
|
||||
local dp = minetest.get_dig_params(def.groups, tp)
|
||||
wielded:add_wear(dp.wear)
|
||||
digger:set_wielded_item(wielded)
|
||||
end
|
||||
local tp = wielded:get_tool_capabilities()
|
||||
local dp = minetest.get_dig_params(def.groups, tp)
|
||||
wielded:add_wear(dp.wear)
|
||||
digger:set_wielded_item(wielded)
|
||||
|
||||
-- Handle drops
|
||||
minetest.handle_node_drops(pos, drops, digger)
|
||||
|
|
1327
builtin/mainmenu.lua
1327
builtin/mainmenu.lua
File diff suppressed because it is too large
Load Diff
|
@ -1,107 +0,0 @@
|
|||
--------------------------------------------------------------------------------
|
||||
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] = "" .. k .. " = " .. 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 string:trim()
|
||||
return (self:gsub("^%s*(.-)%s*$", "%1"))
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
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 fs_escape_string(text)
|
||||
if text ~= nil then
|
||||
while (text:find("\r\n") ~= nil) do
|
||||
local newtext = text:sub(1,text:find("\r\n")-1)
|
||||
newtext = newtext .. " " .. text:sub(text:find("\r\n")+3)
|
||||
|
||||
text = newtext
|
||||
end
|
||||
|
||||
while (text:find("\n") ~= nil) do
|
||||
local newtext = text:sub(1,text:find("\n")-1)
|
||||
newtext = newtext .. " " .. text:sub(text:find("\n")+1)
|
||||
|
||||
text = newtext
|
||||
end
|
||||
|
||||
while (text:find("\r") ~= nil) do
|
||||
local newtext = text:sub(1,text:find("\r")-1)
|
||||
newtext = newtext .. " " .. text:sub(text:find("\r")+1)
|
||||
|
||||
text = newtext
|
||||
end
|
||||
|
||||
text = string.gsub(text,"\\","\\\\")
|
||||
text = string.gsub(text,"%]","\\]")
|
||||
text = string.gsub(text,"%[","\\[")
|
||||
text = string.gsub(text,";","\\;")
|
||||
text = string.gsub(text,",","\\,")
|
||||
end
|
||||
return text
|
||||
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
|
|
@ -1,211 +0,0 @@
|
|||
worldlist = {}
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function worldlist.refresh()
|
||||
worldlist.m_raw_worldlist = engine.get_worlds()
|
||||
worldlist.process()
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function worldlist.init()
|
||||
worldlist.m_gamefilter = nil
|
||||
worldlist.m_sortmode = "alphabetic"
|
||||
|
||||
worldlist.m_processed_worldlist = nil
|
||||
worldlist.m_raw_worldlist = engine.get_worlds()
|
||||
|
||||
worldlist.process()
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function worldlist.set_gamefilter(gameid)
|
||||
if gameid == worldlist.m_gamefilter then
|
||||
return
|
||||
end
|
||||
worldlist.m_gamefilter = gameid
|
||||
worldlist.process()
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function worldlist.get_gamefilter()
|
||||
return worldlist.m_gamefilter
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
--supported sort mode "alphabetic|none"
|
||||
function worldlist.set_sortmode(mode)
|
||||
if (mode == worldlist.m_sortmode) then
|
||||
return
|
||||
end
|
||||
worldlist.m_sortmode = mode
|
||||
worldlist.process()
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function worldlist.get_list()
|
||||
return worldlist.m_processed_worldlist
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function worldlist.get_raw_list()
|
||||
return worldlist.m_raw_worldlist
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function worldlist.get_raw_world(idx)
|
||||
if type(idx) ~= "number" then
|
||||
idx = tonumber(idx)
|
||||
end
|
||||
|
||||
if idx ~= nil and idx > 0 and idx < #worldlist.m_raw_worldlist then
|
||||
return worldlist.m_raw_worldlist[idx]
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function worldlist.get_engine_index(worldlistindex)
|
||||
assert(worldlist.m_processed_worldlist ~= nil)
|
||||
|
||||
if worldlistindex ~= nil and worldlistindex > 0 and
|
||||
worldlistindex <= #worldlist.m_processed_worldlist then
|
||||
local entry = worldlist.m_processed_worldlist[worldlistindex]
|
||||
|
||||
for i,v in ipairs(worldlist.m_raw_worldlist) do
|
||||
|
||||
if worldlist.compare(v,entry) then
|
||||
return i
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return 0
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function worldlist.get_current_index(worldlistindex)
|
||||
assert(worldlist.m_processed_worldlist ~= nil)
|
||||
|
||||
if worldlistindex ~= nil and worldlistindex > 0 and
|
||||
worldlistindex <= #worldlist.m_raw_worldlist then
|
||||
local entry = worldlist.m_raw_worldlist[worldlistindex]
|
||||
|
||||
for i,v in ipairs(worldlist.m_processed_worldlist) do
|
||||
|
||||
if worldlist.compare(v,entry) then
|
||||
return i
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return 0
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function worldlist.process()
|
||||
assert(worldlist.m_raw_worldlist ~= nil)
|
||||
|
||||
if worldlist.m_sortmode == "none" and
|
||||
worldlist.m_gamefilter == nil then
|
||||
worldlist.m_processed_worldlist = worldlist.m_raw_worldlist
|
||||
return
|
||||
end
|
||||
|
||||
worldlist.m_processed_worldlist = {}
|
||||
|
||||
for i,v in ipairs(worldlist.m_raw_worldlist) do
|
||||
|
||||
if worldlist.m_gamefilter == nil or
|
||||
v.gameid == worldlist.m_gamefilter then
|
||||
table.insert(worldlist.m_processed_worldlist,v)
|
||||
end
|
||||
end
|
||||
|
||||
if worldlist.m_sortmode == "none" then
|
||||
return
|
||||
end
|
||||
|
||||
if worldlist.m_sortmode == "alphabetic" then
|
||||
worldlist.sort_alphabetic()
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function worldlist.compare(world1,world2)
|
||||
|
||||
if world1.path ~= world2.path then
|
||||
return false
|
||||
end
|
||||
|
||||
if world1.name ~= world2.name then
|
||||
return false
|
||||
end
|
||||
|
||||
if world1.gameid ~= world2.gameid then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function worldlist.size()
|
||||
if worldlist.m_processed_worldlist == nil then
|
||||
return 0
|
||||
end
|
||||
|
||||
return #worldlist.m_processed_worldlist
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function worldlist.exists(worldname)
|
||||
for i,v in ipairs(worldlist.m_raw_worldlist) do
|
||||
if v.name == worldname then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function worldlist.engine_index_by_name(worldname)
|
||||
local worldcount = 0
|
||||
local worldidx = 0
|
||||
for i,v in ipairs(worldlist.m_raw_worldlist) do
|
||||
if v.name == worldname then
|
||||
worldcount = worldcount +1
|
||||
worldidx = i
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- If there are more worlds than one with same name we can't decide which
|
||||
-- one is meant. This shouldn't be possible but just for sure.
|
||||
if worldcount > 1 then
|
||||
worldidx=0
|
||||
end
|
||||
|
||||
return worldidx
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function worldlist.sort_alphabetic()
|
||||
|
||||
table.sort(worldlist.m_processed_worldlist, function(a, b)
|
||||
local n1 = a.name
|
||||
local n2 = b.name
|
||||
local count = math.min(#n1, #n2)
|
||||
|
||||
for i=1,count do
|
||||
if n1:sub(i, i):lower() < n2:sub(i, i):lower() then
|
||||
return true
|
||||
elseif n1:sub(i, i):lower() > n2:sub(i, i):lower() then
|
||||
return false
|
||||
end
|
||||
end
|
||||
return (#n1 <= #n2)
|
||||
end)
|
||||
end
|
|
@ -91,14 +91,4 @@ function minetest.pos_to_string(pos)
|
|||
return "(" .. pos.x .. "," .. pos.y .. "," .. pos.z .. ")"
|
||||
end
|
||||
|
||||
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
|
||||
|
||||
|
|
|
@ -1,883 +0,0 @@
|
|||
--Minetest
|
||||
--Copyright (C) 2013 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.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function get_mods(path,retval,basefolder)
|
||||
|
||||
local mods = engine.get_dirlist(path,true)
|
||||
|
||||
for i=1,#mods,1 do
|
||||
local filename = path .. DIR_DELIM .. mods[i] .. DIR_DELIM .. "modpack.txt"
|
||||
local modpackfile,error = io.open(filename,"r")
|
||||
|
||||
local name = mods[i]
|
||||
if basefolder ~= nil and
|
||||
basefolder ~= "" then
|
||||
name = basefolder .. DIR_DELIM .. mods[i]
|
||||
end
|
||||
|
||||
if modpackfile ~= nil then
|
||||
modpackfile:close()
|
||||
table.insert(retval,name .. " <MODPACK>")
|
||||
get_mods(path .. DIR_DELIM .. name,retval,name)
|
||||
else
|
||||
|
||||
table.insert(retval,name)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--modmanager implementation
|
||||
modmgr = {}
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.extract(modfile)
|
||||
if modfile.type == "zip" then
|
||||
local tempfolder = os.tempfolder()
|
||||
|
||||
if tempfolder ~= nil and
|
||||
tempfodler ~= "" then
|
||||
engine.create_dir(tempfolder)
|
||||
engine.extract_zip(modfile.name,tempfolder)
|
||||
return tempfolder
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
function modmgr.getbasefolder(temppath)
|
||||
|
||||
if temppath == nil then
|
||||
return {
|
||||
type = "invalid",
|
||||
path = ""
|
||||
}
|
||||
end
|
||||
|
||||
local testfile = io.open(temppath .. DIR_DELIM .. "init.lua","r")
|
||||
if testfile ~= nil then
|
||||
testfile:close()
|
||||
return {
|
||||
type="mod",
|
||||
path=temppath
|
||||
}
|
||||
end
|
||||
|
||||
testfile = io.open(temppath .. DIR_DELIM .. "modpack.txt","r")
|
||||
if testfile ~= nil then
|
||||
testfile:close()
|
||||
return {
|
||||
type="modpack",
|
||||
path=temppath
|
||||
}
|
||||
end
|
||||
|
||||
local subdirs = engine.get_dirlist(temppath,true)
|
||||
|
||||
--only single mod or modpack allowed
|
||||
if #subdirs ~= 1 then
|
||||
return {
|
||||
type = "invalid",
|
||||
path = ""
|
||||
}
|
||||
end
|
||||
|
||||
testfile =
|
||||
io.open(temppath .. DIR_DELIM .. subdirs[1] ..DIR_DELIM .."init.lua","r")
|
||||
if testfile ~= nil then
|
||||
testfile:close()
|
||||
return {
|
||||
type="mod",
|
||||
path= temppath .. DIR_DELIM .. subdirs[1]
|
||||
}
|
||||
end
|
||||
|
||||
testfile =
|
||||
io.open(temppath .. DIR_DELIM .. subdirs[1] ..DIR_DELIM .."modpack.txt","r")
|
||||
if testfile ~= nil then
|
||||
testfile:close()
|
||||
return {
|
||||
type="modpack",
|
||||
path=temppath .. DIR_DELIM .. subdirs[1]
|
||||
}
|
||||
end
|
||||
|
||||
return {
|
||||
type = "invalid",
|
||||
path = ""
|
||||
}
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.isValidModname(modpath)
|
||||
if modpath:find("-") ~= nil then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.parse_register_line(line)
|
||||
local pos1 = line:find("\"")
|
||||
local pos2 = nil
|
||||
if pos1 ~= nil then
|
||||
pos2 = line:find("\"",pos1+1)
|
||||
end
|
||||
|
||||
if pos1 ~= nil and pos2 ~= nil then
|
||||
local item = line:sub(pos1+1,pos2-1)
|
||||
|
||||
if item ~= nil and
|
||||
item ~= "" then
|
||||
local pos3 = item:find(":")
|
||||
|
||||
if pos3 ~= nil then
|
||||
return item:sub(1,pos3-1)
|
||||
end
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.parse_dofile_line(modpath,line)
|
||||
local pos1 = line:find("\"")
|
||||
local pos2 = nil
|
||||
if pos1 ~= nil then
|
||||
pos2 = line:find("\"",pos1+1)
|
||||
end
|
||||
|
||||
if pos1 ~= nil and pos2 ~= nil then
|
||||
local filename = line:sub(pos1+1,pos2-1)
|
||||
|
||||
if filename ~= nil and
|
||||
filename ~= "" and
|
||||
filename:find(".lua") then
|
||||
return modmgr.identify_modname(modpath,filename)
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.update_global_mods()
|
||||
local modpath = engine.get_modpath()
|
||||
modmgr.global_mods = {}
|
||||
if modpath ~= nil and
|
||||
modpath ~= "" then
|
||||
get_mods(modpath,modmgr.global_mods)
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.get_mods_list()
|
||||
local toadd = ""
|
||||
|
||||
modmgr.update_global_mods()
|
||||
|
||||
if modmgr.global_mods ~= nil then
|
||||
for i=1,#modmgr.global_mods,1 do
|
||||
if toadd ~= "" then
|
||||
toadd = toadd..","
|
||||
end
|
||||
toadd = toadd .. modmgr.global_mods[i]
|
||||
end
|
||||
end
|
||||
|
||||
return toadd
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.mod_exists(basename)
|
||||
modmgr.update_global_mods()
|
||||
|
||||
if modmgr.global_mods ~= nil then
|
||||
for i=1,#modmgr.global_mods,1 do
|
||||
if modmgr.global_mods[i] == basename then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.identify_modname(modpath,filename)
|
||||
local testfile = io.open(modpath .. DIR_DELIM .. filename,"r")
|
||||
if testfile ~= nil then
|
||||
local line = testfile:read()
|
||||
|
||||
while line~= nil do
|
||||
local modname = nil
|
||||
|
||||
if line:find("minetest.register_tool") then
|
||||
modname = modmgr.parse_register_line(line)
|
||||
end
|
||||
|
||||
if line:find("minetest.register_craftitem") then
|
||||
modname = modmgr.parse_register_line(line)
|
||||
end
|
||||
|
||||
|
||||
if line:find("minetest.register_node") then
|
||||
modname = modmgr.parse_register_line(line)
|
||||
end
|
||||
|
||||
if line:find("dofile") then
|
||||
modname = modmgr.parse_dofile_line(modpath,line)
|
||||
end
|
||||
|
||||
if modname ~= nil then
|
||||
testfile:close()
|
||||
return modname
|
||||
end
|
||||
|
||||
line = testfile:read()
|
||||
end
|
||||
testfile:close()
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.tab()
|
||||
if modmgr.selected_mod == nil then
|
||||
modmgr.selected_mod = 1
|
||||
end
|
||||
|
||||
local retval =
|
||||
"vertlabel[0,-0.25;MODS]" ..
|
||||
"label[0.8,-0.25;Installed Mods:]" ..
|
||||
"textlist[0.75,0.25;4.5,4.3;modlist;" ..
|
||||
modmgr.get_mods_list() ..
|
||||
";" .. modmgr.selected_mod .. "]"
|
||||
|
||||
retval = retval ..
|
||||
"button[1,4.85;2,0.5;btn_mod_mgr_install_local;Install]" ..
|
||||
"button[3,4.85;2,0.5;btn_mod_mgr_download;Download]"
|
||||
|
||||
if #modmgr.global_mods >= modmgr.selected_mod and
|
||||
modmgr.global_mods[modmgr.selected_mod]:find("<MODPACK>") then
|
||||
retval = retval .. "button[10,4.85;2,0.5;btn_mod_mgr_rename_modpack;Rename]"
|
||||
end
|
||||
|
||||
if #modmgr.global_mods >= modmgr.selected_mod then
|
||||
local modpath = engine.get_modpath()
|
||||
--show dependencys
|
||||
if modmgr.global_mods[modmgr.selected_mod]:find("<MODPACK>") == nil then
|
||||
retval = retval ..
|
||||
"label[6,1.9;Depends:]" ..
|
||||
"textlist[6,2.4;5.7,2;deplist;"
|
||||
|
||||
toadd = modmgr.get_dependencys(modpath .. DIR_DELIM ..
|
||||
modmgr.global_mods[modmgr.selected_mod])
|
||||
|
||||
retval = retval .. toadd .. ";0;true,false]"
|
||||
|
||||
--TODO read modinfo
|
||||
end
|
||||
--show delete button
|
||||
retval = retval .. "button[8,4.85;2,0.5;btn_mod_mgr_delete_mod;Delete]"
|
||||
end
|
||||
return retval
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.dialog_rename_modpack()
|
||||
|
||||
local modname = modmgr.global_mods[modmgr.selected_mod]
|
||||
modname = modname:sub(0,modname:find("<") -2)
|
||||
|
||||
local retval =
|
||||
"label[1.75,1;Rename Modpack:]"..
|
||||
"field[4.5,1.4;6,0.5;te_modpack_name;;" ..
|
||||
modname ..
|
||||
"]" ..
|
||||
"button[5,4.2;2.6,0.5;dlg_rename_modpack_confirm;Accept]" ..
|
||||
"button[7.5,4.2;2.8,0.5;dlg_rename_modpack_cancel;Cancel]"
|
||||
|
||||
return retval
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.precheck()
|
||||
if modmgr.global_mods == nil then
|
||||
modmgr.update_global_mods()
|
||||
end
|
||||
|
||||
if modmgr.world_config_selected_world == nil then
|
||||
modmgr.world_config_selected_world = 1
|
||||
end
|
||||
|
||||
if modmgr.world_config_selected_mod == nil then
|
||||
modmgr.world_config_selected_mod = 1
|
||||
end
|
||||
|
||||
if modmgr.hide_gamemods == nil then
|
||||
modmgr.hide_gamemods = true
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.get_worldmod_idx()
|
||||
if not modmgr.hide_gamemods then
|
||||
return modmgr.world_config_selected_mod - #modmgr.worldconfig.game_mods
|
||||
else
|
||||
return modmgr.world_config_selected_mod
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.is_gamemod()
|
||||
if not modmgr.hide_gamemods then
|
||||
if modmgr.world_config_selected_mod <= #modmgr.worldconfig.game_mods then
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.render_worldmodlist()
|
||||
local retval = ""
|
||||
|
||||
for i=1,#modmgr.global_mods,1 do
|
||||
local parts = modmgr.global_mods[i]:split(DIR_DELIM)
|
||||
local shortname = parts[#parts]
|
||||
if modmgr.worldconfig.global_mods[shortname] then
|
||||
retval = retval .. "#22F922" .. modmgr.global_mods[i] .. ","
|
||||
else
|
||||
retval = retval .. modmgr.global_mods[i] .. ","
|
||||
end
|
||||
end
|
||||
|
||||
return retval
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.render_gamemodlist()
|
||||
local retval = ""
|
||||
for i=1,#modmgr.worldconfig.game_mods,1 do
|
||||
retval = retval ..
|
||||
"#0000FF" .. modmgr.worldconfig.game_mods[i] .. ","
|
||||
end
|
||||
|
||||
return retval
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.dialog_configure_world()
|
||||
modmgr.precheck()
|
||||
|
||||
local modpack_selected = false
|
||||
local gamemod_selected = modmgr.is_gamemod()
|
||||
local modname = ""
|
||||
local modfolder = ""
|
||||
local shortname = ""
|
||||
|
||||
if not gamemod_selected then
|
||||
local worldmodidx = modmgr.get_worldmod_idx()
|
||||
modname = modmgr.global_mods[worldmodidx]
|
||||
|
||||
if modname ~= nil then
|
||||
|
||||
if modname:find("<MODPACK>") ~= nil then
|
||||
modname = modname:sub(0,modname:find("<") -2)
|
||||
modpack_selected = true
|
||||
end
|
||||
|
||||
local parts = modmgr.global_mods[worldmodidx]:split(DIR_DELIM)
|
||||
shortname = parts[#parts]
|
||||
|
||||
modfolder = engine.get_modpath() .. DIR_DELIM .. modname
|
||||
else
|
||||
modname = ""
|
||||
end
|
||||
end
|
||||
|
||||
local worldspec = engine.get_worlds()[modmgr.world_config_selected_world]
|
||||
|
||||
local retval =
|
||||
"size[11,6.5]" ..
|
||||
"label[1.5,-0.25;World: " .. worldspec.name .. "]"
|
||||
|
||||
if modmgr.hide_gamemods then
|
||||
retval = retval .. "checkbox[5.5,6.15;cb_hide_gamemods;Hide Game;true]"
|
||||
else
|
||||
retval = retval .. "checkbox[5.5,6.15;cb_hide_gamemods;Hide Game;false]"
|
||||
end
|
||||
retval = retval ..
|
||||
"button[9.25,6.35;2,0.5;btn_config_world_save;Save]" ..
|
||||
"button[7.4,6.35;2,0.5;btn_config_world_cancel;Cancel]" ..
|
||||
"textlist[5.5,-0.25;5.5,6.5;world_config_modlist;"
|
||||
|
||||
|
||||
if not modmgr.hide_gamemods then
|
||||
retval = retval .. modmgr.render_gamemodlist()
|
||||
end
|
||||
|
||||
retval = retval .. modmgr.render_worldmodlist()
|
||||
|
||||
retval = retval .. ";" .. modmgr.world_config_selected_mod .."]"
|
||||
|
||||
if not gamemod_selected then
|
||||
retval = retval ..
|
||||
"label[0,0.45;Mod:]" ..
|
||||
"label[0.75,0.45;" .. modname .. "]" ..
|
||||
"label[0,1.5;depends on:]" ..
|
||||
"textlist[0,2;5,2;world_config_depends;" ..
|
||||
modmgr.get_dependencys(modfolder) .. ";0]" ..
|
||||
"label[0,4;depends on:]" ..
|
||||
"textlist[0,4.5;5,2;world_config_is_required;;0]"
|
||||
|
||||
if modpack_selected then
|
||||
retval = retval ..
|
||||
"button[-0.05,1.05;2,0.5;btn_cfgw_enable_all;Enable All]" ..
|
||||
"button[3.25,1.05;2,0.5;btn_cfgw_disable_all;Disable All]"
|
||||
else
|
||||
retval = retval ..
|
||||
"checkbox[0,0.8;cb_mod_enabled;enabled;"
|
||||
|
||||
if modmgr.worldconfig.global_mods[shortname] then
|
||||
retval = retval .. "true"
|
||||
else
|
||||
retval = retval .. "false"
|
||||
end
|
||||
|
||||
retval = retval .. "]"
|
||||
end
|
||||
end
|
||||
|
||||
return retval
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.handle_buttons(tab,fields)
|
||||
|
||||
local retval = nil
|
||||
|
||||
if tab == "mod_mgr" then
|
||||
retval = modmgr.handle_modmgr_buttons(fields)
|
||||
end
|
||||
|
||||
if tab == "dialog_rename_modpack" then
|
||||
retval = modmgr.handle_rename_modpack_buttons(fields)
|
||||
end
|
||||
|
||||
if tab == "dialog_delete_mod" then
|
||||
retval = modmgr.handle_delete_mod_buttons(fields)
|
||||
end
|
||||
|
||||
if tab == "dialog_configure_world" then
|
||||
retval = modmgr.handle_configure_world_buttons(fields)
|
||||
end
|
||||
|
||||
return retval
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.get_dependencys(modfolder)
|
||||
local filename = modfolder ..
|
||||
DIR_DELIM .. "depends.txt"
|
||||
|
||||
local dependencyfile = io.open(filename,"r")
|
||||
|
||||
local toadd = ""
|
||||
if dependencyfile then
|
||||
local dependency = dependencyfile:read("*l")
|
||||
while dependency do
|
||||
if toadd ~= "" then
|
||||
toadd = toadd .. ","
|
||||
end
|
||||
toadd = toadd .. dependency
|
||||
dependency = dependencyfile:read()
|
||||
end
|
||||
dependencyfile:close()
|
||||
else
|
||||
print("Modmgr:" .. filename .. " not found")
|
||||
end
|
||||
|
||||
return toadd
|
||||
end
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.get_worldconfig(worldpath)
|
||||
local filename = worldpath ..
|
||||
DIR_DELIM .. "world.mt"
|
||||
|
||||
local worldfile = io.open(filename,"r")
|
||||
|
||||
local worldconfig = {}
|
||||
worldconfig.global_mods = {}
|
||||
worldconfig.game_mods = {}
|
||||
|
||||
if worldfile then
|
||||
local dependency = worldfile:read("*l")
|
||||
while dependency do
|
||||
local parts = dependency:split("=")
|
||||
|
||||
local key = parts[1]:trim()
|
||||
|
||||
if key == "gameid" then
|
||||
worldconfig.id = parts[2]:trim()
|
||||
else
|
||||
local key = parts[1]:trim():sub(10)
|
||||
if parts[2]:trim() == "true" then
|
||||
worldconfig.global_mods[key] = true
|
||||
else
|
||||
worldconfig.global_mods[key] = false
|
||||
end
|
||||
end
|
||||
dependency = worldfile:read("*l")
|
||||
end
|
||||
worldfile:close()
|
||||
else
|
||||
print("Modmgr: " .. filename .. " not found")
|
||||
end
|
||||
|
||||
--read gamemods
|
||||
local gamemodpath = engine.get_gamepath() .. DIR_DELIM .. worldconfig.id .. DIR_DELIM .. "mods"
|
||||
|
||||
get_mods(gamemodpath,worldconfig.game_mods)
|
||||
|
||||
return worldconfig
|
||||
end
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.handle_modmgr_buttons(fields)
|
||||
local retval = {
|
||||
tab = nil,
|
||||
is_dialog = nil,
|
||||
show_buttons = nil,
|
||||
}
|
||||
|
||||
if fields["modlist"] ~= nil then
|
||||
local event = explode_textlist_event(fields["modlist"])
|
||||
modmgr.selected_mod = event.index
|
||||
end
|
||||
|
||||
if fields["btn_mod_mgr_install_local"] ~= nil then
|
||||
engine.show_file_open_dialog("mod_mgt_open_dlg","Select Mod File:")
|
||||
end
|
||||
|
||||
if fields["btn_mod_mgr_download"] ~= nil then
|
||||
retval.current_tab = "dialog_modstore_unsorted"
|
||||
retval.is_dialog = true
|
||||
retval.show_buttons = false
|
||||
return retval
|
||||
end
|
||||
|
||||
if fields["btn_mod_mgr_rename_modpack"] ~= nil then
|
||||
retval.current_tab = "dialog_rename_modpack"
|
||||
retval.is_dialog = true
|
||||
retval.show_buttons = false
|
||||
return retval
|
||||
end
|
||||
|
||||
if fields["btn_mod_mgr_delete_mod"] ~= nil then
|
||||
retval.current_tab = "dialog_delete_mod"
|
||||
retval.is_dialog = true
|
||||
retval.show_buttons = false
|
||||
return retval
|
||||
end
|
||||
|
||||
if fields["mod_mgt_open_dlg_accepted"] ~= nil and
|
||||
fields["mod_mgt_open_dlg_accepted"] ~= "" then
|
||||
modmgr.installmod(fields["mod_mgt_open_dlg_accepted"],nil)
|
||||
end
|
||||
|
||||
return nil;
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.installmod(modfilename,basename)
|
||||
local modfile = identify_filetype(modfilename)
|
||||
|
||||
local modpath = modmgr.extract(modfile)
|
||||
|
||||
if modpath == nil then
|
||||
gamedata.errormessage = "Install Mod: file: " .. modfile.name ..
|
||||
"\nInstall Mod: unsupported filetype \"" .. modfile.type .. "\""
|
||||
return
|
||||
end
|
||||
|
||||
|
||||
local basefolder = modmgr.getbasefolder(modpath)
|
||||
|
||||
if basefolder.type == "modpack" then
|
||||
local clean_path = nil
|
||||
|
||||
if basename ~= nil then
|
||||
clean_path = "mp_" .. basename
|
||||
end
|
||||
|
||||
if clean_path == nil then
|
||||
clean_path = get_last_folder(cleanup_path(basefolder.path))
|
||||
end
|
||||
|
||||
if clean_path ~= nil then
|
||||
local targetpath = engine.get_modpath() .. DIR_DELIM .. clean_path
|
||||
if not engine.copy_dir(basefolder.path,targetpath) then
|
||||
gamedata.errormessage = "Failed to install " .. basename .. " to " .. targetpath
|
||||
end
|
||||
else
|
||||
gamedata.errormessage = "Install Mod: unable to find suitable foldername for modpack "
|
||||
.. modfilename
|
||||
end
|
||||
end
|
||||
|
||||
if basefolder.type == "mod" then
|
||||
local targetfolder = basename
|
||||
|
||||
if targetfolder == nil then
|
||||
targetfolder = modmgr.identify_modname(basefolder.path,"init.lua")
|
||||
end
|
||||
|
||||
--if heuristic failed try to use current foldername
|
||||
if targetfolder == nil then
|
||||
targetfolder = get_last_folder(basefolder.path)
|
||||
end
|
||||
|
||||
if targetfolder ~= nil and modmgr.isValidModname(targetfolder) then
|
||||
local targetpath = engine.get_modpath() .. DIR_DELIM .. targetfolder
|
||||
engine.copy_dir(basefolder.path,targetpath)
|
||||
else
|
||||
gamedata.errormessage = "Install Mod: unable to find real modname for: "
|
||||
.. modfilename
|
||||
end
|
||||
end
|
||||
|
||||
engine.delete_dir(modpath)
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.handle_rename_modpack_buttons(fields)
|
||||
local oldname = modmgr.global_mods[modmgr.selected_mod]
|
||||
oldname = oldname:sub(0,oldname:find("<") -2)
|
||||
|
||||
if fields["dlg_rename_modpack_confirm"] ~= nil then
|
||||
local oldpath = engine.get_modpath() .. DIR_DELIM .. oldname
|
||||
local targetpath = engine.get_modpath() .. DIR_DELIM .. fields["te_modpack_name"]
|
||||
engine.copy_dir(oldpath,targetpath,false)
|
||||
end
|
||||
|
||||
return {
|
||||
is_dialog = false,
|
||||
show_buttons = true,
|
||||
current_tab = engine.setting_get("main_menu_tab")
|
||||
}
|
||||
end
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.handle_configure_world_buttons(fields)
|
||||
if fields["world_config_modlist"] ~= nil then
|
||||
local event = explode_textlist_event(fields["world_config_modlist"])
|
||||
modmgr.world_config_selected_mod = event.index
|
||||
end
|
||||
|
||||
if fields["cb_mod_enabled"] ~= nil then
|
||||
local index = modmgr.get_worldmod_idx()
|
||||
local modname = modmgr.global_mods[index]
|
||||
|
||||
local parts = modmgr.global_mods[index]:split(DIR_DELIM)
|
||||
local shortname = parts[#parts]
|
||||
|
||||
if fields["cb_mod_enabled"] == "true" then
|
||||
modmgr.worldconfig.global_mods[shortname] = true
|
||||
else
|
||||
modmgr.worldconfig.global_mods[shortname] = false
|
||||
end
|
||||
end
|
||||
|
||||
if fields["cb_hide_gamemods"] ~= nil then
|
||||
if fields["cb_hide_gamemods"] == "true" then
|
||||
modmgr.hide_gamemods = true
|
||||
else
|
||||
modmgr.hide_gamemods = false
|
||||
end
|
||||
end
|
||||
|
||||
if fields["btn_config_world_save"] then
|
||||
local worldspec = engine.get_worlds()[modmgr.world_config_selected_world]
|
||||
|
||||
local filename = worldspec.path ..
|
||||
DIR_DELIM .. "world.mt"
|
||||
|
||||
local worldfile = io.open(filename,"w")
|
||||
|
||||
if worldfile then
|
||||
worldfile:write("gameid = " .. modmgr.worldconfig.id .. "\n")
|
||||
for key,value in pairs(modmgr.worldconfig.global_mods) do
|
||||
if value then
|
||||
worldfile:write("load_mod_" .. key .. " = true" .. "\n")
|
||||
else
|
||||
worldfile:write("load_mod_" .. key .. " = false" .. "\n")
|
||||
end
|
||||
end
|
||||
|
||||
worldfile:close()
|
||||
end
|
||||
|
||||
modmgr.worldconfig = nil
|
||||
|
||||
return {
|
||||
is_dialog = false,
|
||||
show_buttons = true,
|
||||
current_tab = engine.setting_get("main_menu_tab")
|
||||
}
|
||||
end
|
||||
|
||||
if fields["btn_config_world_cancel"] then
|
||||
|
||||
modmgr.worldconfig = nil
|
||||
|
||||
return {
|
||||
is_dialog = false,
|
||||
show_buttons = true,
|
||||
current_tab = engine.setting_get("main_menu_tab")
|
||||
}
|
||||
end
|
||||
|
||||
if fields["btn_cfgw_enable_all"] then
|
||||
local worldmodidx = modmgr.get_worldmod_idx()
|
||||
modname = modmgr.global_mods[worldmodidx]
|
||||
|
||||
modname = modname:sub(0,modname:find("<") -2)
|
||||
|
||||
for i=1,#modmgr.global_mods,1 do
|
||||
|
||||
if modmgr.global_mods[i]:find("<MODPACK>") == nil then
|
||||
local modpackpart = modmgr.global_mods[i]:sub(0,modname:len())
|
||||
|
||||
if modpackpart == modname then
|
||||
local parts = modmgr.global_mods[i]:split(DIR_DELIM)
|
||||
local shortname = parts[#parts]
|
||||
modmgr.worldconfig.global_mods[shortname] = true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if fields["btn_cfgw_disable_all"] then
|
||||
local worldmodidx = modmgr.get_worldmod_idx()
|
||||
modname = modmgr.global_mods[worldmodidx]
|
||||
|
||||
modname = modname:sub(0,modname:find("<") -2)
|
||||
|
||||
for i=1,#modmgr.global_mods,1 do
|
||||
local modpackpart = modmgr.global_mods[i]:sub(0,modname:len())
|
||||
|
||||
if modpackpart == modname then
|
||||
local parts = modmgr.global_mods[i]:split(DIR_DELIM)
|
||||
local shortname = parts[#parts]
|
||||
modmgr.worldconfig.global_mods[shortname] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.handle_delete_mod_buttons(fields)
|
||||
local modname = modmgr.global_mods[modmgr.selected_mod]
|
||||
|
||||
if modname:find("<MODPACK>") ~= nil then
|
||||
modname = modname:sub(0,modname:find("<") -2)
|
||||
end
|
||||
|
||||
if fields["dlg_delete_mod_confirm"] ~= nil then
|
||||
local oldpath = engine.get_modpath() .. DIR_DELIM .. modname
|
||||
|
||||
if oldpath ~= nil and
|
||||
oldpath ~= "" and
|
||||
oldpath ~= engine.get_modpath() then
|
||||
engine.delete_dir(oldpath)
|
||||
end
|
||||
end
|
||||
|
||||
return {
|
||||
is_dialog = false,
|
||||
show_buttons = true,
|
||||
current_tab = engine.setting_get("main_menu_tab")
|
||||
}
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.dialog_delete_mod()
|
||||
|
||||
local modname = modmgr.global_mods[modmgr.selected_mod]
|
||||
|
||||
if modname:find("<MODPACK>") ~= nil then
|
||||
modname = modname:sub(0,modname:find("<") -2)
|
||||
end
|
||||
|
||||
local retval =
|
||||
"field[1.75,1;10,3;;Are you sure you want to delete ".. modname .. "?;]"..
|
||||
"button[4,4.2;1,0.5;dlg_delete_mod_confirm;Yes]" ..
|
||||
"button[6.5,4.2;3,0.5;dlg_delete_mod_cancel;No of course not!]"
|
||||
|
||||
return retval
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.init_worldconfig()
|
||||
|
||||
local worldspec = engine.get_worlds()[modmgr.world_config_selected_world]
|
||||
|
||||
if worldspec ~= nil then
|
||||
--read worldconfig
|
||||
modmgr.worldconfig = modmgr.get_worldconfig(worldspec.path)
|
||||
|
||||
if modmgr.worldconfig.id == nil or
|
||||
modmgr.worldconfig.id == "" then
|
||||
modmgr.worldconfig = nil
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modmgr.gettab(name)
|
||||
local retval = ""
|
||||
|
||||
if name == "mod_mgr" then
|
||||
retval = retval .. modmgr.tab()
|
||||
end
|
||||
|
||||
if name == "dialog_rename_modpack" then
|
||||
retval = retval .. modmgr.dialog_rename_modpack()
|
||||
end
|
||||
|
||||
if name == "dialog_delete_mod" then
|
||||
retval = retval .. modmgr.dialog_delete_mod()
|
||||
end
|
||||
|
||||
if name == "dialog_configure_world" then
|
||||
retval = retval .. modmgr.dialog_configure_world()
|
||||
end
|
||||
|
||||
return retval
|
||||
end
|
|
@ -1,276 +0,0 @@
|
|||
--Minetest
|
||||
--Copyright (C) 2013 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.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
--modstore implementation
|
||||
modstore = {}
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modstore.init()
|
||||
modstore.tabnames = {}
|
||||
|
||||
table.insert(modstore.tabnames,"dialog_modstore_unsorted")
|
||||
table.insert(modstore.tabnames,"dialog_modstore_search")
|
||||
|
||||
modstore.modsperpage = 5
|
||||
|
||||
modstore.basetexturedir = engine.get_gamepath() .. DIR_DELIM .. ".." ..
|
||||
DIR_DELIM .. "textures" .. DIR_DELIM .. "base" ..
|
||||
DIR_DELIM .. "pack" .. DIR_DELIM
|
||||
modstore.update_modlist()
|
||||
|
||||
modstore.current_list = nil
|
||||
|
||||
modstore.details_cache = {}
|
||||
end
|
||||
--------------------------------------------------------------------------------
|
||||
function modstore.nametoindex(name)
|
||||
|
||||
for i=1,#modstore.tabnames,1 do
|
||||
if modstore.tabnames[i] == name then
|
||||
return i
|
||||
end
|
||||
end
|
||||
|
||||
return 1
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modstore.gettab(tabname)
|
||||
local retval = ""
|
||||
|
||||
local is_modstore_tab = false
|
||||
|
||||
if tabname == "dialog_modstore_unsorted" then
|
||||
retval = modstore.getmodlist(modstore.modlist_unsorted)
|
||||
is_modstore_tab = true
|
||||
end
|
||||
|
||||
if tabname == "dialog_modstore_search" then
|
||||
|
||||
|
||||
is_modstore_tab = true
|
||||
end
|
||||
|
||||
if is_modstore_tab then
|
||||
return modstore.tabheader(tabname) .. retval
|
||||
end
|
||||
|
||||
if tabname == "modstore_mod_installed" then
|
||||
return "size[6,2]label[0.25,0.25;Mod: " .. modstore.lastmodtitle ..
|
||||
" installed successfully]" ..
|
||||
"button[2.5,1.5;1,0.5;btn_confirm_mod_successfull;ok]"
|
||||
end
|
||||
|
||||
return ""
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modstore.tabheader(tabname)
|
||||
local retval = "size[12,9.25]"
|
||||
retval = retval .. "tabheader[-0.3,-0.99;modstore_tab;" ..
|
||||
"Unsorted,Search;" ..
|
||||
modstore.nametoindex(tabname) .. ";true;false]"
|
||||
|
||||
return retval
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modstore.handle_buttons(current_tab,fields)
|
||||
|
||||
modstore.lastmodtitle = ""
|
||||
|
||||
if fields["modstore_tab"] then
|
||||
local index = tonumber(fields["modstore_tab"])
|
||||
|
||||
if index > 0 and
|
||||
index <= #modstore.tabnames then
|
||||
return {
|
||||
current_tab = modstore.tabnames[index],
|
||||
is_dialog = true,
|
||||
show_buttons = false
|
||||
}
|
||||
end
|
||||
|
||||
modstore.modlist_page = 0
|
||||
end
|
||||
|
||||
if fields["btn_modstore_page_up"] then
|
||||
if modstore.current_list ~= nil and modstore.current_list.page > 0 then
|
||||
modstore.current_list.page = modstore.current_list.page - 1
|
||||
end
|
||||
end
|
||||
|
||||
if fields["btn_modstore_page_down"] then
|
||||
if modstore.current_list ~= nil and
|
||||
modstore.current_list.page <modstore.current_list.pagecount then
|
||||
modstore.current_list.page = modstore.current_list.page +1
|
||||
end
|
||||
end
|
||||
|
||||
if fields["btn_confirm_mod_successfull"] then
|
||||
return {
|
||||
current_tab = modstore.tabnames[1],
|
||||
is_dialog = true,
|
||||
show_buttons = false
|
||||
}
|
||||
end
|
||||
|
||||
for i=1, modstore.modsperpage, 1 do
|
||||
local installbtn = "btn_install_mod_" .. i
|
||||
|
||||
if fields[installbtn] then
|
||||
local modlistentry =
|
||||
modstore.current_list.page * modstore.modsperpage + i
|
||||
|
||||
local moddetails = modstore.get_details(modstore.current_list.data[modlistentry].id)
|
||||
|
||||
local fullurl = engine.setting_get("modstore_download_url") ..
|
||||
moddetails.download_url
|
||||
local modfilename = os.tempfolder() .. ".zip"
|
||||
print("Downloading mod from: " .. fullurl .. " to ".. modfilename)
|
||||
|
||||
if engine.download_file(fullurl,modfilename) then
|
||||
|
||||
modmgr.installmod(modfilename,moddetails.basename)
|
||||
|
||||
os.remove(modfilename)
|
||||
modstore.lastmodtitle = modstore.current_list.data[modlistentry].title
|
||||
|
||||
return {
|
||||
current_tab = "modstore_mod_installed",
|
||||
is_dialog = true,
|
||||
show_buttons = false
|
||||
}
|
||||
else
|
||||
gamedata.errormessage = "Unable to download " ..
|
||||
moddetails.download_url .. " (internet connection?)"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modstore.update_modlist()
|
||||
modstore.modlist_unsorted = {}
|
||||
modstore.modlist_unsorted.data = engine.get_modstore_list()
|
||||
|
||||
if modstore.modlist_unsorted.data ~= nil then
|
||||
modstore.modlist_unsorted.pagecount =
|
||||
math.floor((#modstore.modlist_unsorted.data / modstore.modsperpage))
|
||||
else
|
||||
modstore.modlist_unsorted.data = {}
|
||||
modstore.modlist_unsorted.pagecount = 0
|
||||
end
|
||||
modstore.modlist_unsorted.page = 0
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modstore.getmodlist(list)
|
||||
local retval = ""
|
||||
retval = retval .. "label[10,-0.4;Page " .. (list.page +1) ..
|
||||
" of " .. (list.pagecount +1) .. "]"
|
||||
|
||||
retval = retval .. "button[11.6,-0.1;0.5,0.5;btn_modstore_page_up;^]"
|
||||
retval = retval .. "box[11.6,0.35;0.28,8.6;000000]"
|
||||
local scrollbarpos = 0.35 + (8.1/list.pagecount) * list.page
|
||||
retval = retval .. "box[11.6," ..scrollbarpos .. ";0.28,0.5;32CD32]"
|
||||
retval = retval .. "button[11.6,9.0;0.5,0.5;btn_modstore_page_down;v]"
|
||||
|
||||
|
||||
if #list.data < (list.page * modstore.modsperpage) then
|
||||
return retval
|
||||
end
|
||||
|
||||
local endmod = (list.page * modstore.modsperpage) + modstore.modsperpage
|
||||
|
||||
if (endmod > #list.data) then
|
||||
endmod = #list.data
|
||||
end
|
||||
|
||||
for i=(list.page * modstore.modsperpage) +1, endmod, 1 do
|
||||
--getmoddetails
|
||||
local details = modstore.get_details(list.data[i].id)
|
||||
|
||||
if details ~= nil then
|
||||
local screenshot_ypos = (i-1 - (list.page * modstore.modsperpage))*1.9 +0.2
|
||||
|
||||
retval = retval .. "box[0," .. screenshot_ypos .. ";11.4,1.75;FFFFFF]"
|
||||
|
||||
--screenshot
|
||||
if details.screenshot_url ~= nil and
|
||||
details.screenshot_url ~= "" then
|
||||
if list.data[i].texturename == nil then
|
||||
print("downloading screenshot: " .. details.screenshot_url)
|
||||
local filename = os.tempfolder()
|
||||
|
||||
if engine.download_file(details.screenshot_url,filename) then
|
||||
list.data[i].texturename = filename
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if list.data[i].texturename == nil then
|
||||
list.data[i].texturename = modstore.basetexturedir .. "no_screenshot.png"
|
||||
end
|
||||
|
||||
retval = retval .. "image[0,".. screenshot_ypos .. ";3,2;" ..
|
||||
list.data[i].texturename .. "]"
|
||||
|
||||
--title + author
|
||||
retval = retval .."label[2.75," .. screenshot_ypos .. ";" ..
|
||||
fs_escape_string(details.title) .. " (" .. details.author .. ")]"
|
||||
|
||||
--description
|
||||
local descriptiony = screenshot_ypos + 0.5
|
||||
retval = retval .. "textarea[3," .. descriptiony .. ";6.5,1.6;;" ..
|
||||
fs_escape_string(details.description) .. ";]"
|
||||
--rating
|
||||
local ratingy = screenshot_ypos + 0.6
|
||||
retval = retval .."label[10.1," .. ratingy .. ";Rating: " .. details.rating .."]"
|
||||
|
||||
--install button
|
||||
local buttony = screenshot_ypos + 1.2
|
||||
local buttonnumber = (i - (list.page * modstore.modsperpage))
|
||||
retval = retval .."button[9.6," .. buttony .. ";2,0.5;btn_install_mod_" .. buttonnumber .. ";"
|
||||
|
||||
if modmgr.mod_exists(details.basename) then
|
||||
retval = retval .. "re-Install]"
|
||||
else
|
||||
retval = retval .. "Install]"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
modstore.current_list = list
|
||||
|
||||
return retval
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function modstore.get_details(modid)
|
||||
|
||||
if modstore.details_cache[modid] ~= nil then
|
||||
return modstore.details_cache[modid]
|
||||
end
|
||||
|
||||
local retval = engine.get_modstore_details(tostring(modid))
|
||||
modstore.details_cache[modid] = retval
|
||||
return retval
|
||||
end
|
||||
|
|
@ -1,141 +0,0 @@
|
|||
|
||||
vector = {}
|
||||
|
||||
function vector.new(a, b, c)
|
||||
v = {x=0, y=0, z=0}
|
||||
if type(a) == "table" then
|
||||
v = {x=a.x, y=a.y, z=a.z}
|
||||
elseif a and b and c then
|
||||
v = {x=a, y=b, z=c}
|
||||
end
|
||||
setmetatable(v, {
|
||||
__add = vector.add,
|
||||
__sub = vector.subtract,
|
||||
__mul = vector.multiply,
|
||||
__div = vector.divide,
|
||||
__umn = function(v) return vector.multiply(v, -1) end,
|
||||
__len = vector.length,
|
||||
__eq = vector.equals,
|
||||
})
|
||||
return v
|
||||
end
|
||||
|
||||
function vector.equals(a, b)
|
||||
return a.x == b.x and
|
||||
a.y == b.y and
|
||||
a.z == b.z
|
||||
end
|
||||
|
||||
function vector.length(v)
|
||||
return math.hypot(v.x, math.hypot(v.y, v.z))
|
||||
end
|
||||
|
||||
function vector.normalize(v)
|
||||
local len = vector.length(v)
|
||||
if len == 0 then
|
||||
return vector.new()
|
||||
else
|
||||
return vector.divide(v, len)
|
||||
end
|
||||
end
|
||||
|
||||
function vector.round(v)
|
||||
return {
|
||||
x = math.floor(v.x + 0.5),
|
||||
y = math.floor(v.y + 0.5),
|
||||
z = math.floor(v.z + 0.5)
|
||||
}
|
||||
end
|
||||
|
||||
function vector.distance(a, b)
|
||||
local x = a.x - b.x
|
||||
local y = a.y - b.y
|
||||
local z = a.z - b.z
|
||||
return math.hypot(x, math.hypot(y, z))
|
||||
end
|
||||
|
||||
function vector.direction(pos1, pos2)
|
||||
local x_raw = pos2.x - pos1.x
|
||||
local y_raw = pos2.y - pos1.y
|
||||
local z_raw = pos2.z - pos1.z
|
||||
local x_abs = math.abs(x_raw)
|
||||
local y_abs = math.abs(y_raw)
|
||||
local z_abs = math.abs(z_raw)
|
||||
if x_abs >= y_abs and
|
||||
x_abs >= z_abs then
|
||||
y_raw = y_raw * (1 / x_abs)
|
||||
z_raw = z_raw * (1 / x_abs)
|
||||
x_raw = x_raw / x_abs
|
||||
end
|
||||
if y_abs >= x_abs and
|
||||
y_abs >= z_abs then
|
||||
x_raw = x_raw * (1 / y_abs)
|
||||
z_raw = z_raw * (1 / y_abs)
|
||||
y_raw = y_raw / y_abs
|
||||
end
|
||||
if z_abs >= y_abs and
|
||||
z_abs >= x_abs then
|
||||
x_raw = x_raw * (1 / z_abs)
|
||||
y_raw = y_raw * (1 / z_abs)
|
||||
z_raw = z_raw / z_abs
|
||||
end
|
||||
return {x=x_raw, y=y_raw, z=z_raw}
|
||||
end
|
||||
|
||||
|
||||
function vector.add(a, b)
|
||||
if type(b) == "table" then
|
||||
return vector.new(
|
||||
a.x + b.x,
|
||||
a.y + b.y,
|
||||
a.z + b.z)
|
||||
else
|
||||
return vector.new(
|
||||
a.x + b,
|
||||
a.y + b,
|
||||
a.z + b)
|
||||
end
|
||||
end
|
||||
|
||||
function vector.subtract(a, b)
|
||||
if type(b) == "table" then
|
||||
return vector.new(
|
||||
a.x - b.x,
|
||||
a.y - b.y,
|
||||
a.z - b.z)
|
||||
else
|
||||
return vector.new(
|
||||
a.x - b,
|
||||
a.y - b,
|
||||
a.z - b)
|
||||
end
|
||||
end
|
||||
|
||||
function vector.multiply(a, b)
|
||||
if type(b) == "table" then
|
||||
return vector.new(
|
||||
a.x * b.x,
|
||||
a.y * b.y,
|
||||
a.z * b.z)
|
||||
else
|
||||
return vector.new(
|
||||
a.x * b,
|
||||
a.y * b,
|
||||
a.z * b)
|
||||
end
|
||||
end
|
||||
|
||||
function vector.divide(a, b)
|
||||
if type(b) == "table" then
|
||||
return vector.new(
|
||||
a.x / b.x,
|
||||
a.y / b.y,
|
||||
a.z / b.z)
|
||||
else
|
||||
return vector.new(
|
||||
a.x / b,
|
||||
a.y / b,
|
||||
a.z / b)
|
||||
end
|
||||
end
|
||||
|
|
@ -44,22 +44,6 @@ function VoxelArea:indexp(p)
|
|||
return math.floor(i)
|
||||
end
|
||||
|
||||
function VoxelArea:position(i)
|
||||
local p = {}
|
||||
|
||||
i = i - 1
|
||||
|
||||
p.z = math.floor(i / self.zstride) + self.MinEdge.z
|
||||
i = i % self.zstride
|
||||
|
||||
p.y = math.floor(i / self.ystride) + self.MinEdge.y
|
||||
i = i % self.ystride
|
||||
|
||||
p.x = math.floor(i) + self.MinEdge.x
|
||||
|
||||
return p
|
||||
end
|
||||
|
||||
function VoxelArea:contains(x, y, z)
|
||||
return (x >= self.MinEdge.x) and (x <= self.MaxEdge.x) and
|
||||
(y >= self.MinEdge.y) and (y <= self.MaxEdge.y) and
|
||||
|
@ -76,28 +60,3 @@ function VoxelArea:containsi(i)
|
|||
return (i >= 1) and (i <= self:getVolume())
|
||||
end
|
||||
|
||||
function VoxelArea:iter(minx, miny, minz, maxx, maxy, maxz)
|
||||
local i = self:index(minx, miny, minz) - 1
|
||||
local last = self:index(maxx, maxy, maxz)
|
||||
local ystride = self.ystride
|
||||
local zstride = self.zstride
|
||||
local yoff = (last+1) % ystride
|
||||
local zoff = (last+1) % zstride
|
||||
local ystridediff = (i - last) % ystride
|
||||
local zstridediff = (i - last) % zstride
|
||||
return function()
|
||||
i = i + 1
|
||||
if i % zstride == zoff then
|
||||
i = i + zstridediff
|
||||
elseif i % ystride == yoff then
|
||||
i = i + ystridediff
|
||||
end
|
||||
if i <= last then
|
||||
return i
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function VoxelArea:iterp(minp, maxp)
|
||||
return self:iter(minp.x, minp.y, minp.z, maxp.x, maxp.y, maxp.z)
|
||||
end
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
trans_alphach
|
|
@ -1,47 +0,0 @@
|
|||
|
||||
uniform sampler2D myTexture;
|
||||
uniform sampler2D normalTexture;
|
||||
|
||||
uniform vec4 skyBgColor;
|
||||
uniform float fogDistance;
|
||||
|
||||
varying vec3 vPosition;
|
||||
|
||||
varying vec3 viewVec;
|
||||
|
||||
void main (void)
|
||||
{
|
||||
vec4 col = texture2D(myTexture, vec2(gl_TexCoord[0]));
|
||||
float alpha = col.a;
|
||||
vec2 uv = gl_TexCoord[0].st;
|
||||
vec4 base = texture2D(myTexture, uv);
|
||||
vec4 final_color = vec4(0.2, 0.2, 0.2, 1.0) * base;
|
||||
vec3 vVec = normalize(viewVec);
|
||||
vec3 bump = normalize(texture2D(normalTexture, uv).xyz * 2.0 - 1.0);
|
||||
vec3 R = reflect(-vVec, bump);
|
||||
vec3 lVec = normalize(vec3(0.0, -0.4, 0.5));
|
||||
float diffuse = max(dot(lVec, bump), 0.0);
|
||||
|
||||
vec3 color = diffuse * texture2D(myTexture, gl_TexCoord[0].st).rgb;
|
||||
|
||||
|
||||
float specular = pow(clamp(dot(R, lVec), 0.0, 1.0),1.0);
|
||||
vec4 vSpecular = 0.2*specular * diffuse;
|
||||
color += vSpecular;
|
||||
|
||||
|
||||
col = vec4(color.r, color.g, color.b, alpha);
|
||||
col *= gl_Color;
|
||||
col = col * col; // SRGB -> Linear
|
||||
col *= 1.8;
|
||||
col.r = 1.0 - exp(1.0 - col.r) / exp(1.0);
|
||||
col.g = 1.0 - exp(1.0 - col.g) / exp(1.0);
|
||||
col.b = 1.0 - exp(1.0 - col.b) / exp(1.0);
|
||||
col = sqrt(col); // Linear -> SRGB
|
||||
if(fogDistance != 0.0){
|
||||
float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
|
||||
alpha = mix(alpha, 0.0, d);
|
||||
}
|
||||
|
||||
gl_FragColor = vec4(col.r, col.g, col.b, alpha);
|
||||
}
|
|
@ -1,98 +0,0 @@
|
|||
|
||||
uniform mat4 mWorldViewProj;
|
||||
uniform mat4 mInvWorld;
|
||||
uniform mat4 mTransWorld;
|
||||
uniform float dayNightRatio;
|
||||
|
||||
varying vec3 vPosition;
|
||||
varying vec3 viewVec;
|
||||
|
||||
void main(void)
|
||||
{
|
||||
gl_Position = mWorldViewProj * gl_Vertex;
|
||||
|
||||
vPosition = (mWorldViewProj * gl_Vertex).xyz;
|
||||
|
||||
vec3 tangent;
|
||||
vec3 binormal;
|
||||
|
||||
vec3 c1 = cross( gl_Normal, vec3(0.0, 0.0, 1.0) );
|
||||
vec3 c2 = cross( gl_Normal, vec3(0.0, 1.0, 0.0) );
|
||||
|
||||
if( length(c1)>length(c2) )
|
||||
{
|
||||
tangent = c1;
|
||||
}
|
||||
else
|
||||
{
|
||||
tangent = c2;
|
||||
}
|
||||
|
||||
tangent = normalize(tangent);
|
||||
|
||||
//binormal = cross(gl_Normal, tangent);
|
||||
//binormal = normalize(binormal);
|
||||
|
||||
vec4 color;
|
||||
//color = vec4(1.0, 1.0, 1.0, 1.0);
|
||||
|
||||
float day = gl_Color.r;
|
||||
float night = gl_Color.g;
|
||||
float light_source = gl_Color.b;
|
||||
|
||||
/*color.r = mix(night, day, dayNightRatio);
|
||||
color.g = color.r;
|
||||
color.b = color.r;*/
|
||||
|
||||
float rg = mix(night, day, dayNightRatio);
|
||||
rg += light_source * 1.5; // Make light sources brighter
|
||||
float b = rg;
|
||||
|
||||
// Moonlight is blue
|
||||
b += (day - night) / 13.0;
|
||||
rg -= (day - night) / 13.0;
|
||||
|
||||
// Emphase blue a bit in darker places
|
||||
// See C++ implementation in mapblock_mesh.cpp finalColorBlend()
|
||||
b += max(0.0, (1.0 - abs(b - 0.13)/0.17) * 0.025);
|
||||
|
||||
// Artificial light is yellow-ish
|
||||
// See C++ implementation in mapblock_mesh.cpp finalColorBlend()
|
||||
rg += max(0.0, (1.0 - abs(rg - 0.85)/0.15) * 0.065);
|
||||
|
||||
color.r = rg;
|
||||
color.g = rg;
|
||||
color.b = b;
|
||||
|
||||
// Make sides and bottom darker than the top
|
||||
color = color * color; // SRGB -> Linear
|
||||
if(gl_Normal.y <= 0.5)
|
||||
color *= 0.6;
|
||||
//color *= 0.7;
|
||||
color = sqrt(color); // Linear -> SRGB
|
||||
|
||||
color.a = gl_Color.a;
|
||||
|
||||
gl_FrontColor = gl_BackColor = color;
|
||||
|
||||
gl_TexCoord[0] = gl_MultiTexCoord0;
|
||||
|
||||
vec3 n1 = normalize(gl_NormalMatrix * gl_Normal);
|
||||
vec4 tangent1 = vec4(tangent.x, tangent.y, tangent.z, 0);
|
||||
//vec3 t1 = normalize(gl_NormalMatrix * tangent1);
|
||||
//vec3 b1 = cross(n1, t1);
|
||||
|
||||
vec3 v;
|
||||
vec3 vVertex = vec3(gl_ModelViewMatrix * gl_Vertex);
|
||||
vec3 vVec = -vVertex;
|
||||
//v.x = dot(vVec, t1);
|
||||
//v.y = dot(vVec, b1);
|
||||
//v.z = dot(vVec, n1);
|
||||
//viewVec = vVec;
|
||||
viewVec = normalize(vec3(0.0, -0.4, 0.5));
|
||||
//Vector representing the 0th texture coordinate passed to fragment shader
|
||||
//gl_TexCoord[0] = vec2(gl_MultiTexCoord0);
|
||||
|
||||
// Transform the current vertex
|
||||
//gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
trans_alphach_ref
|
|
@ -1,46 +0,0 @@
|
|||
|
||||
uniform sampler2D myTexture;
|
||||
uniform sampler2D normalTexture;
|
||||
|
||||
uniform vec4 skyBgColor;
|
||||
uniform float fogDistance;
|
||||
|
||||
varying vec3 vPosition;
|
||||
|
||||
varying vec3 viewVec;
|
||||
|
||||
void main (void)
|
||||
{
|
||||
vec4 col = texture2D(myTexture, vec2(gl_TexCoord[0]));
|
||||
float alpha = col.a;
|
||||
vec2 uv = gl_TexCoord[0].st;
|
||||
vec4 base = texture2D(myTexture, uv);
|
||||
vec4 final_color = vec4(0.2, 0.2, 0.2, 1.0) * base;
|
||||
vec3 vVec = normalize(viewVec);
|
||||
vec3 bump = normalize(texture2D(normalTexture, uv).xyz * 2.0 - 1.0);
|
||||
vec3 R = reflect(-vVec, bump);
|
||||
vec3 lVec = normalize(vec3(0.0, -0.4, 0.5));
|
||||
float diffuse = max(dot(lVec, bump), 0.0);
|
||||
|
||||
vec3 color = diffuse * texture2D(myTexture, gl_TexCoord[0].st).rgb;
|
||||
|
||||
|
||||
float specular = pow(clamp(dot(R, lVec), 0.0, 1.0),1.0);
|
||||
vec4 vSpecular = 0.2*specular * diffuse;
|
||||
color += vSpecular;
|
||||
|
||||
|
||||
col = vec4(color.r, color.g, color.b, alpha);
|
||||
col *= gl_Color;
|
||||
col = col * col; // SRGB -> Linear
|
||||
col *= 1.8;
|
||||
col.r = 1.0 - exp(1.0 - col.r) / exp(1.0);
|
||||
col.g = 1.0 - exp(1.0 - col.g) / exp(1.0);
|
||||
col.b = 1.0 - exp(1.0 - col.b) / exp(1.0);
|
||||
col = sqrt(col); // Linear -> SRGB
|
||||
if(fogDistance != 0.0){
|
||||
float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
|
||||
col = mix(col, skyBgColor, d);
|
||||
}
|
||||
gl_FragColor = vec4(col.r, col.g, col.b, alpha);
|
||||
}
|
|
@ -1,98 +0,0 @@
|
|||
|
||||
uniform mat4 mWorldViewProj;
|
||||
uniform mat4 mInvWorld;
|
||||
uniform mat4 mTransWorld;
|
||||
uniform float dayNightRatio;
|
||||
|
||||
varying vec3 vPosition;
|
||||
varying vec3 viewVec;
|
||||
|
||||
void main(void)
|
||||
{
|
||||
gl_Position = mWorldViewProj * gl_Vertex;
|
||||
|
||||
vPosition = (mWorldViewProj * gl_Vertex).xyz;
|
||||
|
||||
vec3 tangent;
|
||||
vec3 binormal;
|
||||
|
||||
vec3 c1 = cross( gl_Normal, vec3(0.0, 0.0, 1.0) );
|
||||
vec3 c2 = cross( gl_Normal, vec3(0.0, 1.0, 0.0) );
|
||||
|
||||
if( length(c1)>length(c2) )
|
||||
{
|
||||
tangent = c1;
|
||||
}
|
||||
else
|
||||
{
|
||||
tangent = c2;
|
||||
}
|
||||
|
||||
tangent = normalize(tangent);
|
||||
|
||||
//binormal = cross(gl_Normal, tangent);
|
||||
//binormal = normalize(binormal);
|
||||
|
||||
vec4 color;
|
||||
//color = vec4(1.0, 1.0, 1.0, 1.0);
|
||||
|
||||
float day = gl_Color.r;
|
||||
float night = gl_Color.g;
|
||||
float light_source = gl_Color.b;
|
||||
|
||||
/*color.r = mix(night, day, dayNightRatio);
|
||||
color.g = color.r;
|
||||
color.b = color.r;*/
|
||||
|
||||
float rg = mix(night, day, dayNightRatio);
|
||||
rg += light_source * 1.5; // Make light sources brighter
|
||||
float b = rg;
|
||||
|
||||
// Moonlight is blue
|
||||
b += (day - night) / 13.0;
|
||||
rg -= (day - night) / 13.0;
|
||||
|
||||
// Emphase blue a bit in darker places
|
||||
// See C++ implementation in mapblock_mesh.cpp finalColorBlend()
|
||||
b += max(0.0, (1.0 - abs(b - 0.13)/0.17) * 0.025);
|
||||
|
||||
// Artificial light is yellow-ish
|
||||
// See C++ implementation in mapblock_mesh.cpp finalColorBlend()
|
||||
rg += max(0.0, (1.0 - abs(rg - 0.85)/0.15) * 0.065);
|
||||
|
||||
color.r = rg;
|
||||
color.g = rg;
|
||||
color.b = b;
|
||||
|
||||
// Make sides and bottom darker than the top
|
||||
color = color * color; // SRGB -> Linear
|
||||
if(gl_Normal.y <= 0.5)
|
||||
color *= 0.6;
|
||||
//color *= 0.7;
|
||||
color = sqrt(color); // Linear -> SRGB
|
||||
|
||||
color.a = gl_Color.a;
|
||||
|
||||
gl_FrontColor = gl_BackColor = color;
|
||||
|
||||
gl_TexCoord[0] = gl_MultiTexCoord0;
|
||||
|
||||
vec3 n1 = normalize(gl_NormalMatrix * gl_Normal);
|
||||
vec4 tangent1 = vec4(tangent.x, tangent.y, tangent.z, 0);
|
||||
//vec3 t1 = normalize(gl_NormalMatrix * tangent1);
|
||||
//vec3 b1 = cross(n1, t1);
|
||||
|
||||
vec3 v;
|
||||
vec3 vVertex = vec3(gl_ModelViewMatrix * gl_Vertex);
|
||||
vec3 vVec = -vVertex;
|
||||
//v.x = dot(vVec, t1);
|
||||
//v.y = dot(vVec, b1);
|
||||
//v.z = dot(vVec, n1);
|
||||
//viewVec = vVec;
|
||||
viewVec = normalize(vec3(0.0, -0.4, 0.5));
|
||||
//Vector representing the 0th texture coordinate passed to fragment shader
|
||||
//gl_TexCoord[0] = vec2(gl_MultiTexCoord0);
|
||||
|
||||
// Transform the current vertex
|
||||
//gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
|
||||
}
|
128
doc/lua_api.txt
128
doc/lua_api.txt
|
@ -507,7 +507,8 @@ Representations of simple things
|
|||
--------------------------------
|
||||
Position/vector:
|
||||
{x=num, y=num, z=num}
|
||||
For helper functions see "Vector helpers".
|
||||
Currently the API does not provide any helper functions for addition,
|
||||
subtraction and whatever; you can define those that you need yourself.
|
||||
|
||||
pointed_thing:
|
||||
{type="nothing"}
|
||||
|
@ -882,15 +883,6 @@ background[<X>,<Y>;<W>,<H>;<texture name>]
|
|||
^ Position and size units are inventory slots
|
||||
^ Example for formspec 8x4 in 16x resolution: image shall be sized 8*16px x 4*16px
|
||||
|
||||
pwdfield[<X>,<Y>;<W>,<H>;<name>;<label>]
|
||||
^ Textual password style field; will be sent to server when a button is clicked
|
||||
^ x and y position the field relative to the top left of the menu
|
||||
^ w and h are the size of the field
|
||||
^ fields are a set height, but will be vertically centred on h
|
||||
^ Position and size units are inventory slots
|
||||
^ name is the name of the field as returned in fields to on_receive_fields
|
||||
^ label, if not blank, will be text printed on the top left above the field
|
||||
|
||||
field[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]
|
||||
^ Textual field; will be sent to server when a button is clicked
|
||||
^ x and y position the field relative to the top left of the menu
|
||||
|
@ -918,12 +910,6 @@ label[<X>,<Y>;<label>]
|
|||
^ label is the text on the label
|
||||
^ Position and size units are inventory slots
|
||||
|
||||
vertlabel[<X>,<Y>;<label>]
|
||||
^ Textual label drawn verticaly
|
||||
^ x and y work as per field
|
||||
^ label is the text on the label
|
||||
^ Position and size units are inventory slots
|
||||
|
||||
button[<X>,<Y>;<W>,<H>;<name>;<label>]
|
||||
^ Clickable button. When clicked, fields will be sent.
|
||||
^ x, y and name work as per field
|
||||
|
@ -936,13 +922,6 @@ image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>]
|
|||
^ image is the filename of an image
|
||||
^ Position and size units are inventory slots
|
||||
|
||||
image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>;<noclip>;<drawborder>]
|
||||
^ x, y, w, h, and name work as per button
|
||||
^ image is the filename of an image
|
||||
^ Position and size units are inventory slots
|
||||
^ noclip true meand imagebutton doesn't need to be within specified formsize
|
||||
^ drawborder draw button bodrer or not
|
||||
|
||||
item_image_button[<X>,<Y>;<W>,<H>;<item name>;<name>;<label>]
|
||||
^ x, y, w, h, name and label work as per button
|
||||
^ item name is the registered name of an item/node,
|
||||
|
@ -955,51 +934,6 @@ button_exit[<X>,<Y>;<W>,<H>;<name>;<label>]
|
|||
image_button_exit[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>]
|
||||
^ When clicked, fields will be sent and the form will quit.
|
||||
|
||||
textlist[<X>,<Y>;<W>,<H>;<name>;<listelem 1>,<listelem 2>,...,<listelem n>]
|
||||
^Scrollabel itemlist showing arbitrary text elements
|
||||
^ x and y position the itemlist relative to the top left of the menu
|
||||
^ w and h are the size of the itemlist
|
||||
^ name fieldname sent to server on doubleclick value is current selected element
|
||||
^ listelements can be prepended by #colorkey (see colorkeys),
|
||||
^ if you want a listelement to start with # write ##
|
||||
|
||||
textlist[<X>,<Y>;<W>,<H>;<name>;<listelem 1>,<listelem 2>,...,<listelem n>;<selected idx>;<transparent>]
|
||||
^Scrollabel itemlist showing arbitrary text elements
|
||||
^ x and y position the itemlist relative to the top left of the menu
|
||||
^ w and h are the size of the itemlist
|
||||
^ name fieldname sent to server on doubleclick value is current selected element
|
||||
^ listelements can be prepended by #RRGGBB in hexadecimal format
|
||||
^ if you want a listelement to start with # write ##
|
||||
^ index to be selected within textlist
|
||||
^ true/false draw transparent background
|
||||
|
||||
tabheader[<X>,<Y>;<name>;<caption 1>,<caption 2>,...,<caption n>;<current_tab>;<transparent>;<draw_border>]
|
||||
^ show a tabHEADER at specific position (ignores formsize)
|
||||
^ x and y position the itemlist relative to the top left of the menu
|
||||
^ name fieldname data is transfered to lua
|
||||
^ caption 1... name shown on top of tab
|
||||
^ current_tab index of selected tab 1...
|
||||
^ transparent (optional) show transparent
|
||||
^ draw_border (optional) draw border
|
||||
|
||||
box[<X>,<Y>;<W>,<H>;<color>]
|
||||
^ simple colored semitransparent box
|
||||
^ x and y position the box relative to the top left of the menu
|
||||
^ w and h are the size of box
|
||||
^ colorkey (see colorkeys)
|
||||
|
||||
dropdown[<X>,<Y>;<W>;<name>;<item 1>,<item 2>, ...,<item n>;<selected idx>]
|
||||
^ show a dropdown field
|
||||
^ x and y position of dropdown
|
||||
^ width of dropdown
|
||||
^ fieldname data is transfered to lua
|
||||
^ items to be shown in dropdown
|
||||
^ index of currently selected dropdown item
|
||||
^ color in hexadecimal format RRGGBB
|
||||
|
||||
Note: do NOT use a element name starting with "key_" those names are reserved to
|
||||
pass key press events to formspec!
|
||||
|
||||
Inventory location:
|
||||
|
||||
- "context": Selected node metadata (deprecated: "current_name")
|
||||
|
@ -1008,41 +942,12 @@ Inventory location:
|
|||
- "nodemeta:<X>,<Y>,<Z>": Any node metadata
|
||||
- "detached:<name>": A detached inventory
|
||||
|
||||
Vector helpers
|
||||
---------------
|
||||
vector.new([x[, y, z]]) -> vector
|
||||
^ x is a table or the x position.
|
||||
vector.direction(p1, p2) -> vector
|
||||
vector.distance(p1, p2) -> number
|
||||
vector.length(v) -> number
|
||||
vector.normalize(v) -> vector
|
||||
vector.round(v) -> vector
|
||||
vector.equal(v1, v2) -> bool
|
||||
vector.add(v, x) -> vector
|
||||
^ x can be annother vector or a number
|
||||
vector.subtract(v, x) -> vector
|
||||
vector.multiply(v, x) -> vector
|
||||
vector.divide(v, x) -> vector
|
||||
|
||||
You can also use Lua operators on vectors.
|
||||
For example:
|
||||
v1 = vector.new()
|
||||
v1 = v1 + 5
|
||||
v2 = vector.new(v1)
|
||||
v1 = v1 * v2
|
||||
if v1 == v2 then
|
||||
error("Math broke")
|
||||
end
|
||||
|
||||
Helper functions
|
||||
-----------------
|
||||
dump2(obj, name="_", dumped={})
|
||||
^ Return object serialized as a string, handles reference loops
|
||||
dump(obj, dumped={})
|
||||
^ Return object serialized as a string
|
||||
math.hypot(x, y)
|
||||
^ Get the hypotenuse of a triangle with legs x and y.
|
||||
Usefull for distance calculation.
|
||||
string:split(separator)
|
||||
^ eg. string:split("a,b", ",") == {"a","b"}
|
||||
string:trim()
|
||||
|
@ -1404,10 +1309,8 @@ minetest.create_schematic(p1, p2, probability_list, filename)
|
|||
^ If probability_list is nil, no probabilities are applied.
|
||||
^ Saves schematic in the Minetest Schematic format to filename.
|
||||
|
||||
minetest.place_schematic(pos, schematic, rotation)
|
||||
minetest.place_schematic(pos, schematic)
|
||||
^ Place the schematic specified by schematic (see: Schematic specifier) at pos.
|
||||
^ Rotation can be "0", "90", "180", "270", or "random".
|
||||
^ If the rotation parameter is omitted, the schematic is not rotated.
|
||||
|
||||
Random:
|
||||
minetest.get_connected_players() -> list of ObjectRefs
|
||||
|
@ -1660,11 +1563,13 @@ methods:
|
|||
- update_map(): Update map after writing chunk back to map.
|
||||
^ To be used only by VoxelManip objects created by the mod itself; not a VoxelManip that was
|
||||
^ retrieved from minetest.get_mapgen_object
|
||||
- set_lighting(light): Set the lighting within the VoxelManip
|
||||
^ light is a table, {day=<0...15>, night=<0...15>}
|
||||
^ To be used only by a VoxelManip object from minetest.get_mapgen_object
|
||||
- calc_lighting(): Calculate lighting within the VoxelManip
|
||||
^ To be used only by a VoxelManip object from minetest.get_mapgen_object
|
||||
- set_lighting(p1, p2, light): Set the lighting in the region formed by p1 and p2 to light
|
||||
^ light is a table containing two integer fields ranging from 0 to 15, day and night
|
||||
^ To be used only by a VoxelManip object from minetest.get_mapgen_object; otherwise, set lighting will
|
||||
^ be ignored
|
||||
- calc_lighting(p1, p2): Calculate lighting in the region formed by p1 and p2
|
||||
^ To be used only by a VoxelManip object from minetest.get_mapgen_object; otherwise, calculated lighting
|
||||
^ will be ignored
|
||||
- update_liquids(): Update liquid flow
|
||||
|
||||
VoxelArea: A helper class for voxel areas
|
||||
|
@ -1676,13 +1581,6 @@ methods:
|
|||
- index(x, y, z): returns the index of an absolute position in a flat array starting at 1
|
||||
^ useful for things like VoxelManip, raw Schematic specifiers, PerlinNoiseMap:get2d/3dMap, and so on
|
||||
- indexp(p): same as above, except takes a vector
|
||||
- position(i): returns the absolute position vector corresponding to index i
|
||||
- contains(x, y, z): check if (x,y,z) is inside area formed by MinEdge and MaxEdge
|
||||
- containsp(p): same as above, except takes a vector
|
||||
- containsi(i): same as above, except takes an index
|
||||
- iter(minx, miny, minz, maxx, maxy, maxz): returns an iterator that returns indices
|
||||
^ from (minx,miny,minz) to (maxx,maxy,maxz) in the order of [z [y [x]]]
|
||||
- iterp(minp, maxp): same as above, except takes a vector
|
||||
|
||||
Mapgen objects
|
||||
---------------
|
||||
|
@ -1694,8 +1592,8 @@ get_mapgen_object() was called outside of an on_generate() callback, nil is retu
|
|||
The following Mapgen objects are currently available:
|
||||
|
||||
- voxelmanip
|
||||
This returns three values; the VoxelManip object to be used, minimum and maximum emerged position, in that
|
||||
order. All mapgens support this object.
|
||||
This returns four values; the VoxelManip object to be used, the voxel data, minimum emerge position,
|
||||
and maximum emerged position. All mapgens support this object.
|
||||
|
||||
- heightmap
|
||||
Returns an array containing the y coordinates of the ground levels of nodes in the most recently
|
||||
|
@ -2152,8 +2050,6 @@ Decoration definition (register_decoration)
|
|||
^ See 'Schematic specifier' for details.
|
||||
flags = "place_center_x, place_center_z",
|
||||
^ Flags for schematic decorations. See 'Schematic attributes'.
|
||||
rotation = "90" --rotate schematic 90 degrees on placement
|
||||
^ Rotation can be "0", "90", "180", "270", or "random".
|
||||
}
|
||||
|
||||
Chatcommand definition (register_chatcommand)
|
||||
|
|
|
@ -1,163 +0,0 @@
|
|||
Minetest Lua Mainmenu API Reference 0.4.6
|
||||
========================================
|
||||
|
||||
Introduction
|
||||
-------------
|
||||
The main menu is defined as a formspec by Lua in builtin/mainmenu.lua
|
||||
Description of formspec language to show your menu is in lua_api.txt
|
||||
|
||||
Callbacks
|
||||
---------
|
||||
engine.buttonhandler(fields): called when a button is pressed.
|
||||
^ fields = {name1 = value1, name2 = value2, ...}
|
||||
engine.event_handler(event)
|
||||
^ event: "MenuQuit", "KeyEnter", "ExitButton" or "EditBoxEnter"
|
||||
|
||||
Gamedata
|
||||
--------
|
||||
The "gamedata" table is read when calling engine.start(). It should contain:
|
||||
{
|
||||
playername = <name>,
|
||||
password = <password>,
|
||||
address = <IP/adress>,
|
||||
port = <port>,
|
||||
selected_world = <index>, -- 0 for client mode
|
||||
singleplayer = <true/false>,
|
||||
}
|
||||
|
||||
Functions
|
||||
---------
|
||||
engine.start()
|
||||
engine.close()
|
||||
|
||||
Filesystem:
|
||||
engine.get_scriptdir()
|
||||
^ returns directory of script
|
||||
engine.get_modpath()
|
||||
^ returns path to global modpath
|
||||
engine.get_modstore_details(modid)
|
||||
^ modid numeric id of mod in modstore
|
||||
^ returns {
|
||||
id = <numeric id of mod in modstore>,
|
||||
title = <human readable title>,
|
||||
basename = <basename for mod>,
|
||||
description = <description of mod>,
|
||||
author = <author of mod>,
|
||||
download_url= <best match download url>,
|
||||
license = <short description of license>,
|
||||
rating = <float value of current rating>
|
||||
}
|
||||
engine.get_modstore_list()
|
||||
^ returns {
|
||||
[1] = {
|
||||
id = <numeric id of mod in modstore>,
|
||||
title = <human readable title>,
|
||||
basename = <basename for mod>
|
||||
}
|
||||
}
|
||||
engine.get_gamepath()
|
||||
^ returns path to global gamepath
|
||||
engine.get_dirlist(path,onlydirs)
|
||||
^ path to get subdirs from
|
||||
^ onlydirs should result contain only dirs?
|
||||
^ returns list of folders within path
|
||||
engine.create_dir(absolute_path)
|
||||
^ absolute_path to directory to create (needs to be absolute)
|
||||
^ returns true/false
|
||||
engine.delete_dir(absolute_path)
|
||||
^ absolute_path to directory to delete (needs to be absolute)
|
||||
^ returns true/false
|
||||
engine.copy_dir(source,destination,keep_soure)
|
||||
^ source folder
|
||||
^ destination folder
|
||||
^ keep_source DEFAULT true --> if set to false source is deleted after copying
|
||||
^ returns true/false
|
||||
engine.extract_zip(zipfile,destination) [unzip within path required]
|
||||
^ zipfile to extract
|
||||
^ destination folder to extract to
|
||||
^ returns true/false
|
||||
engine.download_file(url,target)
|
||||
^ url to download
|
||||
^ target to store to
|
||||
^ returns true/false
|
||||
engine.get_version()
|
||||
^ returns current minetest version
|
||||
|
||||
GUI:
|
||||
engine.update_formspec(formspec)
|
||||
- engine.set_background(type, texturepath)
|
||||
^ type: "background", "overlay", "header" or "footer"
|
||||
engine.set_clouds(<true/false>)
|
||||
engine.set_topleft_text(text)
|
||||
|
||||
Games:
|
||||
engine.get_game(index)
|
||||
^ returns {
|
||||
id = <id>,
|
||||
path = <full path to game>,
|
||||
gamemods_path = <path>,
|
||||
name = <name of game>,
|
||||
menuicon_path = <full path to menuicon>,
|
||||
DEPRECATED:
|
||||
addon_mods_paths = {[1] = <path>,},
|
||||
}
|
||||
engine.get_games() -> table of all games in upper format
|
||||
|
||||
Favorites:
|
||||
engine.get_favorites(location) -> list of favorites
|
||||
^ location: "local" or "online"
|
||||
^ returns {
|
||||
[1] = {
|
||||
clients = <number of clients/nil>,
|
||||
clients_max = <maximum number of clients/nil>,
|
||||
version = <server version/nil>,
|
||||
password = <true/nil>,
|
||||
creative = <true/nil>,
|
||||
damage = <true/nil>,
|
||||
pvp = <true/nil>,
|
||||
description = <server description/nil>,
|
||||
name = <server name/nil>,
|
||||
address = <address of server/nil>,
|
||||
port = <port>
|
||||
},
|
||||
}
|
||||
engine.delete_favorite(id, location) -> success
|
||||
|
||||
Settings:
|
||||
engine.setting_set(name, value)
|
||||
engine.setting_get(name) -> string or nil
|
||||
engine.setting_setbool(name, value)
|
||||
engine.setting_getbool(name) -> bool or nil
|
||||
|
||||
Worlds:
|
||||
engine.get_worlds() -> list of worlds
|
||||
^ returns {
|
||||
[1] = {
|
||||
path = <full path to world>,
|
||||
name = <name of world>,
|
||||
gameid = <gameid of world>,
|
||||
},
|
||||
}
|
||||
engine.create_world(worldname, gameid)
|
||||
engine.delete_world(index)
|
||||
|
||||
|
||||
UI:
|
||||
engine.get_textlist_index(textlistname) -> index
|
||||
engine.show_keys_menu()
|
||||
engine.file_open_dialog(formname,caption)
|
||||
^ shows a file open dialog
|
||||
^ formname is base name of dialog response returned in fields
|
||||
^ -if dialog was accepted "_accepted"
|
||||
^^ will be added to fieldname containing the path
|
||||
^ -if dialog was canceled "_cancelled"
|
||||
^ will be added to fieldname value is set to formname itself
|
||||
^ returns nil or selected file/folder
|
||||
|
||||
Helpers:
|
||||
dump(obj, dumped={})
|
||||
^ Return object serialized as a string
|
||||
string:split(separator)
|
||||
^ eg. string:split("a,b", ",") == {"a","b"}
|
||||
string:trim()
|
||||
^ eg. string.trim("\n \t\tfoo bar\t ") == "foo bar"
|
|
@ -8,7 +8,7 @@
|
|||
# Uncomment settings by removing the preceding #.
|
||||
#
|
||||
# Further documentation:
|
||||
# http://wiki.minetest.net/
|
||||
# http://wiki.minetest.com/
|
||||
#
|
||||
# NOTE: This file might not be up-to-date, refer to the
|
||||
# defaultsettings.cpp file for an up-to-date list:
|
||||
|
@ -112,6 +112,9 @@
|
|||
# Enable smooth lighting with simple ambient occlusion;
|
||||
# disable for speed or for different looks.
|
||||
#smooth_lighting = true
|
||||
# Enable combining mainly used textures to a bigger one for improved speed
|
||||
# disable if it causes graphics glitches.
|
||||
#enable_texture_atlas = false
|
||||
# Path to texture directory. All textures are first searched from here.
|
||||
#texture_path =
|
||||
# Video back-end.
|
||||
|
@ -172,8 +175,6 @@
|
|||
# (1: low level shaders; not implemented)
|
||||
# 2: enable high level shaders
|
||||
#enable_shaders = 2
|
||||
# Set to true to enable textures bumpmapping. Requires shaders enabled.
|
||||
#enable_bumpmapping = false
|
||||
# The time in seconds it takes between repeated
|
||||
# right clicks when holding the right mouse button
|
||||
#repeat_rightclick_time = 0.25
|
||||
|
@ -206,8 +207,6 @@
|
|||
#server_url = http://minetest.net
|
||||
# Automaticaly report to masterserver
|
||||
#server_announce = 0
|
||||
# Announce to this masterserver. if you want to announce your ipv6 address - use serverlist_url = v6.servers.minetest.net
|
||||
#serverlist_url = servers.minetest.net
|
||||
# Default game (default when creating a new world)
|
||||
#default_game = minetest
|
||||
# World directory (everything in the world is stored here)
|
||||
|
@ -377,9 +376,3 @@
|
|||
# Enable/disable running an IPv6 server. An IPv6 server may be restricted
|
||||
# to IPv6 clients, depending on system configuration.
|
||||
#ipv6_server = false
|
||||
|
||||
#main_menu_game_mgr = 0
|
||||
#main_menu_mod_mgr = 0
|
||||
#modstore_download_url = http://forum.minetest.net/media/
|
||||
#modstore_listmods_url = http://forum.minetest.net/mmdb/mods/
|
||||
#modstore_details_url = http://forum.minetest.net/mmdb/mod/*/
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: 0.0.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-06-24 00:07+0000\n"
|
||||
"POT-Creation-Date: 2013-05-13 18:26+0200\n"
|
||||
"PO-Revision-Date: 2013-02-17 00:41+0200\n"
|
||||
"Last-Translator: Rune Biskopstö Christensen <lakersforce@gmail.com>\n"
|
||||
"Language-Team: \n"
|
||||
|
@ -18,47 +18,35 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Weblate 1.4-dev\n"
|
||||
|
||||
#: src/client.cpp:2877
|
||||
#: src/client.cpp:2846
|
||||
msgid "Item textures..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:959
|
||||
#: src/game.cpp:912
|
||||
msgid "Loading..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1019
|
||||
#: src/game.cpp:972
|
||||
msgid "Creating server...."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1035
|
||||
#: src/game.cpp:988
|
||||
msgid "Creating client..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1050
|
||||
#: src/game.cpp:1003
|
||||
msgid "Resolving address..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1126
|
||||
#: src/game.cpp:1079
|
||||
msgid "Connecting to server..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1223
|
||||
msgid "Item definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1230
|
||||
msgid "Node definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1237
|
||||
msgid "Media..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3418
|
||||
#: src/game.cpp:3348
|
||||
msgid "Shutting down stuff..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3448 src/guiConfigureWorld.cpp:397
|
||||
#: src/game.cpp:3378 src/guiConfigureWorld.cpp:426
|
||||
msgid ""
|
||||
"\n"
|
||||
"Check debug.txt for details."
|
||||
|
@ -66,40 +54,56 @@ msgstr ""
|
|||
"\n"
|
||||
"Tjek debug.txt for detaljer."
|
||||
|
||||
#: src/guiConfigureWorld.cpp:184
|
||||
#: src/guiConfigureWorld.cpp:123
|
||||
msgid ""
|
||||
"Warning: Some mods are not configured yet.\n"
|
||||
"They will be enabled by default when you save the configuration. "
|
||||
msgstr ""
|
||||
"Advarsel: nogle modifikationer er endnu ikke konfigureret.\n"
|
||||
"De vil blive aktiveret som standard når du gemmer konfigurationen. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:143
|
||||
msgid ""
|
||||
"Warning: Some configured mods are missing.\n"
|
||||
"Their setting will be removed when you save the configuration. "
|
||||
msgstr ""
|
||||
"Advarsel: nogle konfigurerede modifikationer mangler.\n"
|
||||
"Deres indstillinger vil blive fjernet når du gemmer konfigurationen. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:208
|
||||
msgid "enabled"
|
||||
msgstr "aktiveret"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:194
|
||||
#: src/guiConfigureWorld.cpp:218
|
||||
msgid "Enable All"
|
||||
msgstr "Aktivér alle"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:203
|
||||
#: src/guiConfigureWorld.cpp:227
|
||||
msgid "Disable All"
|
||||
msgstr "Deaktivér alle"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:211
|
||||
#: src/guiConfigureWorld.cpp:235
|
||||
msgid "depends on:"
|
||||
msgstr "afhænger af:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:224
|
||||
#: src/guiConfigureWorld.cpp:248
|
||||
msgid "is required by:"
|
||||
msgstr "er påkrævet af:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:246 src/guiCreateWorld.cpp:178
|
||||
#: src/guiConfigureWorld.cpp:270 src/guiCreateWorld.cpp:177
|
||||
#: src/guiKeyChangeMenu.cpp:195 src/keycode.cpp:223
|
||||
msgid "Cancel"
|
||||
msgstr "Anuller"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:253 src/guiKeyChangeMenu.cpp:187
|
||||
#: src/guiConfigureWorld.cpp:277 src/guiKeyChangeMenu.cpp:187
|
||||
msgid "Save"
|
||||
msgstr "Gem"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:374
|
||||
#: src/guiConfigureWorld.cpp:403
|
||||
msgid "Configuration saved. "
|
||||
msgstr "Konfiguration gemt. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:386
|
||||
#: src/guiConfigureWorld.cpp:415
|
||||
msgid "Warning: Configuration not consistent. "
|
||||
msgstr "Advarsel: konfigurationen er ikke sammenhængende. "
|
||||
|
||||
|
@ -111,15 +115,15 @@ msgstr "Ja"
|
|||
msgid "No"
|
||||
msgstr "Nej"
|
||||
|
||||
#: src/guiCreateWorld.cpp:123
|
||||
#: src/guiCreateWorld.cpp:125
|
||||
msgid "World name"
|
||||
msgstr "Verdens navn"
|
||||
|
||||
#: src/guiCreateWorld.cpp:146
|
||||
#: src/guiCreateWorld.cpp:145
|
||||
msgid "Game"
|
||||
msgstr "Spil"
|
||||
|
||||
#: src/guiCreateWorld.cpp:170
|
||||
#: src/guiCreateWorld.cpp:169
|
||||
msgid "Create"
|
||||
msgstr "Skab"
|
||||
|
||||
|
@ -131,12 +135,12 @@ msgstr "Du døde."
|
|||
msgid "Respawn"
|
||||
msgstr "Genopstå"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:585
|
||||
#: src/guiFormSpecMenu.cpp:582
|
||||
msgid "Left click: Move all items, Right click: Move single item"
|
||||
msgstr "Venstre klik: flyt alle enheder. Højre klik: flyt en enkelt enhed"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:611 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:133
|
||||
#: src/guiFormSpecMenu.cpp:608 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:130
|
||||
msgid "Proceed"
|
||||
msgstr "Fortsæt"
|
||||
|
||||
|
@ -414,23 +418,23 @@ msgstr "Kan ikke konfigurere verden: ingenting valgt"
|
|||
msgid "Failed to delete all world files"
|
||||
msgstr "Mislykkedes i at slette alle verdenens filer"
|
||||
|
||||
#: src/guiPasswordChange.cpp:107
|
||||
#: src/guiPasswordChange.cpp:108
|
||||
msgid "Old Password"
|
||||
msgstr "Gammelt kodeord"
|
||||
|
||||
#: src/guiPasswordChange.cpp:125
|
||||
#: src/guiPasswordChange.cpp:126
|
||||
msgid "New Password"
|
||||
msgstr "Nyt kodeord"
|
||||
|
||||
#: src/guiPasswordChange.cpp:142
|
||||
#: src/guiPasswordChange.cpp:143
|
||||
msgid "Confirm Password"
|
||||
msgstr "Bekræft kodeord"
|
||||
|
||||
#: src/guiPasswordChange.cpp:160
|
||||
#: src/guiPasswordChange.cpp:161
|
||||
msgid "Change"
|
||||
msgstr "Skift"
|
||||
|
||||
#: src/guiPasswordChange.cpp:169
|
||||
#: src/guiPasswordChange.cpp:170
|
||||
msgid "Passwords do not match!"
|
||||
msgstr "Kodeordene er ikke ens!"
|
||||
|
||||
|
@ -469,11 +473,11 @@ msgid ""
|
|||
"- T: chat\n"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiVolumeChange.cpp:107
|
||||
#: src/guiVolumeChange.cpp:108
|
||||
msgid "Sound Volume: "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiVolumeChange.cpp:121
|
||||
#: src/guiVolumeChange.cpp:122
|
||||
msgid "Exit"
|
||||
msgstr ""
|
||||
|
||||
|
@ -776,26 +780,29 @@ msgstr "Zoom"
|
|||
msgid "Main Menu"
|
||||
msgstr "Hovedmenu"
|
||||
|
||||
#: src/main.cpp:2040
|
||||
#: src/main.cpp:2035
|
||||
msgid "Failed to initialize world"
|
||||
msgstr "Mislykkedes i at initialisere verden"
|
||||
|
||||
#: src/main.cpp:2053
|
||||
#: src/main.cpp:2048
|
||||
msgid "No world selected and no address provided. Nothing to do."
|
||||
msgstr "Ingen verden valgt og ingen adresse angivet. Ingen opgave at lave."
|
||||
|
||||
#: src/main.cpp:2061
|
||||
#: src/main.cpp:2056
|
||||
msgid "Could not find or load game \""
|
||||
msgstr "Kunne ikke finde eller indlæse spil \""
|
||||
|
||||
#: src/main.cpp:2075
|
||||
#: src/main.cpp:2070
|
||||
msgid "Invalid gamespec."
|
||||
msgstr "Ugyldig spilspecifikationer."
|
||||
|
||||
#: src/main.cpp:2116
|
||||
#: src/main.cpp:2111
|
||||
msgid "Connection error (timed out?)"
|
||||
msgstr "Forbindelses fejl (udløbelse af tidsfrist?)"
|
||||
|
||||
#~ msgid "Delete map"
|
||||
#~ msgstr "Slet mappen"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Default Controls:\n"
|
||||
#~ "- WASD: Walk\n"
|
||||
|
@ -820,20 +827,3 @@ msgstr "Forbindelses fejl (udløbelse af tidsfrist?)"
|
|||
#~ "- I: beholdning\n"
|
||||
#~ "- ESC: denne menu\n"
|
||||
#~ "- T: snak\n"
|
||||
|
||||
#~ msgid "Delete map"
|
||||
#~ msgstr "Slet mappen"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some configured mods are missing.\n"
|
||||
#~ "Their setting will be removed when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "Advarsel: nogle konfigurerede modifikationer mangler.\n"
|
||||
#~ "Deres indstillinger vil blive fjernet når du gemmer konfigurationen. "
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some mods are not configured yet.\n"
|
||||
#~ "They will be enabled by default when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "Advarsel: nogle modifikationer er endnu ikke konfigureret.\n"
|
||||
#~ "De vil blive aktiveret som standard når du gemmer konfigurationen. "
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: 0.0.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-06-24 00:07+0000\n"
|
||||
"POT-Creation-Date: 2013-05-13 18:26+0200\n"
|
||||
"PO-Revision-Date: 2013-05-14 12:51+0200\n"
|
||||
"Last-Translator: Pilz Adam <PilzAdam@gmx.de>\n"
|
||||
"Language-Team: Deutsch <>\n"
|
||||
|
@ -18,48 +18,35 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Weblate 1.4-dev\n"
|
||||
|
||||
#: src/client.cpp:2877
|
||||
#: src/client.cpp:2846
|
||||
msgid "Item textures..."
|
||||
msgstr "Inventarbilder..."
|
||||
|
||||
#: src/game.cpp:959
|
||||
#: src/game.cpp:912
|
||||
msgid "Loading..."
|
||||
msgstr "Lädt..."
|
||||
|
||||
#: src/game.cpp:1019
|
||||
#: src/game.cpp:972
|
||||
msgid "Creating server...."
|
||||
msgstr "Erstelle Server..."
|
||||
|
||||
#: src/game.cpp:1035
|
||||
#: src/game.cpp:988
|
||||
msgid "Creating client..."
|
||||
msgstr "Erstelle Client..."
|
||||
|
||||
#: src/game.cpp:1050
|
||||
#: src/game.cpp:1003
|
||||
msgid "Resolving address..."
|
||||
msgstr "Löse Adresse auf..."
|
||||
|
||||
#: src/game.cpp:1126
|
||||
#: src/game.cpp:1079
|
||||
msgid "Connecting to server..."
|
||||
msgstr "Verbinde zum Server..."
|
||||
|
||||
#: src/game.cpp:1223
|
||||
#, fuzzy
|
||||
msgid "Item definitions..."
|
||||
msgstr "Inventarbilder..."
|
||||
|
||||
#: src/game.cpp:1230
|
||||
msgid "Node definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1237
|
||||
msgid "Media..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3418
|
||||
#: src/game.cpp:3348
|
||||
msgid "Shutting down stuff..."
|
||||
msgstr "Herunterfahren..."
|
||||
|
||||
#: src/game.cpp:3448 src/guiConfigureWorld.cpp:397
|
||||
#: src/game.cpp:3378 src/guiConfigureWorld.cpp:426
|
||||
msgid ""
|
||||
"\n"
|
||||
"Check debug.txt for details."
|
||||
|
@ -67,40 +54,56 @@ msgstr ""
|
|||
"\n"
|
||||
"Siehe debug.txt für Details."
|
||||
|
||||
#: src/guiConfigureWorld.cpp:184
|
||||
#: src/guiConfigureWorld.cpp:123
|
||||
msgid ""
|
||||
"Warning: Some mods are not configured yet.\n"
|
||||
"They will be enabled by default when you save the configuration. "
|
||||
msgstr ""
|
||||
"Warnung: Einige Mods sind noch nicht konfiguriert.\n"
|
||||
"Sie werden aktiviert wenn die Konfiguration gespeichert wird. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:143
|
||||
msgid ""
|
||||
"Warning: Some configured mods are missing.\n"
|
||||
"Their setting will be removed when you save the configuration. "
|
||||
msgstr ""
|
||||
"Warnung: Einige konfigurierte Mods fehlen.\n"
|
||||
"Mod Einstellungen werden gelöscht wenn die Konfiguration gespeichert wird. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:208
|
||||
msgid "enabled"
|
||||
msgstr "Aktiviert"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:194
|
||||
#: src/guiConfigureWorld.cpp:218
|
||||
msgid "Enable All"
|
||||
msgstr "Alle an"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:203
|
||||
#: src/guiConfigureWorld.cpp:227
|
||||
msgid "Disable All"
|
||||
msgstr "Alle aus"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:211
|
||||
#: src/guiConfigureWorld.cpp:235
|
||||
msgid "depends on:"
|
||||
msgstr "abhängig von:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:224
|
||||
#: src/guiConfigureWorld.cpp:248
|
||||
msgid "is required by:"
|
||||
msgstr "wird benötigt von:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:246 src/guiCreateWorld.cpp:178
|
||||
#: src/guiConfigureWorld.cpp:270 src/guiCreateWorld.cpp:177
|
||||
#: src/guiKeyChangeMenu.cpp:195 src/keycode.cpp:223
|
||||
msgid "Cancel"
|
||||
msgstr "Abbrechen"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:253 src/guiKeyChangeMenu.cpp:187
|
||||
#: src/guiConfigureWorld.cpp:277 src/guiKeyChangeMenu.cpp:187
|
||||
msgid "Save"
|
||||
msgstr "Speichern"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:374
|
||||
#: src/guiConfigureWorld.cpp:403
|
||||
msgid "Configuration saved. "
|
||||
msgstr "Konfiguration gespeichert. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:386
|
||||
#: src/guiConfigureWorld.cpp:415
|
||||
msgid "Warning: Configuration not consistent. "
|
||||
msgstr "Warnung: Konfiguration nicht konsistent. "
|
||||
|
||||
|
@ -112,15 +115,15 @@ msgstr "Ja"
|
|||
msgid "No"
|
||||
msgstr "Nein"
|
||||
|
||||
#: src/guiCreateWorld.cpp:123
|
||||
#: src/guiCreateWorld.cpp:125
|
||||
msgid "World name"
|
||||
msgstr "Weltname"
|
||||
|
||||
#: src/guiCreateWorld.cpp:146
|
||||
#: src/guiCreateWorld.cpp:145
|
||||
msgid "Game"
|
||||
msgstr "Spiel"
|
||||
|
||||
#: src/guiCreateWorld.cpp:170
|
||||
#: src/guiCreateWorld.cpp:169
|
||||
msgid "Create"
|
||||
msgstr "Erstellen"
|
||||
|
||||
|
@ -132,12 +135,12 @@ msgstr "Sie sind gestorben."
|
|||
msgid "Respawn"
|
||||
msgstr "Wiederbeleben"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:585
|
||||
#: src/guiFormSpecMenu.cpp:582
|
||||
msgid "Left click: Move all items, Right click: Move single item"
|
||||
msgstr "Linksklick: Alle Items bewegen, Rechtsklick: Einzelnes Item bewegen"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:611 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:133
|
||||
#: src/guiFormSpecMenu.cpp:608 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:130
|
||||
msgid "Proceed"
|
||||
msgstr "Fortsetzen"
|
||||
|
||||
|
@ -410,23 +413,23 @@ msgstr "Kann Welt nicht konfigurieren: Nichts ausgewählt"
|
|||
msgid "Failed to delete all world files"
|
||||
msgstr "Es konnten nicht alle Welt Dateien gelöscht werden"
|
||||
|
||||
#: src/guiPasswordChange.cpp:107
|
||||
#: src/guiPasswordChange.cpp:108
|
||||
msgid "Old Password"
|
||||
msgstr "Altes Passwort"
|
||||
|
||||
#: src/guiPasswordChange.cpp:125
|
||||
#: src/guiPasswordChange.cpp:126
|
||||
msgid "New Password"
|
||||
msgstr "Neues Passwort"
|
||||
|
||||
#: src/guiPasswordChange.cpp:142
|
||||
#: src/guiPasswordChange.cpp:143
|
||||
msgid "Confirm Password"
|
||||
msgstr "Passwort wiederholen"
|
||||
|
||||
#: src/guiPasswordChange.cpp:160
|
||||
#: src/guiPasswordChange.cpp:161
|
||||
msgid "Change"
|
||||
msgstr "Ändern"
|
||||
|
||||
#: src/guiPasswordChange.cpp:169
|
||||
#: src/guiPasswordChange.cpp:170
|
||||
msgid "Passwords do not match!"
|
||||
msgstr "Passwörter passen nicht zusammen!"
|
||||
|
||||
|
@ -476,11 +479,11 @@ msgstr ""
|
|||
"- Mausrad: Item auswählen\n"
|
||||
"- T: Chat\n"
|
||||
|
||||
#: src/guiVolumeChange.cpp:107
|
||||
#: src/guiVolumeChange.cpp:108
|
||||
msgid "Sound Volume: "
|
||||
msgstr "Sound Lautstärke: "
|
||||
|
||||
#: src/guiVolumeChange.cpp:121
|
||||
#: src/guiVolumeChange.cpp:122
|
||||
msgid "Exit"
|
||||
msgstr "Zurück"
|
||||
|
||||
|
@ -780,26 +783,32 @@ msgstr "Zoom"
|
|||
msgid "Main Menu"
|
||||
msgstr "Hauptmenü"
|
||||
|
||||
#: src/main.cpp:2040
|
||||
#: src/main.cpp:2035
|
||||
msgid "Failed to initialize world"
|
||||
msgstr "Kann Welt nicht initialisieren"
|
||||
|
||||
#: src/main.cpp:2053
|
||||
#: src/main.cpp:2048
|
||||
msgid "No world selected and no address provided. Nothing to do."
|
||||
msgstr "Keine Welt ausgewählt und keine Adresse angegeben. Nichts zu tun."
|
||||
|
||||
#: src/main.cpp:2061
|
||||
#: src/main.cpp:2056
|
||||
msgid "Could not find or load game \""
|
||||
msgstr "Kann Spiel nicht finden/laden \""
|
||||
|
||||
#: src/main.cpp:2075
|
||||
#: src/main.cpp:2070
|
||||
msgid "Invalid gamespec."
|
||||
msgstr "Invalide Spielspezif."
|
||||
|
||||
#: src/main.cpp:2116
|
||||
#: src/main.cpp:2111
|
||||
msgid "Connection error (timed out?)"
|
||||
msgstr "Verbindungsfehler (Zeitüberschreitung?)"
|
||||
|
||||
#~ msgid "KEYBINDINGS"
|
||||
#~ msgstr "TASTEN EINST."
|
||||
|
||||
#~ msgid "Delete map"
|
||||
#~ msgstr "Karte löschen"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Default Controls:\n"
|
||||
#~ "- WASD: Walk\n"
|
||||
|
@ -823,24 +832,3 @@ msgstr "Verbindungsfehler (Zeitüberschreitung?)"
|
|||
#~ "- R: alle geladenen Blöcke anzeigen (wechseln)\n"
|
||||
#~ "- I: Inventar\n"
|
||||
#~ "- T: Chat\n"
|
||||
|
||||
#~ msgid "Delete map"
|
||||
#~ msgstr "Karte löschen"
|
||||
|
||||
#~ msgid "KEYBINDINGS"
|
||||
#~ msgstr "TASTEN EINST."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some configured mods are missing.\n"
|
||||
#~ "Their setting will be removed when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "Warnung: Einige konfigurierte Mods fehlen.\n"
|
||||
#~ "Mod Einstellungen werden gelöscht wenn die Konfiguration gespeichert "
|
||||
#~ "wird. "
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some mods are not configured yet.\n"
|
||||
#~ "They will be enabled by default when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "Warnung: Einige Mods sind noch nicht konfiguriert.\n"
|
||||
#~ "Sie werden aktiviert wenn die Konfiguration gespeichert wird. "
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: minetest\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-06-24 00:07+0000\n"
|
||||
"POT-Creation-Date: 2013-05-13 18:26+0200\n"
|
||||
"PO-Revision-Date: 2013-04-18 15:28+0100\n"
|
||||
"Last-Translator: LS-Steeef \n"
|
||||
"Language-Team: \n"
|
||||
|
@ -17,47 +17,35 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 1.5.5\n"
|
||||
|
||||
#: src/client.cpp:2877
|
||||
#: src/client.cpp:2846
|
||||
msgid "Item textures..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:959
|
||||
#: src/game.cpp:912
|
||||
msgid "Loading..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1019
|
||||
#: src/game.cpp:972
|
||||
msgid "Creating server...."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1035
|
||||
#: src/game.cpp:988
|
||||
msgid "Creating client..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1050
|
||||
#: src/game.cpp:1003
|
||||
msgid "Resolving address..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1126
|
||||
#: src/game.cpp:1079
|
||||
msgid "Connecting to server..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1223
|
||||
msgid "Item definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1230
|
||||
msgid "Node definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1237
|
||||
msgid "Media..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3418
|
||||
#: src/game.cpp:3348
|
||||
msgid "Shutting down stuff..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3448 src/guiConfigureWorld.cpp:397
|
||||
#: src/game.cpp:3378 src/guiConfigureWorld.cpp:426
|
||||
msgid ""
|
||||
"\n"
|
||||
"Check debug.txt for details."
|
||||
|
@ -65,40 +53,57 @@ msgstr ""
|
|||
"\n"
|
||||
"Check debug.txt for details."
|
||||
|
||||
#: src/guiConfigureWorld.cpp:184
|
||||
#: src/guiConfigureWorld.cpp:123
|
||||
msgid ""
|
||||
"Warning: Some mods are not configured yet.\n"
|
||||
"They will be enabled by default when you save the configuration. "
|
||||
msgstr ""
|
||||
"Let op: Nog niet alle mods zijn geconfigueerd. \n"
|
||||
"De mods zullen automatisch worden ingeschakeld als je de configuratie "
|
||||
"bewaard."
|
||||
|
||||
#: src/guiConfigureWorld.cpp:143
|
||||
msgid ""
|
||||
"Warning: Some configured mods are missing.\n"
|
||||
"Their setting will be removed when you save the configuration. "
|
||||
msgstr ""
|
||||
"LEt op: Sommige ingestelde mods zijn vermist.\n"
|
||||
"Hun instellingen worden verwijderd als je de configuratie opslaat."
|
||||
|
||||
#: src/guiConfigureWorld.cpp:208
|
||||
msgid "enabled"
|
||||
msgstr "ingeschakeld"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:194
|
||||
#: src/guiConfigureWorld.cpp:218
|
||||
msgid "Enable All"
|
||||
msgstr "Allen inschakelen"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:203
|
||||
#: src/guiConfigureWorld.cpp:227
|
||||
msgid "Disable All"
|
||||
msgstr "Allen uitschakelen"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:211
|
||||
#: src/guiConfigureWorld.cpp:235
|
||||
msgid "depends on:"
|
||||
msgstr "heeft nodig:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:224
|
||||
#: src/guiConfigureWorld.cpp:248
|
||||
msgid "is required by:"
|
||||
msgstr "is benodigd voor:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:246 src/guiCreateWorld.cpp:178
|
||||
#: src/guiConfigureWorld.cpp:270 src/guiCreateWorld.cpp:177
|
||||
#: src/guiKeyChangeMenu.cpp:195 src/keycode.cpp:223
|
||||
msgid "Cancel"
|
||||
msgstr "Annuleer"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:253 src/guiKeyChangeMenu.cpp:187
|
||||
#: src/guiConfigureWorld.cpp:277 src/guiKeyChangeMenu.cpp:187
|
||||
msgid "Save"
|
||||
msgstr "Bewaar"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:374
|
||||
#: src/guiConfigureWorld.cpp:403
|
||||
msgid "Configuration saved. "
|
||||
msgstr "Instellingen bewaard."
|
||||
|
||||
#: src/guiConfigureWorld.cpp:386
|
||||
#: src/guiConfigureWorld.cpp:415
|
||||
msgid "Warning: Configuration not consistent. "
|
||||
msgstr "Waarschuwing: Instellingen niet consistent."
|
||||
|
||||
|
@ -110,15 +115,15 @@ msgstr "Ja"
|
|||
msgid "No"
|
||||
msgstr "Nee"
|
||||
|
||||
#: src/guiCreateWorld.cpp:123
|
||||
#: src/guiCreateWorld.cpp:125
|
||||
msgid "World name"
|
||||
msgstr "Naam wereld"
|
||||
|
||||
#: src/guiCreateWorld.cpp:146
|
||||
#: src/guiCreateWorld.cpp:145
|
||||
msgid "Game"
|
||||
msgstr "Spel"
|
||||
|
||||
#: src/guiCreateWorld.cpp:170
|
||||
#: src/guiCreateWorld.cpp:169
|
||||
msgid "Create"
|
||||
msgstr "Maak aan"
|
||||
|
||||
|
@ -130,13 +135,13 @@ msgstr "Je bent gestorven."
|
|||
msgid "Respawn"
|
||||
msgstr "Respawn"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:585
|
||||
#: src/guiFormSpecMenu.cpp:582
|
||||
msgid "Left click: Move all items, Right click: Move single item"
|
||||
msgstr ""
|
||||
"Linkermuisknop: Verplaats alle items. Rechtermuisknop: Verplaats één item."
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:611 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:133
|
||||
#: src/guiFormSpecMenu.cpp:608 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:130
|
||||
msgid "Proceed"
|
||||
msgstr "Volgende"
|
||||
|
||||
|
@ -408,23 +413,23 @@ msgstr "Kan instellingen niet aanpassen: Niets geselecteerd"
|
|||
msgid "Failed to delete all world files"
|
||||
msgstr "Niet alle bestanden zijn verwijderd"
|
||||
|
||||
#: src/guiPasswordChange.cpp:107
|
||||
#: src/guiPasswordChange.cpp:108
|
||||
msgid "Old Password"
|
||||
msgstr "Huidig wachtwoord"
|
||||
|
||||
#: src/guiPasswordChange.cpp:125
|
||||
#: src/guiPasswordChange.cpp:126
|
||||
msgid "New Password"
|
||||
msgstr "Nieuw wachtwoord"
|
||||
|
||||
#: src/guiPasswordChange.cpp:142
|
||||
#: src/guiPasswordChange.cpp:143
|
||||
msgid "Confirm Password"
|
||||
msgstr "Herhaal wachtwoord"
|
||||
|
||||
#: src/guiPasswordChange.cpp:160
|
||||
#: src/guiPasswordChange.cpp:161
|
||||
msgid "Change"
|
||||
msgstr "Veranderen"
|
||||
|
||||
#: src/guiPasswordChange.cpp:169
|
||||
#: src/guiPasswordChange.cpp:170
|
||||
msgid "Passwords do not match!"
|
||||
msgstr "Wachtwoorden zijn niet gelijk!"
|
||||
|
||||
|
@ -463,11 +468,11 @@ msgid ""
|
|||
"- T: chat\n"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiVolumeChange.cpp:107
|
||||
#: src/guiVolumeChange.cpp:108
|
||||
msgid "Sound Volume: "
|
||||
msgstr "Volume:"
|
||||
|
||||
#: src/guiVolumeChange.cpp:121
|
||||
#: src/guiVolumeChange.cpp:122
|
||||
msgid "Exit"
|
||||
msgstr "Exit"
|
||||
|
||||
|
@ -767,23 +772,23 @@ msgstr "Zoom"
|
|||
msgid "Main Menu"
|
||||
msgstr "Hoofdmenu"
|
||||
|
||||
#: src/main.cpp:2040
|
||||
#: src/main.cpp:2035
|
||||
msgid "Failed to initialize world"
|
||||
msgstr "Laden van wereld is mislukt"
|
||||
|
||||
#: src/main.cpp:2053
|
||||
#: src/main.cpp:2048
|
||||
msgid "No world selected and no address provided. Nothing to do."
|
||||
msgstr "Geen wereld en adres geselecteerd. Niks te doen."
|
||||
|
||||
#: src/main.cpp:2061
|
||||
#: src/main.cpp:2056
|
||||
msgid "Could not find or load game \""
|
||||
msgstr "Kan niet de game laden of vinden."
|
||||
|
||||
#: src/main.cpp:2075
|
||||
#: src/main.cpp:2070
|
||||
msgid "Invalid gamespec."
|
||||
msgstr "Onjuiste gamespec."
|
||||
|
||||
#: src/main.cpp:2116
|
||||
#: src/main.cpp:2111
|
||||
msgid "Connection error (timed out?)"
|
||||
msgstr "Connection error (timed out?)"
|
||||
|
||||
|
@ -811,18 +816,3 @@ msgstr "Connection error (timed out?)"
|
|||
#~ "- I: Rugzak\n"
|
||||
#~ "- ESC: Menu\n"
|
||||
#~ "- T: Chat\n"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some configured mods are missing.\n"
|
||||
#~ "Their setting will be removed when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "LEt op: Sommige ingestelde mods zijn vermist.\n"
|
||||
#~ "Hun instellingen worden verwijderd als je de configuratie opslaat."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some mods are not configured yet.\n"
|
||||
#~ "They will be enabled by default when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "Let op: Nog niet alle mods zijn geconfigueerd. \n"
|
||||
#~ "De mods zullen automatisch worden ingeschakeld als je de configuratie "
|
||||
#~ "bewaard."
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: minetest\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-06-24 00:07+0000\n"
|
||||
"POT-Creation-Date: 2013-05-13 18:26+0200\n"
|
||||
"PO-Revision-Date: 2013-05-16 14:51+0200\n"
|
||||
"Last-Translator: Diego Martínez <lkaezadl3@gmail.com>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -18,48 +18,35 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Weblate 1.4-dev\n"
|
||||
|
||||
#: src/client.cpp:2877
|
||||
#: src/client.cpp:2846
|
||||
msgid "Item textures..."
|
||||
msgstr "Texturas de objetos..."
|
||||
|
||||
#: src/game.cpp:959
|
||||
#: src/game.cpp:912
|
||||
msgid "Loading..."
|
||||
msgstr "Cargando..."
|
||||
|
||||
#: src/game.cpp:1019
|
||||
#: src/game.cpp:972
|
||||
msgid "Creating server...."
|
||||
msgstr "Creando servidor..."
|
||||
|
||||
#: src/game.cpp:1035
|
||||
#: src/game.cpp:988
|
||||
msgid "Creating client..."
|
||||
msgstr "Creando cliente..."
|
||||
|
||||
#: src/game.cpp:1050
|
||||
#: src/game.cpp:1003
|
||||
msgid "Resolving address..."
|
||||
msgstr "Resolviendo dirección..."
|
||||
|
||||
#: src/game.cpp:1126
|
||||
#: src/game.cpp:1079
|
||||
msgid "Connecting to server..."
|
||||
msgstr "Conectando al servidor..."
|
||||
|
||||
#: src/game.cpp:1223
|
||||
#, fuzzy
|
||||
msgid "Item definitions..."
|
||||
msgstr "Texturas de objetos..."
|
||||
|
||||
#: src/game.cpp:1230
|
||||
msgid "Node definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1237
|
||||
msgid "Media..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3418
|
||||
#: src/game.cpp:3348
|
||||
msgid "Shutting down stuff..."
|
||||
msgstr "Apagando cosas..."
|
||||
|
||||
#: src/game.cpp:3448 src/guiConfigureWorld.cpp:397
|
||||
#: src/game.cpp:3378 src/guiConfigureWorld.cpp:426
|
||||
msgid ""
|
||||
"\n"
|
||||
"Check debug.txt for details."
|
||||
|
@ -67,40 +54,56 @@ msgstr ""
|
|||
"\n"
|
||||
"Consulta debug.txt para obtener más detalles."
|
||||
|
||||
#: src/guiConfigureWorld.cpp:184
|
||||
#: src/guiConfigureWorld.cpp:123
|
||||
msgid ""
|
||||
"Warning: Some mods are not configured yet.\n"
|
||||
"They will be enabled by default when you save the configuration. "
|
||||
msgstr ""
|
||||
"ADVERTENCIA: Algunos mods no están aún configurados.\n"
|
||||
"Se habilitarán de forma predeterminada al guardar la configuración. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:143
|
||||
msgid ""
|
||||
"Warning: Some configured mods are missing.\n"
|
||||
"Their setting will be removed when you save the configuration. "
|
||||
msgstr ""
|
||||
"ADVERTENCIA: Algunos mods configurados faltan.\n"
|
||||
"Su ajuste se quitará al guardar la configuración. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:208
|
||||
msgid "enabled"
|
||||
msgstr "Activado"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:194
|
||||
#: src/guiConfigureWorld.cpp:218
|
||||
msgid "Enable All"
|
||||
msgstr "Activar todos"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:203
|
||||
#: src/guiConfigureWorld.cpp:227
|
||||
msgid "Disable All"
|
||||
msgstr "Desactivar todos"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:211
|
||||
#: src/guiConfigureWorld.cpp:235
|
||||
msgid "depends on:"
|
||||
msgstr "Dependencias:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:224
|
||||
#: src/guiConfigureWorld.cpp:248
|
||||
msgid "is required by:"
|
||||
msgstr "es requerido por:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:246 src/guiCreateWorld.cpp:178
|
||||
#: src/guiConfigureWorld.cpp:270 src/guiCreateWorld.cpp:177
|
||||
#: src/guiKeyChangeMenu.cpp:195 src/keycode.cpp:223
|
||||
msgid "Cancel"
|
||||
msgstr "Cancelar"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:253 src/guiKeyChangeMenu.cpp:187
|
||||
#: src/guiConfigureWorld.cpp:277 src/guiKeyChangeMenu.cpp:187
|
||||
msgid "Save"
|
||||
msgstr "Guardar"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:374
|
||||
#: src/guiConfigureWorld.cpp:403
|
||||
msgid "Configuration saved. "
|
||||
msgstr "Configuración guardada. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:386
|
||||
#: src/guiConfigureWorld.cpp:415
|
||||
msgid "Warning: Configuration not consistent. "
|
||||
msgstr "ADVERTENCIA: La configuración no corresponde. "
|
||||
|
||||
|
@ -112,15 +115,15 @@ msgstr "Sí"
|
|||
msgid "No"
|
||||
msgstr "No"
|
||||
|
||||
#: src/guiCreateWorld.cpp:123
|
||||
#: src/guiCreateWorld.cpp:125
|
||||
msgid "World name"
|
||||
msgstr "Nombre del mundo"
|
||||
|
||||
#: src/guiCreateWorld.cpp:146
|
||||
#: src/guiCreateWorld.cpp:145
|
||||
msgid "Game"
|
||||
msgstr "Juego"
|
||||
|
||||
#: src/guiCreateWorld.cpp:170
|
||||
#: src/guiCreateWorld.cpp:169
|
||||
msgid "Create"
|
||||
msgstr "Crear"
|
||||
|
||||
|
@ -132,13 +135,13 @@ msgstr "Has muerto."
|
|||
msgid "Respawn"
|
||||
msgstr "Revivir"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:585
|
||||
#: src/guiFormSpecMenu.cpp:582
|
||||
msgid "Left click: Move all items, Right click: Move single item"
|
||||
msgstr ""
|
||||
"Click izquierdo: Mover todos los objetos. Click derecho: Mover un objeto."
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:611 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:133
|
||||
#: src/guiFormSpecMenu.cpp:608 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:130
|
||||
msgid "Proceed"
|
||||
msgstr "Continuar"
|
||||
|
||||
|
@ -412,23 +415,23 @@ msgstr "No se puede configurar el mundo: Ninguno seleccionado"
|
|||
msgid "Failed to delete all world files"
|
||||
msgstr "No se pudo eliminar todos los archivos del mundo"
|
||||
|
||||
#: src/guiPasswordChange.cpp:107
|
||||
#: src/guiPasswordChange.cpp:108
|
||||
msgid "Old Password"
|
||||
msgstr "Contraseña anterior"
|
||||
|
||||
#: src/guiPasswordChange.cpp:125
|
||||
#: src/guiPasswordChange.cpp:126
|
||||
msgid "New Password"
|
||||
msgstr "Nueva contraseña"
|
||||
|
||||
#: src/guiPasswordChange.cpp:142
|
||||
#: src/guiPasswordChange.cpp:143
|
||||
msgid "Confirm Password"
|
||||
msgstr "Confirmar contraseña"
|
||||
|
||||
#: src/guiPasswordChange.cpp:160
|
||||
#: src/guiPasswordChange.cpp:161
|
||||
msgid "Change"
|
||||
msgstr "Cambiar"
|
||||
|
||||
#: src/guiPasswordChange.cpp:169
|
||||
#: src/guiPasswordChange.cpp:170
|
||||
msgid "Passwords do not match!"
|
||||
msgstr "¡Las contraseñas no coinciden!"
|
||||
|
||||
|
@ -478,11 +481,11 @@ msgstr ""
|
|||
"- Rueda ratón: elegir objeto\n"
|
||||
"- T: conversar\n"
|
||||
|
||||
#: src/guiVolumeChange.cpp:107
|
||||
#: src/guiVolumeChange.cpp:108
|
||||
msgid "Sound Volume: "
|
||||
msgstr "Volúmen del Sonido: "
|
||||
|
||||
#: src/guiVolumeChange.cpp:121
|
||||
#: src/guiVolumeChange.cpp:122
|
||||
msgid "Exit"
|
||||
msgstr "Salir"
|
||||
|
||||
|
@ -782,24 +785,24 @@ msgstr "Zoom"
|
|||
msgid "Main Menu"
|
||||
msgstr "Menú Principal"
|
||||
|
||||
#: src/main.cpp:2040
|
||||
#: src/main.cpp:2035
|
||||
msgid "Failed to initialize world"
|
||||
msgstr "Fallo al iniciar el mundo"
|
||||
|
||||
#: src/main.cpp:2053
|
||||
#: src/main.cpp:2048
|
||||
msgid "No world selected and no address provided. Nothing to do."
|
||||
msgstr ""
|
||||
"No se seleccionó mundo y no se ha especificado una dirección. Nada que hacer."
|
||||
|
||||
#: src/main.cpp:2061
|
||||
#: src/main.cpp:2056
|
||||
msgid "Could not find or load game \""
|
||||
msgstr "No se puede encontrar o cargar el juego \""
|
||||
|
||||
#: src/main.cpp:2075
|
||||
#: src/main.cpp:2070
|
||||
msgid "Invalid gamespec."
|
||||
msgstr "Juego especificado no válido."
|
||||
|
||||
#: src/main.cpp:2116
|
||||
#: src/main.cpp:2111
|
||||
msgid "Connection error (timed out?)"
|
||||
msgstr "Error de conexión (¿tiempo agotado?)"
|
||||
|
||||
|
@ -827,17 +830,3 @@ msgstr "Error de conexión (¿tiempo agotado?)"
|
|||
#~ "- I: Inventario \n"
|
||||
#~ "- ESC: Este Menu\n"
|
||||
#~ "- T: Conversar\n"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some configured mods are missing.\n"
|
||||
#~ "Their setting will be removed when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "ADVERTENCIA: Algunos mods configurados faltan.\n"
|
||||
#~ "Su ajuste se quitará al guardar la configuración. "
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some mods are not configured yet.\n"
|
||||
#~ "They will be enabled by default when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "ADVERTENCIA: Algunos mods no están aún configurados.\n"
|
||||
#~ "Se habilitarán de forma predeterminada al guardar la configuración. "
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: minetest\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-06-24 00:07+0000\n"
|
||||
"POT-Creation-Date: 2013-05-13 18:26+0200\n"
|
||||
"PO-Revision-Date: 2013-04-03 17:02+0200\n"
|
||||
"Last-Translator: Pilz Adam <PilzAdam@gmx.de>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -18,47 +18,35 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Weblate 1.4-dev\n"
|
||||
|
||||
#: src/client.cpp:2877
|
||||
#: src/client.cpp:2846
|
||||
msgid "Item textures..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:959
|
||||
#: src/game.cpp:912
|
||||
msgid "Loading..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1019
|
||||
#: src/game.cpp:972
|
||||
msgid "Creating server...."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1035
|
||||
#: src/game.cpp:988
|
||||
msgid "Creating client..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1050
|
||||
#: src/game.cpp:1003
|
||||
msgid "Resolving address..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1126
|
||||
#: src/game.cpp:1079
|
||||
msgid "Connecting to server..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1223
|
||||
msgid "Item definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1230
|
||||
msgid "Node definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1237
|
||||
msgid "Media..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3418
|
||||
#: src/game.cpp:3348
|
||||
msgid "Shutting down stuff..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3448 src/guiConfigureWorld.cpp:397
|
||||
#: src/game.cpp:3378 src/guiConfigureWorld.cpp:426
|
||||
msgid ""
|
||||
"\n"
|
||||
"Check debug.txt for details."
|
||||
|
@ -66,40 +54,56 @@ msgstr ""
|
|||
"\n"
|
||||
"Vaata debug.txt info jaoks."
|
||||
|
||||
#: src/guiConfigureWorld.cpp:184
|
||||
#: src/guiConfigureWorld.cpp:123
|
||||
msgid ""
|
||||
"Warning: Some mods are not configured yet.\n"
|
||||
"They will be enabled by default when you save the configuration. "
|
||||
msgstr ""
|
||||
"Hoiatus: Mõned modifikatsioonid pole sätitud veel.\n"
|
||||
"Need lülitatakse sisse kohe pärast sätete salvestamist."
|
||||
|
||||
#: src/guiConfigureWorld.cpp:143
|
||||
msgid ""
|
||||
"Warning: Some configured mods are missing.\n"
|
||||
"Their setting will be removed when you save the configuration. "
|
||||
msgstr ""
|
||||
"Hoiatus: Mõned konfigureeritud modifikatsioonid on kaotsi läinud.\n"
|
||||
"Nende sätted kustutatakse kui salvestada konfiguratsioon."
|
||||
|
||||
#: src/guiConfigureWorld.cpp:208
|
||||
msgid "enabled"
|
||||
msgstr "Sisse lülitatud"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:194
|
||||
#: src/guiConfigureWorld.cpp:218
|
||||
msgid "Enable All"
|
||||
msgstr "Lülita kõik sisse"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:203
|
||||
#: src/guiConfigureWorld.cpp:227
|
||||
msgid "Disable All"
|
||||
msgstr "Lülita kõik välja"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:211
|
||||
#: src/guiConfigureWorld.cpp:235
|
||||
msgid "depends on:"
|
||||
msgstr "Vajab:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:224
|
||||
#: src/guiConfigureWorld.cpp:248
|
||||
msgid "is required by:"
|
||||
msgstr "Seda vajavad:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:246 src/guiCreateWorld.cpp:178
|
||||
#: src/guiConfigureWorld.cpp:270 src/guiCreateWorld.cpp:177
|
||||
#: src/guiKeyChangeMenu.cpp:195 src/keycode.cpp:223
|
||||
msgid "Cancel"
|
||||
msgstr "Tühista"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:253 src/guiKeyChangeMenu.cpp:187
|
||||
#: src/guiConfigureWorld.cpp:277 src/guiKeyChangeMenu.cpp:187
|
||||
msgid "Save"
|
||||
msgstr "Salvesta"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:374
|
||||
#: src/guiConfigureWorld.cpp:403
|
||||
msgid "Configuration saved. "
|
||||
msgstr "Konfiguratsioon salvestatud. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:386
|
||||
#: src/guiConfigureWorld.cpp:415
|
||||
msgid "Warning: Configuration not consistent. "
|
||||
msgstr "Hoiatus: Konfiguratsioon pole kindel."
|
||||
|
||||
|
@ -111,15 +115,15 @@ msgstr "Jah"
|
|||
msgid "No"
|
||||
msgstr "Ei"
|
||||
|
||||
#: src/guiCreateWorld.cpp:123
|
||||
#: src/guiCreateWorld.cpp:125
|
||||
msgid "World name"
|
||||
msgstr "Maailma nimi"
|
||||
|
||||
#: src/guiCreateWorld.cpp:146
|
||||
#: src/guiCreateWorld.cpp:145
|
||||
msgid "Game"
|
||||
msgstr "Mäng"
|
||||
|
||||
#: src/guiCreateWorld.cpp:170
|
||||
#: src/guiCreateWorld.cpp:169
|
||||
msgid "Create"
|
||||
msgstr "Loo"
|
||||
|
||||
|
@ -131,13 +135,13 @@ msgstr "Sa surid."
|
|||
msgid "Respawn"
|
||||
msgstr "Ärka ellu"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:585
|
||||
#: src/guiFormSpecMenu.cpp:582
|
||||
msgid "Left click: Move all items, Right click: Move single item"
|
||||
msgstr ""
|
||||
"Vasak hiireklõps: Liiguta kõiki asju, Parem hiireklõps: Liiguta üksikut asja"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:611 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:133
|
||||
#: src/guiFormSpecMenu.cpp:608 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:130
|
||||
msgid "Proceed"
|
||||
msgstr "Jätka"
|
||||
|
||||
|
@ -411,23 +415,23 @@ msgstr "Maailma konfigureerimine ebaõnnestus: Pole midagi valitud"
|
|||
msgid "Failed to delete all world files"
|
||||
msgstr "Kõigi maailma failide kustutamine ebaõnnestus"
|
||||
|
||||
#: src/guiPasswordChange.cpp:107
|
||||
#: src/guiPasswordChange.cpp:108
|
||||
msgid "Old Password"
|
||||
msgstr "Vana parool"
|
||||
|
||||
#: src/guiPasswordChange.cpp:125
|
||||
#: src/guiPasswordChange.cpp:126
|
||||
msgid "New Password"
|
||||
msgstr "Uus parool"
|
||||
|
||||
#: src/guiPasswordChange.cpp:142
|
||||
#: src/guiPasswordChange.cpp:143
|
||||
msgid "Confirm Password"
|
||||
msgstr "Kinnita parooli"
|
||||
|
||||
#: src/guiPasswordChange.cpp:160
|
||||
#: src/guiPasswordChange.cpp:161
|
||||
msgid "Change"
|
||||
msgstr "Muuda"
|
||||
|
||||
#: src/guiPasswordChange.cpp:169
|
||||
#: src/guiPasswordChange.cpp:170
|
||||
msgid "Passwords do not match!"
|
||||
msgstr "Paroolid ei ole samad!"
|
||||
|
||||
|
@ -466,11 +470,11 @@ msgid ""
|
|||
"- T: chat\n"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiVolumeChange.cpp:107
|
||||
#: src/guiVolumeChange.cpp:108
|
||||
msgid "Sound Volume: "
|
||||
msgstr "Hääle Volüüm: "
|
||||
|
||||
#: src/guiVolumeChange.cpp:121
|
||||
#: src/guiVolumeChange.cpp:122
|
||||
msgid "Exit"
|
||||
msgstr "Välju"
|
||||
|
||||
|
@ -770,23 +774,23 @@ msgstr "Suumi"
|
|||
msgid "Main Menu"
|
||||
msgstr "Menüü"
|
||||
|
||||
#: src/main.cpp:2040
|
||||
#: src/main.cpp:2035
|
||||
msgid "Failed to initialize world"
|
||||
msgstr "Maailma initsialiseerimine ebaõnnestus"
|
||||
|
||||
#: src/main.cpp:2053
|
||||
#: src/main.cpp:2048
|
||||
msgid "No world selected and no address provided. Nothing to do."
|
||||
msgstr "Pole valitud ei maailma ega IP aadressi. Pole midagi teha."
|
||||
|
||||
#: src/main.cpp:2061
|
||||
#: src/main.cpp:2056
|
||||
msgid "Could not find or load game \""
|
||||
msgstr "Ei leia ega suuda jätkata mängu."
|
||||
|
||||
#: src/main.cpp:2075
|
||||
#: src/main.cpp:2070
|
||||
msgid "Invalid gamespec."
|
||||
msgstr "Vale mängu ID."
|
||||
|
||||
#: src/main.cpp:2116
|
||||
#: src/main.cpp:2111
|
||||
msgid "Connection error (timed out?)"
|
||||
msgstr "Ühenduse viga (Aeg otsas?)"
|
||||
|
||||
|
@ -814,17 +818,3 @@ msgstr "Ühenduse viga (Aeg otsas?)"
|
|||
#~ "- I: Seljakott\n"
|
||||
#~ "- ESC: Menüü\n"
|
||||
#~ "- T: Jututupa\n"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some configured mods are missing.\n"
|
||||
#~ "Their setting will be removed when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "Hoiatus: Mõned konfigureeritud modifikatsioonid on kaotsi läinud.\n"
|
||||
#~ "Nende sätted kustutatakse kui salvestada konfiguratsioon."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some mods are not configured yet.\n"
|
||||
#~ "They will be enabled by default when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "Hoiatus: Mõned modifikatsioonid pole sätitud veel.\n"
|
||||
#~ "Need lülitatakse sisse kohe pärast sätete salvestamist."
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: 0.0.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-06-24 00:07+0000\n"
|
||||
"POT-Creation-Date: 2013-05-13 18:26+0200\n"
|
||||
"PO-Revision-Date: 2013-06-01 13:22+0200\n"
|
||||
"Last-Translator: Ilya Zhuravlev <zhuravlevilya@ya.ru>\n"
|
||||
"Language-Team: Français <>\n"
|
||||
|
@ -18,48 +18,35 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"X-Generator: Weblate 1.4-dev\n"
|
||||
|
||||
#: src/client.cpp:2877
|
||||
#: src/client.cpp:2846
|
||||
msgid "Item textures..."
|
||||
msgstr "Textures d'objets..."
|
||||
|
||||
#: src/game.cpp:959
|
||||
#: src/game.cpp:912
|
||||
msgid "Loading..."
|
||||
msgstr "Chargement..."
|
||||
|
||||
#: src/game.cpp:1019
|
||||
#: src/game.cpp:972
|
||||
msgid "Creating server...."
|
||||
msgstr "Création du serveur..."
|
||||
|
||||
#: src/game.cpp:1035
|
||||
#: src/game.cpp:988
|
||||
msgid "Creating client..."
|
||||
msgstr "Création du client..."
|
||||
|
||||
#: src/game.cpp:1050
|
||||
#: src/game.cpp:1003
|
||||
msgid "Resolving address..."
|
||||
msgstr "Résolution de l'adresse..."
|
||||
|
||||
#: src/game.cpp:1126
|
||||
#: src/game.cpp:1079
|
||||
msgid "Connecting to server..."
|
||||
msgstr "Connexion au serveur..."
|
||||
|
||||
#: src/game.cpp:1223
|
||||
#, fuzzy
|
||||
msgid "Item definitions..."
|
||||
msgstr "Textures d'objets..."
|
||||
|
||||
#: src/game.cpp:1230
|
||||
msgid "Node definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1237
|
||||
msgid "Media..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3418
|
||||
#: src/game.cpp:3348
|
||||
msgid "Shutting down stuff..."
|
||||
msgstr "Quitter le jeu..."
|
||||
|
||||
#: src/game.cpp:3448 src/guiConfigureWorld.cpp:397
|
||||
#: src/game.cpp:3378 src/guiConfigureWorld.cpp:426
|
||||
msgid ""
|
||||
"\n"
|
||||
"Check debug.txt for details."
|
||||
|
@ -67,40 +54,56 @@ msgstr ""
|
|||
"\n"
|
||||
"Voir debug.txt pour plus d'information."
|
||||
|
||||
#: src/guiConfigureWorld.cpp:184
|
||||
#: src/guiConfigureWorld.cpp:123
|
||||
msgid ""
|
||||
"Warning: Some mods are not configured yet.\n"
|
||||
"They will be enabled by default when you save the configuration. "
|
||||
msgstr ""
|
||||
"Attention : certains mods ne sont pas encore configurés.\n"
|
||||
"Ils seront activés par défaut quand vous enregistrerez la configuration. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:143
|
||||
msgid ""
|
||||
"Warning: Some configured mods are missing.\n"
|
||||
"Their setting will be removed when you save the configuration. "
|
||||
msgstr ""
|
||||
"Attention : certains mods configurés sont introuvables.\n"
|
||||
"Leurs réglages seront effacés quand vous enregistrerez la configuration. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:208
|
||||
msgid "enabled"
|
||||
msgstr "activé"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:194
|
||||
#: src/guiConfigureWorld.cpp:218
|
||||
msgid "Enable All"
|
||||
msgstr "Tout activer"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:203
|
||||
#: src/guiConfigureWorld.cpp:227
|
||||
msgid "Disable All"
|
||||
msgstr "Tout désactiver"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:211
|
||||
#: src/guiConfigureWorld.cpp:235
|
||||
msgid "depends on:"
|
||||
msgstr "dépend de :"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:224
|
||||
#: src/guiConfigureWorld.cpp:248
|
||||
msgid "is required by:"
|
||||
msgstr "est requis par :"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:246 src/guiCreateWorld.cpp:178
|
||||
#: src/guiConfigureWorld.cpp:270 src/guiCreateWorld.cpp:177
|
||||
#: src/guiKeyChangeMenu.cpp:195 src/keycode.cpp:223
|
||||
msgid "Cancel"
|
||||
msgstr "Annuler"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:253 src/guiKeyChangeMenu.cpp:187
|
||||
#: src/guiConfigureWorld.cpp:277 src/guiKeyChangeMenu.cpp:187
|
||||
msgid "Save"
|
||||
msgstr "Enregistrer"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:374
|
||||
#: src/guiConfigureWorld.cpp:403
|
||||
msgid "Configuration saved. "
|
||||
msgstr "Configuration enregistrée. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:386
|
||||
#: src/guiConfigureWorld.cpp:415
|
||||
msgid "Warning: Configuration not consistent. "
|
||||
msgstr "Attention : configuration incorrecte. "
|
||||
|
||||
|
@ -112,15 +115,15 @@ msgstr "Oui"
|
|||
msgid "No"
|
||||
msgstr "Non"
|
||||
|
||||
#: src/guiCreateWorld.cpp:123
|
||||
#: src/guiCreateWorld.cpp:125
|
||||
msgid "World name"
|
||||
msgstr "Nom du monde"
|
||||
|
||||
#: src/guiCreateWorld.cpp:146
|
||||
#: src/guiCreateWorld.cpp:145
|
||||
msgid "Game"
|
||||
msgstr "Jeu"
|
||||
|
||||
#: src/guiCreateWorld.cpp:170
|
||||
#: src/guiCreateWorld.cpp:169
|
||||
msgid "Create"
|
||||
msgstr "Créer"
|
||||
|
||||
|
@ -132,13 +135,13 @@ msgstr "Vous êtes mort."
|
|||
msgid "Respawn"
|
||||
msgstr "Réapparaître"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:585
|
||||
#: src/guiFormSpecMenu.cpp:582
|
||||
msgid "Left click: Move all items, Right click: Move single item"
|
||||
msgstr ""
|
||||
"Clic gauche : déplacer tous les objets -- Clic droit : déplacer un objet"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:611 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:133
|
||||
#: src/guiFormSpecMenu.cpp:608 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:130
|
||||
msgid "Proceed"
|
||||
msgstr "OK"
|
||||
|
||||
|
@ -232,8 +235,7 @@ msgstr "Imprimer stacks"
|
|||
|
||||
#: src/guiMainMenu.cpp:92
|
||||
msgid "Cannot create world: Name contains invalid characters"
|
||||
msgstr ""
|
||||
"Impossible de créer le monde : le nom contient des caractères invalides"
|
||||
msgstr "Impossible de créer le monde : le nom contient des caractères invalides"
|
||||
|
||||
#: src/guiMainMenu.cpp:103
|
||||
msgid "Cannot create world: A world by this name already exists"
|
||||
|
@ -411,23 +413,23 @@ msgstr "Impossible de configurer ce monde : aucune sélection active"
|
|||
msgid "Failed to delete all world files"
|
||||
msgstr "Tous les fichiers du monde n'ont pu être effacés"
|
||||
|
||||
#: src/guiPasswordChange.cpp:107
|
||||
#: src/guiPasswordChange.cpp:108
|
||||
msgid "Old Password"
|
||||
msgstr "Ancien mot de passe"
|
||||
|
||||
#: src/guiPasswordChange.cpp:125
|
||||
#: src/guiPasswordChange.cpp:126
|
||||
msgid "New Password"
|
||||
msgstr "Nouveau mot de passe"
|
||||
|
||||
#: src/guiPasswordChange.cpp:142
|
||||
#: src/guiPasswordChange.cpp:143
|
||||
msgid "Confirm Password"
|
||||
msgstr "Confirmer mot de passe"
|
||||
|
||||
#: src/guiPasswordChange.cpp:160
|
||||
#: src/guiPasswordChange.cpp:161
|
||||
msgid "Change"
|
||||
msgstr "Changer"
|
||||
|
||||
#: src/guiPasswordChange.cpp:169
|
||||
#: src/guiPasswordChange.cpp:170
|
||||
msgid "Passwords do not match!"
|
||||
msgstr "Les mots de passe ne correspondent pas !"
|
||||
|
||||
|
@ -477,11 +479,11 @@ msgstr ""
|
|||
"- Molette souris : sélectionner objet\n"
|
||||
"- T : discuter\n"
|
||||
|
||||
#: src/guiVolumeChange.cpp:107
|
||||
#: src/guiVolumeChange.cpp:108
|
||||
msgid "Sound Volume: "
|
||||
msgstr "Volume sonore :"
|
||||
|
||||
#: src/guiVolumeChange.cpp:121
|
||||
#: src/guiVolumeChange.cpp:122
|
||||
msgid "Exit"
|
||||
msgstr "OK"
|
||||
|
||||
|
@ -781,26 +783,29 @@ msgstr "Zoomer"
|
|||
msgid "Main Menu"
|
||||
msgstr "Menu principal"
|
||||
|
||||
#: src/main.cpp:2040
|
||||
#: src/main.cpp:2035
|
||||
msgid "Failed to initialize world"
|
||||
msgstr "Le monde n'a pas pu être initialisé"
|
||||
|
||||
#: src/main.cpp:2053
|
||||
#: src/main.cpp:2048
|
||||
msgid "No world selected and no address provided. Nothing to do."
|
||||
msgstr "Pas de monde sélectionné et pas d'adresse fournie. Rien à faire."
|
||||
|
||||
#: src/main.cpp:2061
|
||||
#: src/main.cpp:2056
|
||||
msgid "Could not find or load game \""
|
||||
msgstr "N'a pas pu trouver ou charger le jeu \""
|
||||
|
||||
#: src/main.cpp:2075
|
||||
#: src/main.cpp:2070
|
||||
msgid "Invalid gamespec."
|
||||
msgstr "gamespec invalide."
|
||||
|
||||
#: src/main.cpp:2116
|
||||
#: src/main.cpp:2111
|
||||
msgid "Connection error (timed out?)"
|
||||
msgstr "Erreur de connexion (perte de connexion ?)"
|
||||
|
||||
#~ msgid "Delete map"
|
||||
#~ msgstr "Supprimer carte"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Default Controls:\n"
|
||||
#~ "- WASD: Walk\n"
|
||||
|
@ -825,20 +830,3 @@ msgstr "Erreur de connexion (perte de connexion ?)"
|
|||
#~ "- I : inventaire\n"
|
||||
#~ "- Échap : ce menu\n"
|
||||
#~ "- T : discuter\n"
|
||||
|
||||
#~ msgid "Delete map"
|
||||
#~ msgstr "Supprimer carte"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some configured mods are missing.\n"
|
||||
#~ "Their setting will be removed when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "Attention : certains mods configurés sont introuvables.\n"
|
||||
#~ "Leurs réglages seront effacés quand vous enregistrerez la configuration. "
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some mods are not configured yet.\n"
|
||||
#~ "They will be enabled by default when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "Attention : certains mods ne sont pas encore configurés.\n"
|
||||
#~ "Ils seront activés par défaut quand vous enregistrerez la configuration. "
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: minetest\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-06-24 00:07+0000\n"
|
||||
"POT-Creation-Date: 2013-05-13 18:26+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -17,86 +17,86 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=CHARSET\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: src/client.cpp:2877
|
||||
#: src/client.cpp:2846
|
||||
msgid "Item textures..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:959
|
||||
#: src/game.cpp:912
|
||||
msgid "Loading..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1019
|
||||
#: src/game.cpp:972
|
||||
msgid "Creating server...."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1035
|
||||
#: src/game.cpp:988
|
||||
msgid "Creating client..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1050
|
||||
#: src/game.cpp:1003
|
||||
msgid "Resolving address..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1126
|
||||
#: src/game.cpp:1079
|
||||
msgid "Connecting to server..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1223
|
||||
msgid "Item definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1230
|
||||
msgid "Node definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1237
|
||||
msgid "Media..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3418
|
||||
#: src/game.cpp:3348
|
||||
msgid "Shutting down stuff..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3448 src/guiConfigureWorld.cpp:397
|
||||
#: src/game.cpp:3378 src/guiConfigureWorld.cpp:426
|
||||
msgid ""
|
||||
"\n"
|
||||
"Check debug.txt for details."
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:184
|
||||
#: src/guiConfigureWorld.cpp:123
|
||||
msgid ""
|
||||
"Warning: Some mods are not configured yet.\n"
|
||||
"They will be enabled by default when you save the configuration. "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:143
|
||||
msgid ""
|
||||
"Warning: Some configured mods are missing.\n"
|
||||
"Their setting will be removed when you save the configuration. "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:208
|
||||
msgid "enabled"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:194
|
||||
#: src/guiConfigureWorld.cpp:218
|
||||
msgid "Enable All"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:203
|
||||
#: src/guiConfigureWorld.cpp:227
|
||||
msgid "Disable All"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:211
|
||||
#: src/guiConfigureWorld.cpp:235
|
||||
msgid "depends on:"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:224
|
||||
#: src/guiConfigureWorld.cpp:248
|
||||
msgid "is required by:"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:246 src/guiCreateWorld.cpp:178
|
||||
#: src/guiConfigureWorld.cpp:270 src/guiCreateWorld.cpp:177
|
||||
#: src/guiKeyChangeMenu.cpp:195 src/keycode.cpp:223
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:253 src/guiKeyChangeMenu.cpp:187
|
||||
#: src/guiConfigureWorld.cpp:277 src/guiKeyChangeMenu.cpp:187
|
||||
msgid "Save"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:374
|
||||
#: src/guiConfigureWorld.cpp:403
|
||||
msgid "Configuration saved. "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:386
|
||||
#: src/guiConfigureWorld.cpp:415
|
||||
msgid "Warning: Configuration not consistent. "
|
||||
msgstr ""
|
||||
|
||||
|
@ -108,15 +108,15 @@ msgstr ""
|
|||
msgid "No"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiCreateWorld.cpp:123
|
||||
#: src/guiCreateWorld.cpp:125
|
||||
msgid "World name"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiCreateWorld.cpp:146
|
||||
#: src/guiCreateWorld.cpp:145
|
||||
msgid "Game"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiCreateWorld.cpp:170
|
||||
#: src/guiCreateWorld.cpp:169
|
||||
msgid "Create"
|
||||
msgstr ""
|
||||
|
||||
|
@ -128,12 +128,12 @@ msgstr ""
|
|||
msgid "Respawn"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:585
|
||||
#: src/guiFormSpecMenu.cpp:582
|
||||
msgid "Left click: Move all items, Right click: Move single item"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:611 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:133
|
||||
#: src/guiFormSpecMenu.cpp:608 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:130
|
||||
msgid "Proceed"
|
||||
msgstr ""
|
||||
|
||||
|
@ -405,23 +405,23 @@ msgstr ""
|
|||
msgid "Failed to delete all world files"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:107
|
||||
#: src/guiPasswordChange.cpp:108
|
||||
msgid "Old Password"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:125
|
||||
#: src/guiPasswordChange.cpp:126
|
||||
msgid "New Password"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:142
|
||||
#: src/guiPasswordChange.cpp:143
|
||||
msgid "Confirm Password"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:160
|
||||
#: src/guiPasswordChange.cpp:161
|
||||
msgid "Change"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:169
|
||||
#: src/guiPasswordChange.cpp:170
|
||||
msgid "Passwords do not match!"
|
||||
msgstr ""
|
||||
|
||||
|
@ -460,11 +460,11 @@ msgid ""
|
|||
"- T: chat\n"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiVolumeChange.cpp:107
|
||||
#: src/guiVolumeChange.cpp:108
|
||||
msgid "Sound Volume: "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiVolumeChange.cpp:121
|
||||
#: src/guiVolumeChange.cpp:122
|
||||
msgid "Exit"
|
||||
msgstr ""
|
||||
|
||||
|
@ -764,22 +764,22 @@ msgstr ""
|
|||
msgid "Main Menu"
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2040
|
||||
#: src/main.cpp:2035
|
||||
msgid "Failed to initialize world"
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2053
|
||||
#: src/main.cpp:2048
|
||||
msgid "No world selected and no address provided. Nothing to do."
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2061
|
||||
#: src/main.cpp:2056
|
||||
msgid "Could not find or load game \""
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2075
|
||||
#: src/main.cpp:2070
|
||||
msgid "Invalid gamespec."
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2116
|
||||
#: src/main.cpp:2111
|
||||
msgid "Connection error (timed out?)"
|
||||
msgstr ""
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: minetest\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-06-24 00:07+0000\n"
|
||||
"POT-Creation-Date: 2013-05-13 18:26+0200\n"
|
||||
"PO-Revision-Date: 2013-03-30 20:50+0200\n"
|
||||
"Last-Translator: Fabio Luongo <e249260@rmqkr.net>\n"
|
||||
"Language-Team: Italian\n"
|
||||
|
@ -18,47 +18,35 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Weblate 1.4-dev\n"
|
||||
|
||||
#: src/client.cpp:2877
|
||||
#: src/client.cpp:2846
|
||||
msgid "Item textures..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:959
|
||||
#: src/game.cpp:912
|
||||
msgid "Loading..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1019
|
||||
#: src/game.cpp:972
|
||||
msgid "Creating server...."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1035
|
||||
#: src/game.cpp:988
|
||||
msgid "Creating client..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1050
|
||||
#: src/game.cpp:1003
|
||||
msgid "Resolving address..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1126
|
||||
#: src/game.cpp:1079
|
||||
msgid "Connecting to server..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1223
|
||||
msgid "Item definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1230
|
||||
msgid "Node definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1237
|
||||
msgid "Media..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3418
|
||||
#: src/game.cpp:3348
|
||||
msgid "Shutting down stuff..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3448 src/guiConfigureWorld.cpp:397
|
||||
#: src/game.cpp:3378 src/guiConfigureWorld.cpp:426
|
||||
msgid ""
|
||||
"\n"
|
||||
"Check debug.txt for details."
|
||||
|
@ -66,40 +54,56 @@ msgstr ""
|
|||
"\n"
|
||||
"Controlla debug.txt per i dettagli."
|
||||
|
||||
#: src/guiConfigureWorld.cpp:184
|
||||
#: src/guiConfigureWorld.cpp:123
|
||||
msgid ""
|
||||
"Warning: Some mods are not configured yet.\n"
|
||||
"They will be enabled by default when you save the configuration. "
|
||||
msgstr ""
|
||||
"Attenzione: alcune mod non sono ancora configurate.\n"
|
||||
"Saranno abilitate di default quando salverai la configurazione. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:143
|
||||
msgid ""
|
||||
"Warning: Some configured mods are missing.\n"
|
||||
"Their setting will be removed when you save the configuration. "
|
||||
msgstr ""
|
||||
"Attenzione: mancano alcune mod configurate.\n"
|
||||
"Le loro impostazioni saranno rimosse al salvataggio della configurazione. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:208
|
||||
msgid "enabled"
|
||||
msgstr "attivato"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:194
|
||||
#: src/guiConfigureWorld.cpp:218
|
||||
msgid "Enable All"
|
||||
msgstr "Attiva tutto"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:203
|
||||
#: src/guiConfigureWorld.cpp:227
|
||||
msgid "Disable All"
|
||||
msgstr "Disabilita tutto"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:211
|
||||
#: src/guiConfigureWorld.cpp:235
|
||||
msgid "depends on:"
|
||||
msgstr "dipende da:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:224
|
||||
#: src/guiConfigureWorld.cpp:248
|
||||
msgid "is required by:"
|
||||
msgstr "è richiesto da:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:246 src/guiCreateWorld.cpp:178
|
||||
#: src/guiConfigureWorld.cpp:270 src/guiCreateWorld.cpp:177
|
||||
#: src/guiKeyChangeMenu.cpp:195 src/keycode.cpp:223
|
||||
msgid "Cancel"
|
||||
msgstr "Annulla"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:253 src/guiKeyChangeMenu.cpp:187
|
||||
#: src/guiConfigureWorld.cpp:277 src/guiKeyChangeMenu.cpp:187
|
||||
msgid "Save"
|
||||
msgstr "Salva"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:374
|
||||
#: src/guiConfigureWorld.cpp:403
|
||||
msgid "Configuration saved. "
|
||||
msgstr "Configurazione salvata. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:386
|
||||
#: src/guiConfigureWorld.cpp:415
|
||||
msgid "Warning: Configuration not consistent. "
|
||||
msgstr "Attenzione: configurazione non corretta. "
|
||||
|
||||
|
@ -111,15 +115,15 @@ msgstr "Sì"
|
|||
msgid "No"
|
||||
msgstr "No"
|
||||
|
||||
#: src/guiCreateWorld.cpp:123
|
||||
#: src/guiCreateWorld.cpp:125
|
||||
msgid "World name"
|
||||
msgstr "Nome mondo"
|
||||
|
||||
#: src/guiCreateWorld.cpp:146
|
||||
#: src/guiCreateWorld.cpp:145
|
||||
msgid "Game"
|
||||
msgstr "Gioco"
|
||||
|
||||
#: src/guiCreateWorld.cpp:170
|
||||
#: src/guiCreateWorld.cpp:169
|
||||
msgid "Create"
|
||||
msgstr "Crea"
|
||||
|
||||
|
@ -131,13 +135,13 @@ msgstr "Sei morto."
|
|||
msgid "Respawn"
|
||||
msgstr "Ricomincia"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:585
|
||||
#: src/guiFormSpecMenu.cpp:582
|
||||
msgid "Left click: Move all items, Right click: Move single item"
|
||||
msgstr ""
|
||||
"Click sinistro: muovi tutti gli oggetti; click destro: muovi un solo oggetto"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:611 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:133
|
||||
#: src/guiFormSpecMenu.cpp:608 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:130
|
||||
msgid "Proceed"
|
||||
msgstr "Procedi"
|
||||
|
||||
|
@ -413,23 +417,23 @@ msgstr "Impossibile configurare il mondo: nessun mondo selezionato"
|
|||
msgid "Failed to delete all world files"
|
||||
msgstr "Eliminazione di tutti i file del mondo fallita"
|
||||
|
||||
#: src/guiPasswordChange.cpp:107
|
||||
#: src/guiPasswordChange.cpp:108
|
||||
msgid "Old Password"
|
||||
msgstr "Vecchia password"
|
||||
|
||||
#: src/guiPasswordChange.cpp:125
|
||||
#: src/guiPasswordChange.cpp:126
|
||||
msgid "New Password"
|
||||
msgstr "Nuova password"
|
||||
|
||||
#: src/guiPasswordChange.cpp:142
|
||||
#: src/guiPasswordChange.cpp:143
|
||||
msgid "Confirm Password"
|
||||
msgstr "Conferma password"
|
||||
|
||||
#: src/guiPasswordChange.cpp:160
|
||||
#: src/guiPasswordChange.cpp:161
|
||||
msgid "Change"
|
||||
msgstr "Modifica"
|
||||
|
||||
#: src/guiPasswordChange.cpp:169
|
||||
#: src/guiPasswordChange.cpp:170
|
||||
msgid "Passwords do not match!"
|
||||
msgstr "Le password non corrispondono!"
|
||||
|
||||
|
@ -468,11 +472,11 @@ msgid ""
|
|||
"- T: chat\n"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiVolumeChange.cpp:107
|
||||
#: src/guiVolumeChange.cpp:108
|
||||
msgid "Sound Volume: "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiVolumeChange.cpp:121
|
||||
#: src/guiVolumeChange.cpp:122
|
||||
msgid "Exit"
|
||||
msgstr ""
|
||||
|
||||
|
@ -772,26 +776,29 @@ msgstr ""
|
|||
msgid "Main Menu"
|
||||
msgstr "Menu principale"
|
||||
|
||||
#: src/main.cpp:2040
|
||||
#: src/main.cpp:2035
|
||||
msgid "Failed to initialize world"
|
||||
msgstr "Fallimento nell'inizializzare il mondo"
|
||||
|
||||
#: src/main.cpp:2053
|
||||
#: src/main.cpp:2048
|
||||
msgid "No world selected and no address provided. Nothing to do."
|
||||
msgstr "Nessun mondo selezionato e nessun indirizzo fornito. Niente da fare."
|
||||
|
||||
#: src/main.cpp:2061
|
||||
#: src/main.cpp:2056
|
||||
msgid "Could not find or load game \""
|
||||
msgstr "Impossibile trovare o caricare il gioco \""
|
||||
|
||||
#: src/main.cpp:2075
|
||||
#: src/main.cpp:2070
|
||||
msgid "Invalid gamespec."
|
||||
msgstr "Specifiche di gioco non valide."
|
||||
|
||||
#: src/main.cpp:2116
|
||||
#: src/main.cpp:2111
|
||||
msgid "Connection error (timed out?)"
|
||||
msgstr "Errore connessione (tempo scaduto?)"
|
||||
|
||||
#~ msgid "Delete map"
|
||||
#~ msgstr "Cancella mappa"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Default Controls:\n"
|
||||
#~ "- WASD: Walk\n"
|
||||
|
@ -816,21 +823,3 @@ msgstr "Errore connessione (tempo scaduto?)"
|
|||
#~ "- I: inventario\n"
|
||||
#~ "- ESC: questo menu\n"
|
||||
#~ "- T: chat\n"
|
||||
|
||||
#~ msgid "Delete map"
|
||||
#~ msgstr "Cancella mappa"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some configured mods are missing.\n"
|
||||
#~ "Their setting will be removed when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "Attenzione: mancano alcune mod configurate.\n"
|
||||
#~ "Le loro impostazioni saranno rimosse al salvataggio della "
|
||||
#~ "configurazione. "
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some mods are not configured yet.\n"
|
||||
#~ "They will be enabled by default when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "Attenzione: alcune mod non sono ancora configurate.\n"
|
||||
#~ "Saranno abilitate di default quando salverai la configurazione. "
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: minetest\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-06-24 00:07+0000\n"
|
||||
"POT-Creation-Date: 2013-05-13 18:26+0200\n"
|
||||
"PO-Revision-Date: 2013-03-07 23:06+0200\n"
|
||||
"Last-Translator: Mitori Itoshiki <mito551@gmail.com>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -18,86 +18,90 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 1.4-dev\n"
|
||||
|
||||
#: src/client.cpp:2877
|
||||
#: src/client.cpp:2846
|
||||
msgid "Item textures..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:959
|
||||
#: src/game.cpp:912
|
||||
msgid "Loading..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1019
|
||||
#: src/game.cpp:972
|
||||
msgid "Creating server...."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1035
|
||||
#: src/game.cpp:988
|
||||
msgid "Creating client..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1050
|
||||
#: src/game.cpp:1003
|
||||
msgid "Resolving address..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1126
|
||||
#: src/game.cpp:1079
|
||||
msgid "Connecting to server..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1223
|
||||
msgid "Item definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1230
|
||||
msgid "Node definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1237
|
||||
msgid "Media..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3418
|
||||
#: src/game.cpp:3348
|
||||
msgid "Shutting down stuff..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3448 src/guiConfigureWorld.cpp:397
|
||||
#: src/game.cpp:3378 src/guiConfigureWorld.cpp:426
|
||||
msgid ""
|
||||
"\n"
|
||||
"Check debug.txt for details."
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:184
|
||||
#: src/guiConfigureWorld.cpp:123
|
||||
msgid ""
|
||||
"Warning: Some mods are not configured yet.\n"
|
||||
"They will be enabled by default when you save the configuration. "
|
||||
msgstr ""
|
||||
"警告: マインテストの改造がいくつか設定されていません。\n"
|
||||
"これらを設定を保存すると自動で有効化されます。 "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:143
|
||||
msgid ""
|
||||
"Warning: Some configured mods are missing.\n"
|
||||
"Their setting will be removed when you save the configuration. "
|
||||
msgstr ""
|
||||
"警告: いくつかの設定みの改造ファイルが見つかりません.\n"
|
||||
"これらの情報は設定を保存すると削除されます. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:208
|
||||
msgid "enabled"
|
||||
msgstr "有効にしました"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:194
|
||||
#: src/guiConfigureWorld.cpp:218
|
||||
msgid "Enable All"
|
||||
msgstr "全部を有効にしました"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:203
|
||||
#: src/guiConfigureWorld.cpp:227
|
||||
msgid "Disable All"
|
||||
msgstr "全部を無効にしました"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:211
|
||||
#: src/guiConfigureWorld.cpp:235
|
||||
msgid "depends on:"
|
||||
msgstr "この改造ファイルが必要です:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:224
|
||||
#: src/guiConfigureWorld.cpp:248
|
||||
msgid "is required by:"
|
||||
msgstr "この改造に必要されます:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:246 src/guiCreateWorld.cpp:178
|
||||
#: src/guiConfigureWorld.cpp:270 src/guiCreateWorld.cpp:177
|
||||
#: src/guiKeyChangeMenu.cpp:195 src/keycode.cpp:223
|
||||
msgid "Cancel"
|
||||
msgstr "キャンセル"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:253 src/guiKeyChangeMenu.cpp:187
|
||||
#: src/guiConfigureWorld.cpp:277 src/guiKeyChangeMenu.cpp:187
|
||||
msgid "Save"
|
||||
msgstr "保存"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:374
|
||||
#: src/guiConfigureWorld.cpp:403
|
||||
msgid "Configuration saved. "
|
||||
msgstr "設定を保存しました. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:386
|
||||
#: src/guiConfigureWorld.cpp:415
|
||||
msgid "Warning: Configuration not consistent. "
|
||||
msgstr "注意:設定が一定でわありません。"
|
||||
|
||||
|
@ -109,15 +113,15 @@ msgstr "はい"
|
|||
msgid "No"
|
||||
msgstr "いいえ"
|
||||
|
||||
#: src/guiCreateWorld.cpp:123
|
||||
#: src/guiCreateWorld.cpp:125
|
||||
msgid "World name"
|
||||
msgstr "ワールド名"
|
||||
|
||||
#: src/guiCreateWorld.cpp:146
|
||||
#: src/guiCreateWorld.cpp:145
|
||||
msgid "Game"
|
||||
msgstr "ゲーム"
|
||||
|
||||
#: src/guiCreateWorld.cpp:170
|
||||
#: src/guiCreateWorld.cpp:169
|
||||
msgid "Create"
|
||||
msgstr "作成"
|
||||
|
||||
|
@ -129,12 +133,12 @@ msgstr "死亡しました。"
|
|||
msgid "Respawn"
|
||||
msgstr "リスポーン"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:585
|
||||
#: src/guiFormSpecMenu.cpp:582
|
||||
msgid "Left click: Move all items, Right click: Move single item"
|
||||
msgstr "左クリックは全部のアイテムを動かす,右クリックは一つのアイテムを動かす"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:611 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:133
|
||||
#: src/guiFormSpecMenu.cpp:608 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:130
|
||||
msgid "Proceed"
|
||||
msgstr "続く"
|
||||
|
||||
|
@ -409,23 +413,23 @@ msgstr "ワールドの設定ができません: 何も選択されていませ
|
|||
msgid "Failed to delete all world files"
|
||||
msgstr "ワールドファイルの全ての削除に失敗"
|
||||
|
||||
#: src/guiPasswordChange.cpp:107
|
||||
#: src/guiPasswordChange.cpp:108
|
||||
msgid "Old Password"
|
||||
msgstr "古いパスワード"
|
||||
|
||||
#: src/guiPasswordChange.cpp:125
|
||||
#: src/guiPasswordChange.cpp:126
|
||||
msgid "New Password"
|
||||
msgstr "新しいパスワード"
|
||||
|
||||
#: src/guiPasswordChange.cpp:142
|
||||
#: src/guiPasswordChange.cpp:143
|
||||
msgid "Confirm Password"
|
||||
msgstr "パスワードの確認"
|
||||
|
||||
#: src/guiPasswordChange.cpp:160
|
||||
#: src/guiPasswordChange.cpp:161
|
||||
msgid "Change"
|
||||
msgstr "変更"
|
||||
|
||||
#: src/guiPasswordChange.cpp:169
|
||||
#: src/guiPasswordChange.cpp:170
|
||||
msgid "Passwords do not match!"
|
||||
msgstr "新しいパスワードが一致しません!"
|
||||
|
||||
|
@ -464,11 +468,11 @@ msgid ""
|
|||
"- T: chat\n"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiVolumeChange.cpp:107
|
||||
#: src/guiVolumeChange.cpp:108
|
||||
msgid "Sound Volume: "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiVolumeChange.cpp:121
|
||||
#: src/guiVolumeChange.cpp:122
|
||||
msgid "Exit"
|
||||
msgstr ""
|
||||
|
||||
|
@ -804,36 +808,22 @@ msgstr "ズーム"
|
|||
msgid "Main Menu"
|
||||
msgstr "メインメニュー"
|
||||
|
||||
#: src/main.cpp:2040
|
||||
#: src/main.cpp:2035
|
||||
msgid "Failed to initialize world"
|
||||
msgstr "ワールドの初期化に失敗"
|
||||
|
||||
#: src/main.cpp:2053
|
||||
#: src/main.cpp:2048
|
||||
msgid "No world selected and no address provided. Nothing to do."
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2061
|
||||
#: src/main.cpp:2056
|
||||
msgid "Could not find or load game \""
|
||||
msgstr "ゲームをロードか見つかるのに失敗"
|
||||
|
||||
#: src/main.cpp:2075
|
||||
#: src/main.cpp:2070
|
||||
msgid "Invalid gamespec."
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2116
|
||||
#: src/main.cpp:2111
|
||||
msgid "Connection error (timed out?)"
|
||||
msgstr "接続エラー (タイムアウトか?)"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some configured mods are missing.\n"
|
||||
#~ "Their setting will be removed when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "警告: いくつかの設定みの改造ファイルが見つかりません.\n"
|
||||
#~ "これらの情報は設定を保存すると削除されます. "
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some mods are not configured yet.\n"
|
||||
#~ "They will be enabled by default when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "警告: マインテストの改造がいくつか設定されていません。\n"
|
||||
#~ "これらを設定を保存すると自動で有効化されます。 "
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: minetest\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-06-24 00:07+0000\n"
|
||||
"POT-Creation-Date: 2013-05-13 18:26+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -17,86 +17,86 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=CHARSET\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: src/client.cpp:2877
|
||||
#: src/client.cpp:2846
|
||||
msgid "Item textures..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:959
|
||||
#: src/game.cpp:912
|
||||
msgid "Loading..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1019
|
||||
#: src/game.cpp:972
|
||||
msgid "Creating server...."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1035
|
||||
#: src/game.cpp:988
|
||||
msgid "Creating client..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1050
|
||||
#: src/game.cpp:1003
|
||||
msgid "Resolving address..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1126
|
||||
#: src/game.cpp:1079
|
||||
msgid "Connecting to server..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1223
|
||||
msgid "Item definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1230
|
||||
msgid "Node definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1237
|
||||
msgid "Media..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3418
|
||||
#: src/game.cpp:3348
|
||||
msgid "Shutting down stuff..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3448 src/guiConfigureWorld.cpp:397
|
||||
#: src/game.cpp:3378 src/guiConfigureWorld.cpp:426
|
||||
msgid ""
|
||||
"\n"
|
||||
"Check debug.txt for details."
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:184
|
||||
#: src/guiConfigureWorld.cpp:123
|
||||
msgid ""
|
||||
"Warning: Some mods are not configured yet.\n"
|
||||
"They will be enabled by default when you save the configuration. "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:143
|
||||
msgid ""
|
||||
"Warning: Some configured mods are missing.\n"
|
||||
"Their setting will be removed when you save the configuration. "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:208
|
||||
msgid "enabled"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:194
|
||||
#: src/guiConfigureWorld.cpp:218
|
||||
msgid "Enable All"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:203
|
||||
#: src/guiConfigureWorld.cpp:227
|
||||
msgid "Disable All"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:211
|
||||
#: src/guiConfigureWorld.cpp:235
|
||||
msgid "depends on:"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:224
|
||||
#: src/guiConfigureWorld.cpp:248
|
||||
msgid "is required by:"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:246 src/guiCreateWorld.cpp:178
|
||||
#: src/guiConfigureWorld.cpp:270 src/guiCreateWorld.cpp:177
|
||||
#: src/guiKeyChangeMenu.cpp:195 src/keycode.cpp:223
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:253 src/guiKeyChangeMenu.cpp:187
|
||||
#: src/guiConfigureWorld.cpp:277 src/guiKeyChangeMenu.cpp:187
|
||||
msgid "Save"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:374
|
||||
#: src/guiConfigureWorld.cpp:403
|
||||
msgid "Configuration saved. "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:386
|
||||
#: src/guiConfigureWorld.cpp:415
|
||||
msgid "Warning: Configuration not consistent. "
|
||||
msgstr ""
|
||||
|
||||
|
@ -108,15 +108,15 @@ msgstr ""
|
|||
msgid "No"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiCreateWorld.cpp:123
|
||||
#: src/guiCreateWorld.cpp:125
|
||||
msgid "World name"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiCreateWorld.cpp:146
|
||||
#: src/guiCreateWorld.cpp:145
|
||||
msgid "Game"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiCreateWorld.cpp:170
|
||||
#: src/guiCreateWorld.cpp:169
|
||||
msgid "Create"
|
||||
msgstr ""
|
||||
|
||||
|
@ -128,12 +128,12 @@ msgstr ""
|
|||
msgid "Respawn"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:585
|
||||
#: src/guiFormSpecMenu.cpp:582
|
||||
msgid "Left click: Move all items, Right click: Move single item"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:611 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:133
|
||||
#: src/guiFormSpecMenu.cpp:608 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:130
|
||||
msgid "Proceed"
|
||||
msgstr ""
|
||||
|
||||
|
@ -405,23 +405,23 @@ msgstr ""
|
|||
msgid "Failed to delete all world files"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:107
|
||||
#: src/guiPasswordChange.cpp:108
|
||||
msgid "Old Password"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:125
|
||||
#: src/guiPasswordChange.cpp:126
|
||||
msgid "New Password"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:142
|
||||
#: src/guiPasswordChange.cpp:143
|
||||
msgid "Confirm Password"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:160
|
||||
#: src/guiPasswordChange.cpp:161
|
||||
msgid "Change"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:169
|
||||
#: src/guiPasswordChange.cpp:170
|
||||
msgid "Passwords do not match!"
|
||||
msgstr ""
|
||||
|
||||
|
@ -460,11 +460,11 @@ msgid ""
|
|||
"- T: chat\n"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiVolumeChange.cpp:107
|
||||
#: src/guiVolumeChange.cpp:108
|
||||
msgid "Sound Volume: "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiVolumeChange.cpp:121
|
||||
#: src/guiVolumeChange.cpp:122
|
||||
msgid "Exit"
|
||||
msgstr ""
|
||||
|
||||
|
@ -764,22 +764,22 @@ msgstr ""
|
|||
msgid "Main Menu"
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2040
|
||||
#: src/main.cpp:2035
|
||||
msgid "Failed to initialize world"
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2053
|
||||
#: src/main.cpp:2048
|
||||
msgid "No world selected and no address provided. Nothing to do."
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2061
|
||||
#: src/main.cpp:2056
|
||||
msgid "Could not find or load game \""
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2075
|
||||
#: src/main.cpp:2070
|
||||
msgid "Invalid gamespec."
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2116
|
||||
#: src/main.cpp:2111
|
||||
msgid "Connection error (timed out?)"
|
||||
msgstr ""
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: minetest\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-06-24 00:07+0000\n"
|
||||
"POT-Creation-Date: 2013-05-13 18:26+0200\n"
|
||||
"PO-Revision-Date: 2013-06-01 18:09+0200\n"
|
||||
"Last-Translator: Chynggyz Jumaliev <translatorky@lavabit.com>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -18,48 +18,35 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 1.4-dev\n"
|
||||
|
||||
#: src/client.cpp:2877
|
||||
#: src/client.cpp:2846
|
||||
msgid "Item textures..."
|
||||
msgstr "Буюм текстуралары..."
|
||||
|
||||
#: src/game.cpp:959
|
||||
#: src/game.cpp:912
|
||||
msgid "Loading..."
|
||||
msgstr "Жүктөлүүдө..."
|
||||
|
||||
#: src/game.cpp:1019
|
||||
#: src/game.cpp:972
|
||||
msgid "Creating server...."
|
||||
msgstr "Сервер жаратылууда...."
|
||||
|
||||
#: src/game.cpp:1035
|
||||
#: src/game.cpp:988
|
||||
msgid "Creating client..."
|
||||
msgstr "Клиент жаратылууда..."
|
||||
|
||||
#: src/game.cpp:1050
|
||||
#: src/game.cpp:1003
|
||||
msgid "Resolving address..."
|
||||
msgstr "Дареги чечилүүдө..."
|
||||
|
||||
#: src/game.cpp:1126
|
||||
#: src/game.cpp:1079
|
||||
msgid "Connecting to server..."
|
||||
msgstr "Серверге туташтырылууда..."
|
||||
|
||||
#: src/game.cpp:1223
|
||||
#, fuzzy
|
||||
msgid "Item definitions..."
|
||||
msgstr "Буюм текстуралары..."
|
||||
|
||||
#: src/game.cpp:1230
|
||||
msgid "Node definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1237
|
||||
msgid "Media..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3418
|
||||
#: src/game.cpp:3348
|
||||
msgid "Shutting down stuff..."
|
||||
msgstr "Оюн өчүрүлүүдө..."
|
||||
|
||||
#: src/game.cpp:3448 src/guiConfigureWorld.cpp:397
|
||||
#: src/game.cpp:3378 src/guiConfigureWorld.cpp:426
|
||||
msgid ""
|
||||
"\n"
|
||||
"Check debug.txt for details."
|
||||
|
@ -67,40 +54,52 @@ msgstr ""
|
|||
"\n"
|
||||
"Толугураак маалымат үчүн, debug.txt'ти текшериңиз."
|
||||
|
||||
#: src/guiConfigureWorld.cpp:184
|
||||
#: src/guiConfigureWorld.cpp:123
|
||||
msgid ""
|
||||
"Warning: Some mods are not configured yet.\n"
|
||||
"They will be enabled by default when you save the configuration. "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:143
|
||||
msgid ""
|
||||
"Warning: Some configured mods are missing.\n"
|
||||
"Their setting will be removed when you save the configuration. "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:208
|
||||
msgid "enabled"
|
||||
msgstr "күйгүзүлгөн"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:194
|
||||
#: src/guiConfigureWorld.cpp:218
|
||||
msgid "Enable All"
|
||||
msgstr "Баарын күйгүзүү"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:203
|
||||
#: src/guiConfigureWorld.cpp:227
|
||||
msgid "Disable All"
|
||||
msgstr "Баарын өчүрүү"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:211
|
||||
#: src/guiConfigureWorld.cpp:235
|
||||
msgid "depends on:"
|
||||
msgstr "көз карандылыктары:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:224
|
||||
#: src/guiConfigureWorld.cpp:248
|
||||
msgid "is required by:"
|
||||
msgstr "талап кылынганы:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:246 src/guiCreateWorld.cpp:178
|
||||
#: src/guiConfigureWorld.cpp:270 src/guiCreateWorld.cpp:177
|
||||
#: src/guiKeyChangeMenu.cpp:195 src/keycode.cpp:223
|
||||
msgid "Cancel"
|
||||
msgstr "Жокко чыгаруу"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:253 src/guiKeyChangeMenu.cpp:187
|
||||
#: src/guiConfigureWorld.cpp:277 src/guiKeyChangeMenu.cpp:187
|
||||
msgid "Save"
|
||||
msgstr "Сактоо"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:374
|
||||
#: src/guiConfigureWorld.cpp:403
|
||||
msgid "Configuration saved. "
|
||||
msgstr "Конфигурация сакталды. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:386
|
||||
#: src/guiConfigureWorld.cpp:415
|
||||
msgid "Warning: Configuration not consistent. "
|
||||
msgstr "Эскертүү: Туура эмес конфигурация. "
|
||||
|
||||
|
@ -112,15 +111,15 @@ msgstr "Ооба"
|
|||
msgid "No"
|
||||
msgstr "Жок"
|
||||
|
||||
#: src/guiCreateWorld.cpp:123
|
||||
#: src/guiCreateWorld.cpp:125
|
||||
msgid "World name"
|
||||
msgstr "Дүйнө аты"
|
||||
|
||||
#: src/guiCreateWorld.cpp:146
|
||||
#: src/guiCreateWorld.cpp:145
|
||||
msgid "Game"
|
||||
msgstr "Оюн"
|
||||
|
||||
#: src/guiCreateWorld.cpp:170
|
||||
#: src/guiCreateWorld.cpp:169
|
||||
msgid "Create"
|
||||
msgstr "Жаратуу"
|
||||
|
||||
|
@ -132,12 +131,12 @@ msgstr "Сиз өлдүңүз."
|
|||
msgid "Respawn"
|
||||
msgstr "Кайтадан жаралуу"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:585
|
||||
#: src/guiFormSpecMenu.cpp:582
|
||||
msgid "Left click: Move all items, Right click: Move single item"
|
||||
msgstr "Сол баскычы: Бардык буюмдарды ташуу, Оң баскычы: Бир буюмду ташуу"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:611 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:133
|
||||
#: src/guiFormSpecMenu.cpp:608 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:130
|
||||
msgid "Proceed"
|
||||
msgstr "Улантуу"
|
||||
|
||||
|
@ -409,23 +408,23 @@ msgstr "Дүйнөнү ырастоо мүмкүн эмес: Эч нерсе т
|
|||
msgid "Failed to delete all world files"
|
||||
msgstr "Бардык дүйнө файлдарын өчүрүү оңунан чыккан жок"
|
||||
|
||||
#: src/guiPasswordChange.cpp:107
|
||||
#: src/guiPasswordChange.cpp:108
|
||||
msgid "Old Password"
|
||||
msgstr "Эски сырсөз"
|
||||
|
||||
#: src/guiPasswordChange.cpp:125
|
||||
#: src/guiPasswordChange.cpp:126
|
||||
msgid "New Password"
|
||||
msgstr "Жаңы сырсөз"
|
||||
|
||||
#: src/guiPasswordChange.cpp:142
|
||||
#: src/guiPasswordChange.cpp:143
|
||||
msgid "Confirm Password"
|
||||
msgstr "Сырсөздү аныктоо"
|
||||
|
||||
#: src/guiPasswordChange.cpp:160
|
||||
#: src/guiPasswordChange.cpp:161
|
||||
msgid "Change"
|
||||
msgstr "Өзгөртүү"
|
||||
|
||||
#: src/guiPasswordChange.cpp:169
|
||||
#: src/guiPasswordChange.cpp:170
|
||||
msgid "Passwords do not match!"
|
||||
msgstr "Сырсөздөр дал келген жок!"
|
||||
|
||||
|
@ -475,11 +474,11 @@ msgstr ""
|
|||
"- Чычкан дөңгөлөгү: буюмду тандоо\n"
|
||||
"- T: маек\n"
|
||||
|
||||
#: src/guiVolumeChange.cpp:107
|
||||
#: src/guiVolumeChange.cpp:108
|
||||
msgid "Sound Volume: "
|
||||
msgstr "Үн көлөмү: "
|
||||
|
||||
#: src/guiVolumeChange.cpp:121
|
||||
#: src/guiVolumeChange.cpp:122
|
||||
msgid "Exit"
|
||||
msgstr "Чыгуу"
|
||||
|
||||
|
@ -779,23 +778,23 @@ msgstr "Масштаб"
|
|||
msgid "Main Menu"
|
||||
msgstr "Башкы меню"
|
||||
|
||||
#: src/main.cpp:2040
|
||||
#: src/main.cpp:2035
|
||||
msgid "Failed to initialize world"
|
||||
msgstr "Дүйнөнү инициалдаштыруу катасы"
|
||||
|
||||
#: src/main.cpp:2053
|
||||
#: src/main.cpp:2048
|
||||
msgid "No world selected and no address provided. Nothing to do."
|
||||
msgstr "Дүйнө тандалган жок жана дареги киргизилген жок. Кылууга эч нерсе жок."
|
||||
|
||||
#: src/main.cpp:2061
|
||||
#: src/main.cpp:2056
|
||||
msgid "Could not find or load game \""
|
||||
msgstr "Оюнду табуу же жүктөө мүмкүн эмес \""
|
||||
|
||||
#: src/main.cpp:2075
|
||||
#: src/main.cpp:2070
|
||||
msgid "Invalid gamespec."
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2116
|
||||
#: src/main.cpp:2111
|
||||
msgid "Connection error (timed out?)"
|
||||
msgstr "Туташтыруу катасы (убактыңыз өтүп кеттиби?)"
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: minetest\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-06-24 00:07+0000\n"
|
||||
"POT-Creation-Date: 2013-05-13 18:26+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -17,86 +17,86 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=CHARSET\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: src/client.cpp:2877
|
||||
#: src/client.cpp:2846
|
||||
msgid "Item textures..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:959
|
||||
#: src/game.cpp:912
|
||||
msgid "Loading..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1019
|
||||
#: src/game.cpp:972
|
||||
msgid "Creating server...."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1035
|
||||
#: src/game.cpp:988
|
||||
msgid "Creating client..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1050
|
||||
#: src/game.cpp:1003
|
||||
msgid "Resolving address..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1126
|
||||
#: src/game.cpp:1079
|
||||
msgid "Connecting to server..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1223
|
||||
msgid "Item definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1230
|
||||
msgid "Node definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1237
|
||||
msgid "Media..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3418
|
||||
#: src/game.cpp:3348
|
||||
msgid "Shutting down stuff..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3448 src/guiConfigureWorld.cpp:397
|
||||
#: src/game.cpp:3378 src/guiConfigureWorld.cpp:426
|
||||
msgid ""
|
||||
"\n"
|
||||
"Check debug.txt for details."
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:184
|
||||
#: src/guiConfigureWorld.cpp:123
|
||||
msgid ""
|
||||
"Warning: Some mods are not configured yet.\n"
|
||||
"They will be enabled by default when you save the configuration. "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:143
|
||||
msgid ""
|
||||
"Warning: Some configured mods are missing.\n"
|
||||
"Their setting will be removed when you save the configuration. "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:208
|
||||
msgid "enabled"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:194
|
||||
#: src/guiConfigureWorld.cpp:218
|
||||
msgid "Enable All"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:203
|
||||
#: src/guiConfigureWorld.cpp:227
|
||||
msgid "Disable All"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:211
|
||||
#: src/guiConfigureWorld.cpp:235
|
||||
msgid "depends on:"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:224
|
||||
#: src/guiConfigureWorld.cpp:248
|
||||
msgid "is required by:"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:246 src/guiCreateWorld.cpp:178
|
||||
#: src/guiConfigureWorld.cpp:270 src/guiCreateWorld.cpp:177
|
||||
#: src/guiKeyChangeMenu.cpp:195 src/keycode.cpp:223
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:253 src/guiKeyChangeMenu.cpp:187
|
||||
#: src/guiConfigureWorld.cpp:277 src/guiKeyChangeMenu.cpp:187
|
||||
msgid "Save"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:374
|
||||
#: src/guiConfigureWorld.cpp:403
|
||||
msgid "Configuration saved. "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:386
|
||||
#: src/guiConfigureWorld.cpp:415
|
||||
msgid "Warning: Configuration not consistent. "
|
||||
msgstr ""
|
||||
|
||||
|
@ -108,15 +108,15 @@ msgstr ""
|
|||
msgid "No"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiCreateWorld.cpp:123
|
||||
#: src/guiCreateWorld.cpp:125
|
||||
msgid "World name"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiCreateWorld.cpp:146
|
||||
#: src/guiCreateWorld.cpp:145
|
||||
msgid "Game"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiCreateWorld.cpp:170
|
||||
#: src/guiCreateWorld.cpp:169
|
||||
msgid "Create"
|
||||
msgstr ""
|
||||
|
||||
|
@ -128,12 +128,12 @@ msgstr ""
|
|||
msgid "Respawn"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:585
|
||||
#: src/guiFormSpecMenu.cpp:582
|
||||
msgid "Left click: Move all items, Right click: Move single item"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:611 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:133
|
||||
#: src/guiFormSpecMenu.cpp:608 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:130
|
||||
msgid "Proceed"
|
||||
msgstr ""
|
||||
|
||||
|
@ -405,23 +405,23 @@ msgstr ""
|
|||
msgid "Failed to delete all world files"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:107
|
||||
#: src/guiPasswordChange.cpp:108
|
||||
msgid "Old Password"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:125
|
||||
#: src/guiPasswordChange.cpp:126
|
||||
msgid "New Password"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:142
|
||||
#: src/guiPasswordChange.cpp:143
|
||||
msgid "Confirm Password"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:160
|
||||
#: src/guiPasswordChange.cpp:161
|
||||
msgid "Change"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:169
|
||||
#: src/guiPasswordChange.cpp:170
|
||||
msgid "Passwords do not match!"
|
||||
msgstr ""
|
||||
|
||||
|
@ -460,11 +460,11 @@ msgid ""
|
|||
"- T: chat\n"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiVolumeChange.cpp:107
|
||||
#: src/guiVolumeChange.cpp:108
|
||||
msgid "Sound Volume: "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiVolumeChange.cpp:121
|
||||
#: src/guiVolumeChange.cpp:122
|
||||
msgid "Exit"
|
||||
msgstr ""
|
||||
|
||||
|
@ -764,22 +764,22 @@ msgstr ""
|
|||
msgid "Main Menu"
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2040
|
||||
#: src/main.cpp:2035
|
||||
msgid "Failed to initialize world"
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2053
|
||||
#: src/main.cpp:2048
|
||||
msgid "No world selected and no address provided. Nothing to do."
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2061
|
||||
#: src/main.cpp:2056
|
||||
msgid "Could not find or load game \""
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2075
|
||||
#: src/main.cpp:2070
|
||||
msgid "Invalid gamespec."
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2116
|
||||
#: src/main.cpp:2111
|
||||
msgid "Connection error (timed out?)"
|
||||
msgstr ""
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: minetest\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-06-24 00:07+0000\n"
|
||||
"POT-Creation-Date: 2013-05-13 18:26+0200\n"
|
||||
"PO-Revision-Date: 2013-05-02 08:17+0200\n"
|
||||
"Last-Translator: Sindre Tellevik <graknol@gmail.com>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -18,86 +18,90 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Weblate 1.4-dev\n"
|
||||
|
||||
#: src/client.cpp:2877
|
||||
#: src/client.cpp:2846
|
||||
msgid "Item textures..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:959
|
||||
#: src/game.cpp:912
|
||||
msgid "Loading..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1019
|
||||
#: src/game.cpp:972
|
||||
msgid "Creating server...."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1035
|
||||
#: src/game.cpp:988
|
||||
msgid "Creating client..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1050
|
||||
#: src/game.cpp:1003
|
||||
msgid "Resolving address..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1126
|
||||
#: src/game.cpp:1079
|
||||
msgid "Connecting to server..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1223
|
||||
msgid "Item definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1230
|
||||
msgid "Node definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1237
|
||||
msgid "Media..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3418
|
||||
#: src/game.cpp:3348
|
||||
msgid "Shutting down stuff..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3448 src/guiConfigureWorld.cpp:397
|
||||
#: src/game.cpp:3378 src/guiConfigureWorld.cpp:426
|
||||
msgid ""
|
||||
"\n"
|
||||
"Check debug.txt for details."
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:184
|
||||
#: src/guiConfigureWorld.cpp:123
|
||||
msgid ""
|
||||
"Warning: Some mods are not configured yet.\n"
|
||||
"They will be enabled by default when you save the configuration. "
|
||||
msgstr ""
|
||||
"Advarsel: Noen modifikasjoner er ikke konfigurert enda. \n"
|
||||
"De vil bli aktivert som standard når du lagrer konfigurasjonen."
|
||||
|
||||
#: src/guiConfigureWorld.cpp:143
|
||||
msgid ""
|
||||
"Warning: Some configured mods are missing.\n"
|
||||
"Their setting will be removed when you save the configuration. "
|
||||
msgstr ""
|
||||
"Advarsel: Noen konfigurerte modifikasjoner mangler. \n"
|
||||
"Instillingene deres vil bli fjernet når du lagrer konfigurasjonen."
|
||||
|
||||
#: src/guiConfigureWorld.cpp:208
|
||||
msgid "enabled"
|
||||
msgstr "aktivert"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:194
|
||||
#: src/guiConfigureWorld.cpp:218
|
||||
msgid "Enable All"
|
||||
msgstr "Aktiver Alle"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:203
|
||||
#: src/guiConfigureWorld.cpp:227
|
||||
msgid "Disable All"
|
||||
msgstr "Deaktiver Alle"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:211
|
||||
#: src/guiConfigureWorld.cpp:235
|
||||
msgid "depends on:"
|
||||
msgstr "Avhenger av:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:224
|
||||
#: src/guiConfigureWorld.cpp:248
|
||||
msgid "is required by:"
|
||||
msgstr "trengs av:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:246 src/guiCreateWorld.cpp:178
|
||||
#: src/guiConfigureWorld.cpp:270 src/guiCreateWorld.cpp:177
|
||||
#: src/guiKeyChangeMenu.cpp:195 src/keycode.cpp:223
|
||||
msgid "Cancel"
|
||||
msgstr "Avbryt"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:253 src/guiKeyChangeMenu.cpp:187
|
||||
#: src/guiConfigureWorld.cpp:277 src/guiKeyChangeMenu.cpp:187
|
||||
msgid "Save"
|
||||
msgstr "Lagre"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:374
|
||||
#: src/guiConfigureWorld.cpp:403
|
||||
msgid "Configuration saved. "
|
||||
msgstr "Konfigurasjon lagret.…"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:386
|
||||
#: src/guiConfigureWorld.cpp:415
|
||||
msgid "Warning: Configuration not consistent. "
|
||||
msgstr ""
|
||||
|
||||
|
@ -109,15 +113,15 @@ msgstr "Ja"
|
|||
msgid "No"
|
||||
msgstr "Nei"
|
||||
|
||||
#: src/guiCreateWorld.cpp:123
|
||||
#: src/guiCreateWorld.cpp:125
|
||||
msgid "World name"
|
||||
msgstr "Navnet på verdenen"
|
||||
|
||||
#: src/guiCreateWorld.cpp:146
|
||||
#: src/guiCreateWorld.cpp:145
|
||||
msgid "Game"
|
||||
msgstr "Spill"
|
||||
|
||||
#: src/guiCreateWorld.cpp:170
|
||||
#: src/guiCreateWorld.cpp:169
|
||||
msgid "Create"
|
||||
msgstr "Opprett"
|
||||
|
||||
|
@ -129,12 +133,12 @@ msgstr "Du døde."
|
|||
msgid "Respawn"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:585
|
||||
#: src/guiFormSpecMenu.cpp:582
|
||||
msgid "Left click: Move all items, Right click: Move single item"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:611 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:133
|
||||
#: src/guiFormSpecMenu.cpp:608 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:130
|
||||
msgid "Proceed"
|
||||
msgstr ""
|
||||
|
||||
|
@ -406,23 +410,23 @@ msgstr ""
|
|||
msgid "Failed to delete all world files"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:107
|
||||
#: src/guiPasswordChange.cpp:108
|
||||
msgid "Old Password"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:125
|
||||
#: src/guiPasswordChange.cpp:126
|
||||
msgid "New Password"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:142
|
||||
#: src/guiPasswordChange.cpp:143
|
||||
msgid "Confirm Password"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:160
|
||||
#: src/guiPasswordChange.cpp:161
|
||||
msgid "Change"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:169
|
||||
#: src/guiPasswordChange.cpp:170
|
||||
msgid "Passwords do not match!"
|
||||
msgstr ""
|
||||
|
||||
|
@ -461,11 +465,11 @@ msgid ""
|
|||
"- T: chat\n"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiVolumeChange.cpp:107
|
||||
#: src/guiVolumeChange.cpp:108
|
||||
msgid "Sound Volume: "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiVolumeChange.cpp:121
|
||||
#: src/guiVolumeChange.cpp:122
|
||||
msgid "Exit"
|
||||
msgstr ""
|
||||
|
||||
|
@ -765,36 +769,22 @@ msgstr ""
|
|||
msgid "Main Menu"
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2040
|
||||
#: src/main.cpp:2035
|
||||
msgid "Failed to initialize world"
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2053
|
||||
#: src/main.cpp:2048
|
||||
msgid "No world selected and no address provided. Nothing to do."
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2061
|
||||
#: src/main.cpp:2056
|
||||
msgid "Could not find or load game \""
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2075
|
||||
#: src/main.cpp:2070
|
||||
msgid "Invalid gamespec."
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2116
|
||||
#: src/main.cpp:2111
|
||||
msgid "Connection error (timed out?)"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some configured mods are missing.\n"
|
||||
#~ "Their setting will be removed when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "Advarsel: Noen konfigurerte modifikasjoner mangler. \n"
|
||||
#~ "Instillingene deres vil bli fjernet når du lagrer konfigurasjonen."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some mods are not configured yet.\n"
|
||||
#~ "They will be enabled by default when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "Advarsel: Noen modifikasjoner er ikke konfigurert enda. \n"
|
||||
#~ "De vil bli aktivert som standard når du lagrer konfigurasjonen."
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: minetest\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-06-24 00:07+0000\n"
|
||||
"POT-Creation-Date: 2013-05-13 18:26+0200\n"
|
||||
"PO-Revision-Date: 2013-05-01 22:18+0200\n"
|
||||
"Last-Translator: Sfan5 . <sfan5@live.de>\n"
|
||||
"Language-Team: \n"
|
||||
|
@ -18,47 +18,35 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Weblate 1.4-dev\n"
|
||||
|
||||
#: src/client.cpp:2877
|
||||
#: src/client.cpp:2846
|
||||
msgid "Item textures..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:959
|
||||
#: src/game.cpp:912
|
||||
msgid "Loading..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1019
|
||||
#: src/game.cpp:972
|
||||
msgid "Creating server...."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1035
|
||||
#: src/game.cpp:988
|
||||
msgid "Creating client..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1050
|
||||
#: src/game.cpp:1003
|
||||
msgid "Resolving address..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1126
|
||||
#: src/game.cpp:1079
|
||||
msgid "Connecting to server..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1223
|
||||
msgid "Item definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1230
|
||||
msgid "Node definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1237
|
||||
msgid "Media..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3418
|
||||
#: src/game.cpp:3348
|
||||
msgid "Shutting down stuff..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3448 src/guiConfigureWorld.cpp:397
|
||||
#: src/game.cpp:3378 src/guiConfigureWorld.cpp:426
|
||||
msgid ""
|
||||
"\n"
|
||||
"Check debug.txt for details."
|
||||
|
@ -66,40 +54,57 @@ msgstr ""
|
|||
"\n"
|
||||
"Check debug.txt for details."
|
||||
|
||||
#: src/guiConfigureWorld.cpp:184
|
||||
#: src/guiConfigureWorld.cpp:123
|
||||
msgid ""
|
||||
"Warning: Some mods are not configured yet.\n"
|
||||
"They will be enabled by default when you save the configuration. "
|
||||
msgstr ""
|
||||
"Let op: Nog niet alle mods zijn geconfigueerd. \n"
|
||||
"De mods zullen automatisch worden ingeschakeld als je de configuratie "
|
||||
"bewaard. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:143
|
||||
msgid ""
|
||||
"Warning: Some configured mods are missing.\n"
|
||||
"Their setting will be removed when you save the configuration. "
|
||||
msgstr ""
|
||||
"LEt op: Sommige ingestelde mods zijn vermist.\n"
|
||||
"Hun instellingen worden verwijderd als je de configuratie opslaat. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:208
|
||||
msgid "enabled"
|
||||
msgstr "ingeschakeld"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:194
|
||||
#: src/guiConfigureWorld.cpp:218
|
||||
msgid "Enable All"
|
||||
msgstr "Allen inschakelen"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:203
|
||||
#: src/guiConfigureWorld.cpp:227
|
||||
msgid "Disable All"
|
||||
msgstr "Allen uitschakelen"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:211
|
||||
#: src/guiConfigureWorld.cpp:235
|
||||
msgid "depends on:"
|
||||
msgstr "heeft nodig:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:224
|
||||
#: src/guiConfigureWorld.cpp:248
|
||||
msgid "is required by:"
|
||||
msgstr "is benodigd voor:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:246 src/guiCreateWorld.cpp:178
|
||||
#: src/guiConfigureWorld.cpp:270 src/guiCreateWorld.cpp:177
|
||||
#: src/guiKeyChangeMenu.cpp:195 src/keycode.cpp:223
|
||||
msgid "Cancel"
|
||||
msgstr "Annuleer"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:253 src/guiKeyChangeMenu.cpp:187
|
||||
#: src/guiConfigureWorld.cpp:277 src/guiKeyChangeMenu.cpp:187
|
||||
msgid "Save"
|
||||
msgstr "Bewaar"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:374
|
||||
#: src/guiConfigureWorld.cpp:403
|
||||
msgid "Configuration saved. "
|
||||
msgstr "Instellingen bewaard. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:386
|
||||
#: src/guiConfigureWorld.cpp:415
|
||||
msgid "Warning: Configuration not consistent. "
|
||||
msgstr "Waarschuwing: Instellingen niet consistent. "
|
||||
|
||||
|
@ -111,15 +116,15 @@ msgstr "Ja"
|
|||
msgid "No"
|
||||
msgstr "Nee"
|
||||
|
||||
#: src/guiCreateWorld.cpp:123
|
||||
#: src/guiCreateWorld.cpp:125
|
||||
msgid "World name"
|
||||
msgstr "Naam wereld"
|
||||
|
||||
#: src/guiCreateWorld.cpp:146
|
||||
#: src/guiCreateWorld.cpp:145
|
||||
msgid "Game"
|
||||
msgstr "Spel"
|
||||
|
||||
#: src/guiCreateWorld.cpp:170
|
||||
#: src/guiCreateWorld.cpp:169
|
||||
msgid "Create"
|
||||
msgstr "Maak aan"
|
||||
|
||||
|
@ -131,13 +136,13 @@ msgstr "Je bent gestorven."
|
|||
msgid "Respawn"
|
||||
msgstr "Respawn"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:585
|
||||
#: src/guiFormSpecMenu.cpp:582
|
||||
msgid "Left click: Move all items, Right click: Move single item"
|
||||
msgstr ""
|
||||
"Linkermuisknop: Verplaats alle items. Rechtermuisknop: Verplaats één item"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:611 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:133
|
||||
#: src/guiFormSpecMenu.cpp:608 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:130
|
||||
msgid "Proceed"
|
||||
msgstr "Volgende"
|
||||
|
||||
|
@ -409,23 +414,23 @@ msgstr "Kan instellingen niet aanpassen: Niets geselecteerd"
|
|||
msgid "Failed to delete all world files"
|
||||
msgstr "Niet alle bestanden zijn verwijderd"
|
||||
|
||||
#: src/guiPasswordChange.cpp:107
|
||||
#: src/guiPasswordChange.cpp:108
|
||||
msgid "Old Password"
|
||||
msgstr "Huidig wachtwoord"
|
||||
|
||||
#: src/guiPasswordChange.cpp:125
|
||||
#: src/guiPasswordChange.cpp:126
|
||||
msgid "New Password"
|
||||
msgstr "Nieuw wachtwoord"
|
||||
|
||||
#: src/guiPasswordChange.cpp:142
|
||||
#: src/guiPasswordChange.cpp:143
|
||||
msgid "Confirm Password"
|
||||
msgstr "Herhaal wachtwoord"
|
||||
|
||||
#: src/guiPasswordChange.cpp:160
|
||||
#: src/guiPasswordChange.cpp:161
|
||||
msgid "Change"
|
||||
msgstr "Veranderen"
|
||||
|
||||
#: src/guiPasswordChange.cpp:169
|
||||
#: src/guiPasswordChange.cpp:170
|
||||
msgid "Passwords do not match!"
|
||||
msgstr "Wachtwoorden zijn niet gelijk!"
|
||||
|
||||
|
@ -464,11 +469,11 @@ msgid ""
|
|||
"- T: chat\n"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiVolumeChange.cpp:107
|
||||
#: src/guiVolumeChange.cpp:108
|
||||
msgid "Sound Volume: "
|
||||
msgstr "Volume: "
|
||||
|
||||
#: src/guiVolumeChange.cpp:121
|
||||
#: src/guiVolumeChange.cpp:122
|
||||
msgid "Exit"
|
||||
msgstr "Exit"
|
||||
|
||||
|
@ -768,23 +773,23 @@ msgstr "Zoom"
|
|||
msgid "Main Menu"
|
||||
msgstr "Hoofdmenu"
|
||||
|
||||
#: src/main.cpp:2040
|
||||
#: src/main.cpp:2035
|
||||
msgid "Failed to initialize world"
|
||||
msgstr "Laden van wereld is mislukt"
|
||||
|
||||
#: src/main.cpp:2053
|
||||
#: src/main.cpp:2048
|
||||
msgid "No world selected and no address provided. Nothing to do."
|
||||
msgstr "Geen wereld en adres geselecteerd. Niks te doen."
|
||||
|
||||
#: src/main.cpp:2061
|
||||
#: src/main.cpp:2056
|
||||
msgid "Could not find or load game \""
|
||||
msgstr "Kan niet de game laden of vinden \""
|
||||
|
||||
#: src/main.cpp:2075
|
||||
#: src/main.cpp:2070
|
||||
msgid "Invalid gamespec."
|
||||
msgstr "Onjuiste gamespec."
|
||||
|
||||
#: src/main.cpp:2116
|
||||
#: src/main.cpp:2111
|
||||
msgid "Connection error (timed out?)"
|
||||
msgstr "Connection error (timed out?)"
|
||||
|
||||
|
@ -812,18 +817,3 @@ msgstr "Connection error (timed out?)"
|
|||
#~ "- I: Rugzak\n"
|
||||
#~ "- ESC: Menu\n"
|
||||
#~ "- T: Chat\n"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some configured mods are missing.\n"
|
||||
#~ "Their setting will be removed when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "LEt op: Sommige ingestelde mods zijn vermist.\n"
|
||||
#~ "Hun instellingen worden verwijderd als je de configuratie opslaat. "
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some mods are not configured yet.\n"
|
||||
#~ "They will be enabled by default when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "Let op: Nog niet alle mods zijn geconfigueerd. \n"
|
||||
#~ "De mods zullen automatisch worden ingeschakeld als je de configuratie "
|
||||
#~ "bewaard. "
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: minetest\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-06-24 00:07+0000\n"
|
||||
"POT-Creation-Date: 2013-05-13 18:26+0200\n"
|
||||
"PO-Revision-Date: 2013-04-21 23:38+0200\n"
|
||||
"Last-Translator: Daniel \"Tracerneo\" Ziółkowski <ziolkoneo@gmail.com>\n"
|
||||
"Language-Team: Polish <>\n"
|
||||
|
@ -19,47 +19,35 @@ msgstr ""
|
|||
"|| n%100>=20) ? 1 : 2);\n"
|
||||
"X-Generator: Weblate 1.4-dev\n"
|
||||
|
||||
#: src/client.cpp:2877
|
||||
#: src/client.cpp:2846
|
||||
msgid "Item textures..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:959
|
||||
#: src/game.cpp:912
|
||||
msgid "Loading..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1019
|
||||
#: src/game.cpp:972
|
||||
msgid "Creating server...."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1035
|
||||
#: src/game.cpp:988
|
||||
msgid "Creating client..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1050
|
||||
#: src/game.cpp:1003
|
||||
msgid "Resolving address..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1126
|
||||
#: src/game.cpp:1079
|
||||
msgid "Connecting to server..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1223
|
||||
msgid "Item definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1230
|
||||
msgid "Node definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1237
|
||||
msgid "Media..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3418
|
||||
#: src/game.cpp:3348
|
||||
msgid "Shutting down stuff..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3448 src/guiConfigureWorld.cpp:397
|
||||
#: src/game.cpp:3378 src/guiConfigureWorld.cpp:426
|
||||
msgid ""
|
||||
"\n"
|
||||
"Check debug.txt for details."
|
||||
|
@ -67,40 +55,56 @@ msgstr ""
|
|||
"\n"
|
||||
"Sprawdź plik debug.txt by uzyskać więcej informacji."
|
||||
|
||||
#: src/guiConfigureWorld.cpp:184
|
||||
#: src/guiConfigureWorld.cpp:123
|
||||
msgid ""
|
||||
"Warning: Some mods are not configured yet.\n"
|
||||
"They will be enabled by default when you save the configuration. "
|
||||
msgstr ""
|
||||
"Uwaga: Niektóre z modyfikacji nie zostały jeszcze skonfigurowane.\n"
|
||||
"Zostaną domyślnie włączone gdy zapiszesz konfigurację. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:143
|
||||
msgid ""
|
||||
"Warning: Some configured mods are missing.\n"
|
||||
"Their setting will be removed when you save the configuration. "
|
||||
msgstr ""
|
||||
"Ostrzeżenie: Niektóre z modyfikacji nie zostały znalezione.\n"
|
||||
"Ich ustawienia zostaną usunięte gdy zapiszesz konfigurację. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:208
|
||||
msgid "enabled"
|
||||
msgstr "włączone"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:194
|
||||
#: src/guiConfigureWorld.cpp:218
|
||||
msgid "Enable All"
|
||||
msgstr "Włącz wszystkie"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:203
|
||||
#: src/guiConfigureWorld.cpp:227
|
||||
msgid "Disable All"
|
||||
msgstr "Wyłącz wszystkie"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:211
|
||||
#: src/guiConfigureWorld.cpp:235
|
||||
msgid "depends on:"
|
||||
msgstr "zależne od:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:224
|
||||
#: src/guiConfigureWorld.cpp:248
|
||||
msgid "is required by:"
|
||||
msgstr "wymagane przez:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:246 src/guiCreateWorld.cpp:178
|
||||
#: src/guiConfigureWorld.cpp:270 src/guiCreateWorld.cpp:177
|
||||
#: src/guiKeyChangeMenu.cpp:195 src/keycode.cpp:223
|
||||
msgid "Cancel"
|
||||
msgstr "Anuluj"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:253 src/guiKeyChangeMenu.cpp:187
|
||||
#: src/guiConfigureWorld.cpp:277 src/guiKeyChangeMenu.cpp:187
|
||||
msgid "Save"
|
||||
msgstr "Zapisz"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:374
|
||||
#: src/guiConfigureWorld.cpp:403
|
||||
msgid "Configuration saved. "
|
||||
msgstr "Konfiguracja zapisana. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:386
|
||||
#: src/guiConfigureWorld.cpp:415
|
||||
msgid "Warning: Configuration not consistent. "
|
||||
msgstr "Ostrzeżenie: Plik konfiguracyjny niespójny. "
|
||||
|
||||
|
@ -112,15 +116,15 @@ msgstr "Tak"
|
|||
msgid "No"
|
||||
msgstr "Nie"
|
||||
|
||||
#: src/guiCreateWorld.cpp:123
|
||||
#: src/guiCreateWorld.cpp:125
|
||||
msgid "World name"
|
||||
msgstr "Nazwa świata"
|
||||
|
||||
#: src/guiCreateWorld.cpp:146
|
||||
#: src/guiCreateWorld.cpp:145
|
||||
msgid "Game"
|
||||
msgstr "Gra"
|
||||
|
||||
#: src/guiCreateWorld.cpp:170
|
||||
#: src/guiCreateWorld.cpp:169
|
||||
msgid "Create"
|
||||
msgstr "Utwórz"
|
||||
|
||||
|
@ -132,14 +136,14 @@ msgstr "Zginąłeś."
|
|||
msgid "Respawn"
|
||||
msgstr "Wróć do gry"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:585
|
||||
#: src/guiFormSpecMenu.cpp:582
|
||||
msgid "Left click: Move all items, Right click: Move single item"
|
||||
msgstr ""
|
||||
"Lewy przycisk myszy: przenieś wszystkie przedmioty, Prawy przycisk myszy: "
|
||||
"przenieś pojedynczy przedmiot"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:611 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:133
|
||||
#: src/guiFormSpecMenu.cpp:608 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:130
|
||||
msgid "Proceed"
|
||||
msgstr "Kontynuuj"
|
||||
|
||||
|
@ -413,23 +417,23 @@ msgstr "Nie można skonfigurować świata: Nic nie zaznaczono"
|
|||
msgid "Failed to delete all world files"
|
||||
msgstr "Nie udało się skasować wszystkich plików świata"
|
||||
|
||||
#: src/guiPasswordChange.cpp:107
|
||||
#: src/guiPasswordChange.cpp:108
|
||||
msgid "Old Password"
|
||||
msgstr "Stare hasło"
|
||||
|
||||
#: src/guiPasswordChange.cpp:125
|
||||
#: src/guiPasswordChange.cpp:126
|
||||
msgid "New Password"
|
||||
msgstr "Nowe hasło"
|
||||
|
||||
#: src/guiPasswordChange.cpp:142
|
||||
#: src/guiPasswordChange.cpp:143
|
||||
msgid "Confirm Password"
|
||||
msgstr "Potwierdź hasło"
|
||||
|
||||
#: src/guiPasswordChange.cpp:160
|
||||
#: src/guiPasswordChange.cpp:161
|
||||
msgid "Change"
|
||||
msgstr "Zmień"
|
||||
|
||||
#: src/guiPasswordChange.cpp:169
|
||||
#: src/guiPasswordChange.cpp:170
|
||||
msgid "Passwords do not match!"
|
||||
msgstr "Hasła nie są jednakowe!"
|
||||
|
||||
|
@ -468,11 +472,11 @@ msgid ""
|
|||
"- T: chat\n"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiVolumeChange.cpp:107
|
||||
#: src/guiVolumeChange.cpp:108
|
||||
msgid "Sound Volume: "
|
||||
msgstr "Głośność: "
|
||||
|
||||
#: src/guiVolumeChange.cpp:121
|
||||
#: src/guiVolumeChange.cpp:122
|
||||
msgid "Exit"
|
||||
msgstr "Wyjście"
|
||||
|
||||
|
@ -772,23 +776,23 @@ msgstr "Zoom"
|
|||
msgid "Main Menu"
|
||||
msgstr "Menu główne"
|
||||
|
||||
#: src/main.cpp:2040
|
||||
#: src/main.cpp:2035
|
||||
msgid "Failed to initialize world"
|
||||
msgstr "Inicjalizacja świata nie powiodła się"
|
||||
|
||||
#: src/main.cpp:2053
|
||||
#: src/main.cpp:2048
|
||||
msgid "No world selected and no address provided. Nothing to do."
|
||||
msgstr "Nie wybrano świata ani adresu."
|
||||
|
||||
#: src/main.cpp:2061
|
||||
#: src/main.cpp:2056
|
||||
msgid "Could not find or load game \""
|
||||
msgstr "Nie można znaleźć lub wczytać trybu gry \""
|
||||
|
||||
#: src/main.cpp:2075
|
||||
#: src/main.cpp:2070
|
||||
msgid "Invalid gamespec."
|
||||
msgstr "Nieprawidłowa specyfikacja trybu gry."
|
||||
|
||||
#: src/main.cpp:2116
|
||||
#: src/main.cpp:2111
|
||||
msgid "Connection error (timed out?)"
|
||||
msgstr "Błąd połączenia (brak odpowiedzi?)"
|
||||
|
||||
|
@ -816,17 +820,3 @@ msgstr "Błąd połączenia (brak odpowiedzi?)"
|
|||
#~ "- I: menu ekwipunku\n"
|
||||
#~ "- ESC: to menu\n"
|
||||
#~ "- T: czat\n"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some configured mods are missing.\n"
|
||||
#~ "Their setting will be removed when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "Ostrzeżenie: Niektóre z modyfikacji nie zostały znalezione.\n"
|
||||
#~ "Ich ustawienia zostaną usunięte gdy zapiszesz konfigurację. "
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some mods are not configured yet.\n"
|
||||
#~ "They will be enabled by default when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "Uwaga: Niektóre z modyfikacji nie zostały jeszcze skonfigurowane.\n"
|
||||
#~ "Zostaną domyślnie włączone gdy zapiszesz konfigurację. "
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: minetest\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-06-24 00:07+0000\n"
|
||||
"POT-Creation-Date: 2013-05-13 18:26+0200\n"
|
||||
"PO-Revision-Date: 2013-05-30 00:13+0200\n"
|
||||
"Last-Translator: v c <vicente.camolas@gmail.com>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -18,48 +18,35 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Weblate 1.4-dev\n"
|
||||
|
||||
#: src/client.cpp:2877
|
||||
#: src/client.cpp:2846
|
||||
msgid "Item textures..."
|
||||
msgstr "Texturas dos items..."
|
||||
|
||||
#: src/game.cpp:959
|
||||
#: src/game.cpp:912
|
||||
msgid "Loading..."
|
||||
msgstr "A carregar..."
|
||||
|
||||
#: src/game.cpp:1019
|
||||
#: src/game.cpp:972
|
||||
msgid "Creating server...."
|
||||
msgstr "A criar servidor..."
|
||||
|
||||
#: src/game.cpp:1035
|
||||
#: src/game.cpp:988
|
||||
msgid "Creating client..."
|
||||
msgstr "A criar cliente..."
|
||||
|
||||
#: src/game.cpp:1050
|
||||
#: src/game.cpp:1003
|
||||
msgid "Resolving address..."
|
||||
msgstr "A resolver endereço..."
|
||||
|
||||
#: src/game.cpp:1126
|
||||
#: src/game.cpp:1079
|
||||
msgid "Connecting to server..."
|
||||
msgstr "A conectar ao servidor..."
|
||||
|
||||
#: src/game.cpp:1223
|
||||
#, fuzzy
|
||||
msgid "Item definitions..."
|
||||
msgstr "Texturas dos items..."
|
||||
|
||||
#: src/game.cpp:1230
|
||||
msgid "Node definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1237
|
||||
msgid "Media..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3418
|
||||
#: src/game.cpp:3348
|
||||
msgid "Shutting down stuff..."
|
||||
msgstr "A desligar..."
|
||||
|
||||
#: src/game.cpp:3448 src/guiConfigureWorld.cpp:397
|
||||
#: src/game.cpp:3378 src/guiConfigureWorld.cpp:426
|
||||
msgid ""
|
||||
"\n"
|
||||
"Check debug.txt for details."
|
||||
|
@ -67,40 +54,56 @@ msgstr ""
|
|||
"\n"
|
||||
"Consulte debug.txt para mais detalhes."
|
||||
|
||||
#: src/guiConfigureWorld.cpp:184
|
||||
#: src/guiConfigureWorld.cpp:123
|
||||
msgid ""
|
||||
"Warning: Some mods are not configured yet.\n"
|
||||
"They will be enabled by default when you save the configuration. "
|
||||
msgstr ""
|
||||
"Atenção: Alguns mods ainda não estão configurados.\n"
|
||||
"Eles vão ser ativados por predefinição quando guardar a configuração. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:143
|
||||
msgid ""
|
||||
"Warning: Some configured mods are missing.\n"
|
||||
"Their setting will be removed when you save the configuration. "
|
||||
msgstr ""
|
||||
"Atenção: Alguns mods configurados estão em falta.\n"
|
||||
"As suas definições vão ser removidas quando gravar a configuração. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:208
|
||||
msgid "enabled"
|
||||
msgstr "ativo"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:194
|
||||
#: src/guiConfigureWorld.cpp:218
|
||||
msgid "Enable All"
|
||||
msgstr "Ativar Tudo"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:203
|
||||
#: src/guiConfigureWorld.cpp:227
|
||||
msgid "Disable All"
|
||||
msgstr "Desativar Tudo"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:211
|
||||
#: src/guiConfigureWorld.cpp:235
|
||||
msgid "depends on:"
|
||||
msgstr "depende de:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:224
|
||||
#: src/guiConfigureWorld.cpp:248
|
||||
msgid "is required by:"
|
||||
msgstr "é necessário pelo:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:246 src/guiCreateWorld.cpp:178
|
||||
#: src/guiConfigureWorld.cpp:270 src/guiCreateWorld.cpp:177
|
||||
#: src/guiKeyChangeMenu.cpp:195 src/keycode.cpp:223
|
||||
msgid "Cancel"
|
||||
msgstr "Cancelar"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:253 src/guiKeyChangeMenu.cpp:187
|
||||
#: src/guiConfigureWorld.cpp:277 src/guiKeyChangeMenu.cpp:187
|
||||
msgid "Save"
|
||||
msgstr "Guardar"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:374
|
||||
#: src/guiConfigureWorld.cpp:403
|
||||
msgid "Configuration saved. "
|
||||
msgstr "Configuração gravada. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:386
|
||||
#: src/guiConfigureWorld.cpp:415
|
||||
msgid "Warning: Configuration not consistent. "
|
||||
msgstr "Atenção: Configuração não compatível. "
|
||||
|
||||
|
@ -112,15 +115,15 @@ msgstr "Sim"
|
|||
msgid "No"
|
||||
msgstr "Não"
|
||||
|
||||
#: src/guiCreateWorld.cpp:123
|
||||
#: src/guiCreateWorld.cpp:125
|
||||
msgid "World name"
|
||||
msgstr "Nome do Mundo"
|
||||
|
||||
#: src/guiCreateWorld.cpp:146
|
||||
#: src/guiCreateWorld.cpp:145
|
||||
msgid "Game"
|
||||
msgstr "Jogo"
|
||||
|
||||
#: src/guiCreateWorld.cpp:170
|
||||
#: src/guiCreateWorld.cpp:169
|
||||
msgid "Create"
|
||||
msgstr "Criar"
|
||||
|
||||
|
@ -132,12 +135,12 @@ msgstr "Morreste."
|
|||
msgid "Respawn"
|
||||
msgstr "Reaparecer"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:585
|
||||
#: src/guiFormSpecMenu.cpp:582
|
||||
msgid "Left click: Move all items, Right click: Move single item"
|
||||
msgstr "Botão esq: Mover todos os itens Botão dir: Mover um item"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:611 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:133
|
||||
#: src/guiFormSpecMenu.cpp:608 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:130
|
||||
msgid "Proceed"
|
||||
msgstr "Continuar"
|
||||
|
||||
|
@ -409,23 +412,23 @@ msgstr "Não foi possível configurar mundo: Nada seleccionado"
|
|||
msgid "Failed to delete all world files"
|
||||
msgstr "Falhou a remoção de todos os ficheiros dos mundos"
|
||||
|
||||
#: src/guiPasswordChange.cpp:107
|
||||
#: src/guiPasswordChange.cpp:108
|
||||
msgid "Old Password"
|
||||
msgstr "Senha antiga"
|
||||
|
||||
#: src/guiPasswordChange.cpp:125
|
||||
#: src/guiPasswordChange.cpp:126
|
||||
msgid "New Password"
|
||||
msgstr "Senha Nova"
|
||||
|
||||
#: src/guiPasswordChange.cpp:142
|
||||
#: src/guiPasswordChange.cpp:143
|
||||
msgid "Confirm Password"
|
||||
msgstr "Confirmar Senha"
|
||||
|
||||
#: src/guiPasswordChange.cpp:160
|
||||
#: src/guiPasswordChange.cpp:161
|
||||
msgid "Change"
|
||||
msgstr "Mudar"
|
||||
|
||||
#: src/guiPasswordChange.cpp:169
|
||||
#: src/guiPasswordChange.cpp:170
|
||||
msgid "Passwords do not match!"
|
||||
msgstr "Senhas não correspondem!"
|
||||
|
||||
|
@ -475,11 +478,11 @@ msgstr ""
|
|||
"- Roda do rato: seleccionar item\n"
|
||||
"- T: conversação\n"
|
||||
|
||||
#: src/guiVolumeChange.cpp:107
|
||||
#: src/guiVolumeChange.cpp:108
|
||||
msgid "Sound Volume: "
|
||||
msgstr "Volume do som: "
|
||||
|
||||
#: src/guiVolumeChange.cpp:121
|
||||
#: src/guiVolumeChange.cpp:122
|
||||
msgid "Exit"
|
||||
msgstr "Sair"
|
||||
|
||||
|
@ -779,24 +782,24 @@ msgstr "Zoom"
|
|||
msgid "Main Menu"
|
||||
msgstr "Menu Principal"
|
||||
|
||||
#: src/main.cpp:2040
|
||||
#: src/main.cpp:2035
|
||||
msgid "Failed to initialize world"
|
||||
msgstr "Falha ao iniciar mundo"
|
||||
|
||||
#: src/main.cpp:2053
|
||||
#: src/main.cpp:2048
|
||||
msgid "No world selected and no address provided. Nothing to do."
|
||||
msgstr ""
|
||||
"Nenhum mundo seleccionado e nenhum endereço providenciado. Nada para fazer."
|
||||
|
||||
#: src/main.cpp:2061
|
||||
#: src/main.cpp:2056
|
||||
msgid "Could not find or load game \""
|
||||
msgstr "Não foi possível encontrar ou carregar jogo \""
|
||||
|
||||
#: src/main.cpp:2075
|
||||
#: src/main.cpp:2070
|
||||
msgid "Invalid gamespec."
|
||||
msgstr "gamespec inválido."
|
||||
|
||||
#: src/main.cpp:2116
|
||||
#: src/main.cpp:2111
|
||||
msgid "Connection error (timed out?)"
|
||||
msgstr "Erro de conexão (excedeu tempo?)"
|
||||
|
||||
|
@ -824,17 +827,3 @@ msgstr "Erro de conexão (excedeu tempo?)"
|
|||
#~ "- I: Inventário\n"
|
||||
#~ "- ESC: Este menu\n"
|
||||
#~ "- T: Chat\n"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some configured mods are missing.\n"
|
||||
#~ "Their setting will be removed when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "Atenção: Alguns mods configurados estão em falta.\n"
|
||||
#~ "As suas definições vão ser removidas quando gravar a configuração. "
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some mods are not configured yet.\n"
|
||||
#~ "They will be enabled by default when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "Atenção: Alguns mods ainda não estão configurados.\n"
|
||||
#~ "Eles vão ser ativados por predefinição quando guardar a configuração. "
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: minetest\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-06-24 00:07+0000\n"
|
||||
"POT-Creation-Date: 2013-05-13 18:26+0200\n"
|
||||
"PO-Revision-Date: 2013-05-15 18:58+0200\n"
|
||||
"Last-Translator: Frederico Guimarães <frederico@teia.bio.br>\n"
|
||||
"Language-Team: LANGUAGE <contato@ejweb.com.br>\n"
|
||||
|
@ -18,48 +18,35 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"X-Generator: Weblate 1.4-dev\n"
|
||||
|
||||
#: src/client.cpp:2877
|
||||
#: src/client.cpp:2846
|
||||
msgid "Item textures..."
|
||||
msgstr "Texturas dos itens..."
|
||||
|
||||
#: src/game.cpp:959
|
||||
#: src/game.cpp:912
|
||||
msgid "Loading..."
|
||||
msgstr "Carregando..."
|
||||
|
||||
#: src/game.cpp:1019
|
||||
#: src/game.cpp:972
|
||||
msgid "Creating server...."
|
||||
msgstr "Criando o servidor..."
|
||||
|
||||
#: src/game.cpp:1035
|
||||
#: src/game.cpp:988
|
||||
msgid "Creating client..."
|
||||
msgstr "Criando o cliente..."
|
||||
|
||||
#: src/game.cpp:1050
|
||||
#: src/game.cpp:1003
|
||||
msgid "Resolving address..."
|
||||
msgstr "Resolvendo os endereços..."
|
||||
|
||||
#: src/game.cpp:1126
|
||||
#: src/game.cpp:1079
|
||||
msgid "Connecting to server..."
|
||||
msgstr "Conectando ao servidor..."
|
||||
|
||||
#: src/game.cpp:1223
|
||||
#, fuzzy
|
||||
msgid "Item definitions..."
|
||||
msgstr "Texturas dos itens..."
|
||||
|
||||
#: src/game.cpp:1230
|
||||
msgid "Node definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1237
|
||||
msgid "Media..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3418
|
||||
#: src/game.cpp:3348
|
||||
msgid "Shutting down stuff..."
|
||||
msgstr "Desligando tudo..."
|
||||
|
||||
#: src/game.cpp:3448 src/guiConfigureWorld.cpp:397
|
||||
#: src/game.cpp:3378 src/guiConfigureWorld.cpp:426
|
||||
msgid ""
|
||||
"\n"
|
||||
"Check debug.txt for details."
|
||||
|
@ -67,40 +54,56 @@ msgstr ""
|
|||
"\n"
|
||||
"Verifique o debug.txt para mais detalhes."
|
||||
|
||||
#: src/guiConfigureWorld.cpp:184
|
||||
#: src/guiConfigureWorld.cpp:123
|
||||
msgid ""
|
||||
"Warning: Some mods are not configured yet.\n"
|
||||
"They will be enabled by default when you save the configuration. "
|
||||
msgstr ""
|
||||
"Atenção: Alguns mods ainda não foram configurados.\n"
|
||||
"E eles serão ativados por padrão, quando você salvar a configuração."
|
||||
|
||||
#: src/guiConfigureWorld.cpp:143
|
||||
msgid ""
|
||||
"Warning: Some configured mods are missing.\n"
|
||||
"Their setting will be removed when you save the configuration. "
|
||||
msgstr ""
|
||||
"Atenção: Alguns mods configurados não foram encontrados.\n"
|
||||
"Suas definições serão removidas quando você salvar a configuração."
|
||||
|
||||
#: src/guiConfigureWorld.cpp:208
|
||||
msgid "enabled"
|
||||
msgstr "habilitado"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:194
|
||||
#: src/guiConfigureWorld.cpp:218
|
||||
msgid "Enable All"
|
||||
msgstr "Habilitar tudo"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:203
|
||||
#: src/guiConfigureWorld.cpp:227
|
||||
msgid "Disable All"
|
||||
msgstr "Desabilitar tudo"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:211
|
||||
#: src/guiConfigureWorld.cpp:235
|
||||
msgid "depends on:"
|
||||
msgstr "depende de:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:224
|
||||
#: src/guiConfigureWorld.cpp:248
|
||||
msgid "is required by:"
|
||||
msgstr "é necessário para:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:246 src/guiCreateWorld.cpp:178
|
||||
#: src/guiConfigureWorld.cpp:270 src/guiCreateWorld.cpp:177
|
||||
#: src/guiKeyChangeMenu.cpp:195 src/keycode.cpp:223
|
||||
msgid "Cancel"
|
||||
msgstr "Cancelar"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:253 src/guiKeyChangeMenu.cpp:187
|
||||
#: src/guiConfigureWorld.cpp:277 src/guiKeyChangeMenu.cpp:187
|
||||
msgid "Save"
|
||||
msgstr "Salvar"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:374
|
||||
#: src/guiConfigureWorld.cpp:403
|
||||
msgid "Configuration saved. "
|
||||
msgstr "A configuração foi salva. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:386
|
||||
#: src/guiConfigureWorld.cpp:415
|
||||
msgid "Warning: Configuration not consistent. "
|
||||
msgstr "Atenção: A configuração não está consistente."
|
||||
|
||||
|
@ -112,15 +115,15 @@ msgstr "Sim"
|
|||
msgid "No"
|
||||
msgstr "Não"
|
||||
|
||||
#: src/guiCreateWorld.cpp:123
|
||||
#: src/guiCreateWorld.cpp:125
|
||||
msgid "World name"
|
||||
msgstr "Nome do mundo"
|
||||
|
||||
#: src/guiCreateWorld.cpp:146
|
||||
#: src/guiCreateWorld.cpp:145
|
||||
msgid "Game"
|
||||
msgstr "Jogo"
|
||||
|
||||
#: src/guiCreateWorld.cpp:170
|
||||
#: src/guiCreateWorld.cpp:169
|
||||
msgid "Create"
|
||||
msgstr "Criar"
|
||||
|
||||
|
@ -132,12 +135,12 @@ msgstr "Você morreu."
|
|||
msgid "Respawn"
|
||||
msgstr "Reviver"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:585
|
||||
#: src/guiFormSpecMenu.cpp:582
|
||||
msgid "Left click: Move all items, Right click: Move single item"
|
||||
msgstr "Botão esq.: Move todos os itens, Botão dir.: Move um item"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:611 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:133
|
||||
#: src/guiFormSpecMenu.cpp:608 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:130
|
||||
msgid "Proceed"
|
||||
msgstr "Continuar"
|
||||
|
||||
|
@ -410,23 +413,23 @@ msgstr "Não foi possível configurar o mundo: Nada foi selecionado"
|
|||
msgid "Failed to delete all world files"
|
||||
msgstr "Não foi possível excluir todos os arquivos do mundo"
|
||||
|
||||
#: src/guiPasswordChange.cpp:107
|
||||
#: src/guiPasswordChange.cpp:108
|
||||
msgid "Old Password"
|
||||
msgstr "Senha antiga"
|
||||
|
||||
#: src/guiPasswordChange.cpp:125
|
||||
#: src/guiPasswordChange.cpp:126
|
||||
msgid "New Password"
|
||||
msgstr "Nova senha"
|
||||
|
||||
#: src/guiPasswordChange.cpp:142
|
||||
#: src/guiPasswordChange.cpp:143
|
||||
msgid "Confirm Password"
|
||||
msgstr "Confirmar a senha"
|
||||
|
||||
#: src/guiPasswordChange.cpp:160
|
||||
#: src/guiPasswordChange.cpp:161
|
||||
msgid "Change"
|
||||
msgstr "Alterar"
|
||||
|
||||
#: src/guiPasswordChange.cpp:169
|
||||
#: src/guiPasswordChange.cpp:170
|
||||
msgid "Passwords do not match!"
|
||||
msgstr "As senhas não correspondem!"
|
||||
|
||||
|
@ -476,11 +479,11 @@ msgstr ""
|
|||
"- Roda do mouse: selecionar item\n"
|
||||
"- T: bate-papo\n"
|
||||
|
||||
#: src/guiVolumeChange.cpp:107
|
||||
#: src/guiVolumeChange.cpp:108
|
||||
msgid "Sound Volume: "
|
||||
msgstr "Volume do som: "
|
||||
|
||||
#: src/guiVolumeChange.cpp:121
|
||||
#: src/guiVolumeChange.cpp:122
|
||||
msgid "Exit"
|
||||
msgstr "Sair"
|
||||
|
||||
|
@ -780,25 +783,25 @@ msgstr "Zoom"
|
|||
msgid "Main Menu"
|
||||
msgstr "Menu principal"
|
||||
|
||||
#: src/main.cpp:2040
|
||||
#: src/main.cpp:2035
|
||||
msgid "Failed to initialize world"
|
||||
msgstr "Não foi possível iniciar o mundo"
|
||||
|
||||
#: src/main.cpp:2053
|
||||
#: src/main.cpp:2048
|
||||
msgid "No world selected and no address provided. Nothing to do."
|
||||
msgstr ""
|
||||
"Nenhum mundo foi selecionado e nenhum endereço fornecido. Não existe nada a "
|
||||
"ser feito."
|
||||
|
||||
#: src/main.cpp:2061
|
||||
#: src/main.cpp:2056
|
||||
msgid "Could not find or load game \""
|
||||
msgstr "Não foi possível localizar ou carregar jogo \""
|
||||
|
||||
#: src/main.cpp:2075
|
||||
#: src/main.cpp:2070
|
||||
msgid "Invalid gamespec."
|
||||
msgstr "Especificação do jogo inválida."
|
||||
|
||||
#: src/main.cpp:2116
|
||||
#: src/main.cpp:2111
|
||||
msgid "Connection error (timed out?)"
|
||||
msgstr "Erro de conexão (tempo excedido?)"
|
||||
|
||||
|
@ -826,17 +829,3 @@ msgstr "Erro de conexão (tempo excedido?)"
|
|||
#~ "- I: inventário\n"
|
||||
#~ "- ESC: este menu\n"
|
||||
#~ "- T: bate-papo\n"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some configured mods are missing.\n"
|
||||
#~ "Their setting will be removed when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "Atenção: Alguns mods configurados não foram encontrados.\n"
|
||||
#~ "Suas definições serão removidas quando você salvar a configuração."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some mods are not configured yet.\n"
|
||||
#~ "They will be enabled by default when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "Atenção: Alguns mods ainda não foram configurados.\n"
|
||||
#~ "E eles serão ativados por padrão, quando você salvar a configuração."
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: minetest\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-06-24 00:07+0000\n"
|
||||
"POT-Creation-Date: 2013-05-13 18:26+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -17,86 +17,86 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=CHARSET\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: src/client.cpp:2877
|
||||
#: src/client.cpp:2846
|
||||
msgid "Item textures..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:959
|
||||
#: src/game.cpp:912
|
||||
msgid "Loading..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1019
|
||||
#: src/game.cpp:972
|
||||
msgid "Creating server...."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1035
|
||||
#: src/game.cpp:988
|
||||
msgid "Creating client..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1050
|
||||
#: src/game.cpp:1003
|
||||
msgid "Resolving address..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1126
|
||||
#: src/game.cpp:1079
|
||||
msgid "Connecting to server..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1223
|
||||
msgid "Item definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1230
|
||||
msgid "Node definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1237
|
||||
msgid "Media..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3418
|
||||
#: src/game.cpp:3348
|
||||
msgid "Shutting down stuff..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3448 src/guiConfigureWorld.cpp:397
|
||||
#: src/game.cpp:3378 src/guiConfigureWorld.cpp:426
|
||||
msgid ""
|
||||
"\n"
|
||||
"Check debug.txt for details."
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:184
|
||||
#: src/guiConfigureWorld.cpp:123
|
||||
msgid ""
|
||||
"Warning: Some mods are not configured yet.\n"
|
||||
"They will be enabled by default when you save the configuration. "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:143
|
||||
msgid ""
|
||||
"Warning: Some configured mods are missing.\n"
|
||||
"Their setting will be removed when you save the configuration. "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:208
|
||||
msgid "enabled"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:194
|
||||
#: src/guiConfigureWorld.cpp:218
|
||||
msgid "Enable All"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:203
|
||||
#: src/guiConfigureWorld.cpp:227
|
||||
msgid "Disable All"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:211
|
||||
#: src/guiConfigureWorld.cpp:235
|
||||
msgid "depends on:"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:224
|
||||
#: src/guiConfigureWorld.cpp:248
|
||||
msgid "is required by:"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:246 src/guiCreateWorld.cpp:178
|
||||
#: src/guiConfigureWorld.cpp:270 src/guiCreateWorld.cpp:177
|
||||
#: src/guiKeyChangeMenu.cpp:195 src/keycode.cpp:223
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:253 src/guiKeyChangeMenu.cpp:187
|
||||
#: src/guiConfigureWorld.cpp:277 src/guiKeyChangeMenu.cpp:187
|
||||
msgid "Save"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:374
|
||||
#: src/guiConfigureWorld.cpp:403
|
||||
msgid "Configuration saved. "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:386
|
||||
#: src/guiConfigureWorld.cpp:415
|
||||
msgid "Warning: Configuration not consistent. "
|
||||
msgstr ""
|
||||
|
||||
|
@ -108,15 +108,15 @@ msgstr ""
|
|||
msgid "No"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiCreateWorld.cpp:123
|
||||
#: src/guiCreateWorld.cpp:125
|
||||
msgid "World name"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiCreateWorld.cpp:146
|
||||
#: src/guiCreateWorld.cpp:145
|
||||
msgid "Game"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiCreateWorld.cpp:170
|
||||
#: src/guiCreateWorld.cpp:169
|
||||
msgid "Create"
|
||||
msgstr ""
|
||||
|
||||
|
@ -128,12 +128,12 @@ msgstr ""
|
|||
msgid "Respawn"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:585
|
||||
#: src/guiFormSpecMenu.cpp:582
|
||||
msgid "Left click: Move all items, Right click: Move single item"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:611 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:133
|
||||
#: src/guiFormSpecMenu.cpp:608 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:130
|
||||
msgid "Proceed"
|
||||
msgstr ""
|
||||
|
||||
|
@ -405,23 +405,23 @@ msgstr ""
|
|||
msgid "Failed to delete all world files"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:107
|
||||
#: src/guiPasswordChange.cpp:108
|
||||
msgid "Old Password"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:125
|
||||
#: src/guiPasswordChange.cpp:126
|
||||
msgid "New Password"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:142
|
||||
#: src/guiPasswordChange.cpp:143
|
||||
msgid "Confirm Password"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:160
|
||||
#: src/guiPasswordChange.cpp:161
|
||||
msgid "Change"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:169
|
||||
#: src/guiPasswordChange.cpp:170
|
||||
msgid "Passwords do not match!"
|
||||
msgstr ""
|
||||
|
||||
|
@ -460,11 +460,11 @@ msgid ""
|
|||
"- T: chat\n"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiVolumeChange.cpp:107
|
||||
#: src/guiVolumeChange.cpp:108
|
||||
msgid "Sound Volume: "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiVolumeChange.cpp:121
|
||||
#: src/guiVolumeChange.cpp:122
|
||||
msgid "Exit"
|
||||
msgstr ""
|
||||
|
||||
|
@ -764,22 +764,22 @@ msgstr ""
|
|||
msgid "Main Menu"
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2040
|
||||
#: src/main.cpp:2035
|
||||
msgid "Failed to initialize world"
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2053
|
||||
#: src/main.cpp:2048
|
||||
msgid "No world selected and no address provided. Nothing to do."
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2061
|
||||
#: src/main.cpp:2056
|
||||
msgid "Could not find or load game \""
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2075
|
||||
#: src/main.cpp:2070
|
||||
msgid "Invalid gamespec."
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2116
|
||||
#: src/main.cpp:2111
|
||||
msgid "Connection error (timed out?)"
|
||||
msgstr ""
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: minetest\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-06-24 00:07+0000\n"
|
||||
"POT-Creation-Date: 2013-05-13 18:26+0200\n"
|
||||
"PO-Revision-Date: 2013-05-08 11:06+0200\n"
|
||||
"Last-Translator: Anton Tsyganenko <anton-tsyganenko@yandex.ru>\n"
|
||||
"Language-Team: Russian\n"
|
||||
|
@ -19,47 +19,35 @@ msgstr ""
|
|||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
"X-Generator: Weblate 1.4-dev\n"
|
||||
|
||||
#: src/client.cpp:2877
|
||||
#: src/client.cpp:2846
|
||||
msgid "Item textures..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:959
|
||||
#: src/game.cpp:912
|
||||
msgid "Loading..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1019
|
||||
#: src/game.cpp:972
|
||||
msgid "Creating server...."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1035
|
||||
#: src/game.cpp:988
|
||||
msgid "Creating client..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1050
|
||||
#: src/game.cpp:1003
|
||||
msgid "Resolving address..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1126
|
||||
#: src/game.cpp:1079
|
||||
msgid "Connecting to server..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1223
|
||||
msgid "Item definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1230
|
||||
msgid "Node definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1237
|
||||
msgid "Media..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3418
|
||||
#: src/game.cpp:3348
|
||||
msgid "Shutting down stuff..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3448 src/guiConfigureWorld.cpp:397
|
||||
#: src/game.cpp:3378 src/guiConfigureWorld.cpp:426
|
||||
msgid ""
|
||||
"\n"
|
||||
"Check debug.txt for details."
|
||||
|
@ -67,40 +55,57 @@ msgstr ""
|
|||
"\n"
|
||||
"Подробная информация в debug.txt."
|
||||
|
||||
#: src/guiConfigureWorld.cpp:184
|
||||
#: src/guiConfigureWorld.cpp:123
|
||||
msgid ""
|
||||
"Warning: Some mods are not configured yet.\n"
|
||||
"They will be enabled by default when you save the configuration. "
|
||||
msgstr ""
|
||||
"Предупреждение: Некоторые моды еще не настроены.\n"
|
||||
"Их стандартные настройки будут установлены, когда вы сохраните "
|
||||
"конфигурацию. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:143
|
||||
msgid ""
|
||||
"Warning: Some configured mods are missing.\n"
|
||||
"Their setting will be removed when you save the configuration. "
|
||||
msgstr ""
|
||||
"Предупреждение: Некоторые моды не найдены.\n"
|
||||
"Их настройки будут удалены, когда вы сохраните конфигурацию. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:208
|
||||
msgid "enabled"
|
||||
msgstr "включено"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:194
|
||||
#: src/guiConfigureWorld.cpp:218
|
||||
msgid "Enable All"
|
||||
msgstr "Включить Всё"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:203
|
||||
#: src/guiConfigureWorld.cpp:227
|
||||
msgid "Disable All"
|
||||
msgstr "Отключить Всё"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:211
|
||||
#: src/guiConfigureWorld.cpp:235
|
||||
msgid "depends on:"
|
||||
msgstr "зависит от:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:224
|
||||
#: src/guiConfigureWorld.cpp:248
|
||||
msgid "is required by:"
|
||||
msgstr "требуется для:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:246 src/guiCreateWorld.cpp:178
|
||||
#: src/guiConfigureWorld.cpp:270 src/guiCreateWorld.cpp:177
|
||||
#: src/guiKeyChangeMenu.cpp:195 src/keycode.cpp:223
|
||||
msgid "Cancel"
|
||||
msgstr "Отменить"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:253 src/guiKeyChangeMenu.cpp:187
|
||||
#: src/guiConfigureWorld.cpp:277 src/guiKeyChangeMenu.cpp:187
|
||||
msgid "Save"
|
||||
msgstr "Сохранить"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:374
|
||||
#: src/guiConfigureWorld.cpp:403
|
||||
msgid "Configuration saved. "
|
||||
msgstr "Настройки сохранены. "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:386
|
||||
#: src/guiConfigureWorld.cpp:415
|
||||
msgid "Warning: Configuration not consistent. "
|
||||
msgstr "Предупреждение: Неверная конфигурация. "
|
||||
|
||||
|
@ -112,15 +117,15 @@ msgstr "Да"
|
|||
msgid "No"
|
||||
msgstr "Нет"
|
||||
|
||||
#: src/guiCreateWorld.cpp:123
|
||||
#: src/guiCreateWorld.cpp:125
|
||||
msgid "World name"
|
||||
msgstr "Название мира"
|
||||
|
||||
#: src/guiCreateWorld.cpp:146
|
||||
#: src/guiCreateWorld.cpp:145
|
||||
msgid "Game"
|
||||
msgstr "Игра"
|
||||
|
||||
#: src/guiCreateWorld.cpp:170
|
||||
#: src/guiCreateWorld.cpp:169
|
||||
msgid "Create"
|
||||
msgstr "Создать"
|
||||
|
||||
|
@ -132,12 +137,12 @@ msgstr "Вы умерли."
|
|||
msgid "Respawn"
|
||||
msgstr "Возродиться"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:585
|
||||
#: src/guiFormSpecMenu.cpp:582
|
||||
msgid "Left click: Move all items, Right click: Move single item"
|
||||
msgstr "ЛКМ: Переместить все предметы, ПКМ: Переместить один предмет"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:611 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:133
|
||||
#: src/guiFormSpecMenu.cpp:608 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:130
|
||||
msgid "Proceed"
|
||||
msgstr "Продолжить"
|
||||
|
||||
|
@ -412,23 +417,23 @@ msgstr "Невозможно настроить мир: ничего не выб
|
|||
msgid "Failed to delete all world files"
|
||||
msgstr "Ошибка при удалении файлов мира"
|
||||
|
||||
#: src/guiPasswordChange.cpp:107
|
||||
#: src/guiPasswordChange.cpp:108
|
||||
msgid "Old Password"
|
||||
msgstr "Старый Пароль"
|
||||
|
||||
#: src/guiPasswordChange.cpp:125
|
||||
#: src/guiPasswordChange.cpp:126
|
||||
msgid "New Password"
|
||||
msgstr "Новый Пароль"
|
||||
|
||||
#: src/guiPasswordChange.cpp:142
|
||||
#: src/guiPasswordChange.cpp:143
|
||||
msgid "Confirm Password"
|
||||
msgstr "Подтверждение Пароля"
|
||||
|
||||
#: src/guiPasswordChange.cpp:160
|
||||
#: src/guiPasswordChange.cpp:161
|
||||
msgid "Change"
|
||||
msgstr "Изменить"
|
||||
|
||||
#: src/guiPasswordChange.cpp:169
|
||||
#: src/guiPasswordChange.cpp:170
|
||||
msgid "Passwords do not match!"
|
||||
msgstr "Пароли не совпадают!"
|
||||
|
||||
|
@ -467,11 +472,11 @@ msgid ""
|
|||
"- T: chat\n"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiVolumeChange.cpp:107
|
||||
#: src/guiVolumeChange.cpp:108
|
||||
msgid "Sound Volume: "
|
||||
msgstr "Громкость Звука: "
|
||||
|
||||
#: src/guiVolumeChange.cpp:121
|
||||
#: src/guiVolumeChange.cpp:122
|
||||
msgid "Exit"
|
||||
msgstr "Выход"
|
||||
|
||||
|
@ -778,24 +783,24 @@ msgstr "Масштаб"
|
|||
msgid "Main Menu"
|
||||
msgstr "Главное Меню"
|
||||
|
||||
#: src/main.cpp:2040
|
||||
#: src/main.cpp:2035
|
||||
msgid "Failed to initialize world"
|
||||
msgstr "Ошибка при инициализации мира"
|
||||
|
||||
#: src/main.cpp:2053
|
||||
#: src/main.cpp:2048
|
||||
msgid "No world selected and no address provided. Nothing to do."
|
||||
msgstr "Не выбран мир и не введен адрес."
|
||||
|
||||
#: src/main.cpp:2061
|
||||
#: src/main.cpp:2056
|
||||
msgid "Could not find or load game \""
|
||||
msgstr "Невозможно найти или загрузить игру \""
|
||||
|
||||
#: src/main.cpp:2075
|
||||
#: src/main.cpp:2070
|
||||
#, fuzzy
|
||||
msgid "Invalid gamespec."
|
||||
msgstr "Неправильная конфигурация игры."
|
||||
|
||||
#: src/main.cpp:2116
|
||||
#: src/main.cpp:2111
|
||||
msgid "Connection error (timed out?)"
|
||||
msgstr "Ошибка соединения (таймаут пинга?)"
|
||||
|
||||
|
@ -823,18 +828,3 @@ msgstr "Ошибка соединения (таймаут пинга?)"
|
|||
#~ "- I: инвентарь\n"
|
||||
#~ "- ESC: это меню\n"
|
||||
#~ "- T: чат\n"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some configured mods are missing.\n"
|
||||
#~ "Their setting will be removed when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "Предупреждение: Некоторые моды не найдены.\n"
|
||||
#~ "Их настройки будут удалены, когда вы сохраните конфигурацию. "
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some mods are not configured yet.\n"
|
||||
#~ "They will be enabled by default when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "Предупреждение: Некоторые моды еще не настроены.\n"
|
||||
#~ "Их стандартные настройки будут установлены, когда вы сохраните "
|
||||
#~ "конфигурацию. "
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: minetest\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-06-24 00:07+0000\n"
|
||||
"POT-Creation-Date: 2013-05-13 18:26+0200\n"
|
||||
"PO-Revision-Date: 2013-04-23 17:00+0200\n"
|
||||
"Last-Translator: ?????? ???????? <Martin_Devil@mail.ru>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -19,88 +19,86 @@ msgstr ""
|
|||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
"X-Generator: Weblate 1.4-dev\n"
|
||||
|
||||
#: src/client.cpp:2877
|
||||
#: src/client.cpp:2846
|
||||
msgid "Item textures..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:959
|
||||
#: src/game.cpp:912
|
||||
msgid "Loading..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1019
|
||||
#: src/game.cpp:972
|
||||
msgid "Creating server...."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1035
|
||||
#: src/game.cpp:988
|
||||
msgid "Creating client..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1050
|
||||
#: src/game.cpp:1003
|
||||
msgid "Resolving address..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1126
|
||||
#: src/game.cpp:1079
|
||||
msgid "Connecting to server..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1223
|
||||
msgid "Item definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1230
|
||||
msgid "Node definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1237
|
||||
msgid "Media..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3418
|
||||
#: src/game.cpp:3348
|
||||
msgid "Shutting down stuff..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3448 src/guiConfigureWorld.cpp:397
|
||||
#: src/game.cpp:3378 src/guiConfigureWorld.cpp:426
|
||||
msgid ""
|
||||
"\n"
|
||||
"Check debug.txt for details."
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Деталі у файлі debug.txt."
|
||||
msgstr "\nДеталі у файлі debug.txt."
|
||||
|
||||
#: src/guiConfigureWorld.cpp:184
|
||||
#: src/guiConfigureWorld.cpp:123
|
||||
msgid ""
|
||||
"Warning: Some mods are not configured yet.\n"
|
||||
"They will be enabled by default when you save the configuration. "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:143
|
||||
msgid ""
|
||||
"Warning: Some configured mods are missing.\n"
|
||||
"Their setting will be removed when you save the configuration. "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:208
|
||||
msgid "enabled"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:194
|
||||
#: src/guiConfigureWorld.cpp:218
|
||||
msgid "Enable All"
|
||||
msgstr "Увімкнути Все"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:203
|
||||
#: src/guiConfigureWorld.cpp:227
|
||||
msgid "Disable All"
|
||||
msgstr "Вимкнути Усе"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:211
|
||||
#: src/guiConfigureWorld.cpp:235
|
||||
msgid "depends on:"
|
||||
msgstr "залежить від:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:224
|
||||
#: src/guiConfigureWorld.cpp:248
|
||||
msgid "is required by:"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:246 src/guiCreateWorld.cpp:178
|
||||
#: src/guiConfigureWorld.cpp:270 src/guiCreateWorld.cpp:177
|
||||
#: src/guiKeyChangeMenu.cpp:195 src/keycode.cpp:223
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiConfigureWorld.cpp:253 src/guiKeyChangeMenu.cpp:187
|
||||
#: src/guiConfigureWorld.cpp:277 src/guiKeyChangeMenu.cpp:187
|
||||
msgid "Save"
|
||||
msgstr "Зберегти"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:374
|
||||
#: src/guiConfigureWorld.cpp:403
|
||||
msgid "Configuration saved. "
|
||||
msgstr "Налаштування Збережено!"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:386
|
||||
#: src/guiConfigureWorld.cpp:415
|
||||
msgid "Warning: Configuration not consistent. "
|
||||
msgstr "Попередження: Помилкова конфігурація."
|
||||
|
||||
|
@ -112,15 +110,15 @@ msgstr ""
|
|||
msgid "No"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiCreateWorld.cpp:123
|
||||
#: src/guiCreateWorld.cpp:125
|
||||
msgid "World name"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiCreateWorld.cpp:146
|
||||
#: src/guiCreateWorld.cpp:145
|
||||
msgid "Game"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiCreateWorld.cpp:170
|
||||
#: src/guiCreateWorld.cpp:169
|
||||
msgid "Create"
|
||||
msgstr ""
|
||||
|
||||
|
@ -132,12 +130,12 @@ msgstr ""
|
|||
msgid "Respawn"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:585
|
||||
#: src/guiFormSpecMenu.cpp:582
|
||||
msgid "Left click: Move all items, Right click: Move single item"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:611 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:133
|
||||
#: src/guiFormSpecMenu.cpp:608 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:130
|
||||
msgid "Proceed"
|
||||
msgstr ""
|
||||
|
||||
|
@ -409,23 +407,23 @@ msgstr ""
|
|||
msgid "Failed to delete all world files"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:107
|
||||
#: src/guiPasswordChange.cpp:108
|
||||
msgid "Old Password"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:125
|
||||
#: src/guiPasswordChange.cpp:126
|
||||
msgid "New Password"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:142
|
||||
#: src/guiPasswordChange.cpp:143
|
||||
msgid "Confirm Password"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:160
|
||||
#: src/guiPasswordChange.cpp:161
|
||||
msgid "Change"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiPasswordChange.cpp:169
|
||||
#: src/guiPasswordChange.cpp:170
|
||||
msgid "Passwords do not match!"
|
||||
msgstr ""
|
||||
|
||||
|
@ -464,11 +462,11 @@ msgid ""
|
|||
"- T: chat\n"
|
||||
msgstr ""
|
||||
|
||||
#: src/guiVolumeChange.cpp:107
|
||||
#: src/guiVolumeChange.cpp:108
|
||||
msgid "Sound Volume: "
|
||||
msgstr ""
|
||||
|
||||
#: src/guiVolumeChange.cpp:121
|
||||
#: src/guiVolumeChange.cpp:122
|
||||
msgid "Exit"
|
||||
msgstr ""
|
||||
|
||||
|
@ -768,22 +766,22 @@ msgstr ""
|
|||
msgid "Main Menu"
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2040
|
||||
#: src/main.cpp:2035
|
||||
msgid "Failed to initialize world"
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2053
|
||||
#: src/main.cpp:2048
|
||||
msgid "No world selected and no address provided. Nothing to do."
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2061
|
||||
#: src/main.cpp:2056
|
||||
msgid "Could not find or load game \""
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2075
|
||||
#: src/main.cpp:2070
|
||||
msgid "Invalid gamespec."
|
||||
msgstr ""
|
||||
|
||||
#: src/main.cpp:2116
|
||||
#: src/main.cpp:2111
|
||||
msgid "Connection error (timed out?)"
|
||||
msgstr ""
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: minetest\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-06-24 00:07+0000\n"
|
||||
"POT-Creation-Date: 2013-05-13 18:26+0200\n"
|
||||
"PO-Revision-Date: 2013-05-18 16:23+0200\n"
|
||||
"Last-Translator: Shen Zheyu <arsdragonfly@gmail.com>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -18,48 +18,35 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 1.4-dev\n"
|
||||
|
||||
#: src/client.cpp:2877
|
||||
#: src/client.cpp:2846
|
||||
msgid "Item textures..."
|
||||
msgstr "物品材质..."
|
||||
|
||||
#: src/game.cpp:959
|
||||
#: src/game.cpp:912
|
||||
msgid "Loading..."
|
||||
msgstr "载入中..."
|
||||
|
||||
#: src/game.cpp:1019
|
||||
#: src/game.cpp:972
|
||||
msgid "Creating server...."
|
||||
msgstr "正在建立服务器...."
|
||||
|
||||
#: src/game.cpp:1035
|
||||
#: src/game.cpp:988
|
||||
msgid "Creating client..."
|
||||
msgstr "正在建立客户端..."
|
||||
|
||||
#: src/game.cpp:1050
|
||||
#: src/game.cpp:1003
|
||||
msgid "Resolving address..."
|
||||
msgstr "正在解析地址..."
|
||||
|
||||
#: src/game.cpp:1126
|
||||
#: src/game.cpp:1079
|
||||
msgid "Connecting to server..."
|
||||
msgstr "正在连接服务器..."
|
||||
|
||||
#: src/game.cpp:1223
|
||||
#, fuzzy
|
||||
msgid "Item definitions..."
|
||||
msgstr "物品材质..."
|
||||
|
||||
#: src/game.cpp:1230
|
||||
msgid "Node definitions..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:1237
|
||||
msgid "Media..."
|
||||
msgstr ""
|
||||
|
||||
#: src/game.cpp:3418
|
||||
#: src/game.cpp:3348
|
||||
msgid "Shutting down stuff..."
|
||||
msgstr "关闭中......"
|
||||
|
||||
#: src/game.cpp:3448 src/guiConfigureWorld.cpp:397
|
||||
#: src/game.cpp:3378 src/guiConfigureWorld.cpp:426
|
||||
msgid ""
|
||||
"\n"
|
||||
"Check debug.txt for details."
|
||||
|
@ -67,40 +54,56 @@ msgstr ""
|
|||
"\n"
|
||||
"查看 debug.txt 以获得详细信息。"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:184
|
||||
#: src/guiConfigureWorld.cpp:123
|
||||
msgid ""
|
||||
"Warning: Some mods are not configured yet.\n"
|
||||
"They will be enabled by default when you save the configuration. "
|
||||
msgstr ""
|
||||
"警告:一些MOD仍未设定。\n"
|
||||
"它们会在你保存配置的时候自动启用。 "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:143
|
||||
msgid ""
|
||||
"Warning: Some configured mods are missing.\n"
|
||||
"Their setting will be removed when you save the configuration. "
|
||||
msgstr ""
|
||||
"警告:缺少一些设定了的MOD。\n"
|
||||
"它们的设置会在你保存配置的时候被移除。 "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:208
|
||||
msgid "enabled"
|
||||
msgstr "启用"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:194
|
||||
#: src/guiConfigureWorld.cpp:218
|
||||
msgid "Enable All"
|
||||
msgstr "全部启用"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:203
|
||||
#: src/guiConfigureWorld.cpp:227
|
||||
msgid "Disable All"
|
||||
msgstr "全部禁用"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:211
|
||||
#: src/guiConfigureWorld.cpp:235
|
||||
msgid "depends on:"
|
||||
msgstr "依赖于:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:224
|
||||
#: src/guiConfigureWorld.cpp:248
|
||||
msgid "is required by:"
|
||||
msgstr "被需要:"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:246 src/guiCreateWorld.cpp:178
|
||||
#: src/guiConfigureWorld.cpp:270 src/guiCreateWorld.cpp:177
|
||||
#: src/guiKeyChangeMenu.cpp:195 src/keycode.cpp:223
|
||||
msgid "Cancel"
|
||||
msgstr "取消"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:253 src/guiKeyChangeMenu.cpp:187
|
||||
#: src/guiConfigureWorld.cpp:277 src/guiKeyChangeMenu.cpp:187
|
||||
msgid "Save"
|
||||
msgstr "保存"
|
||||
|
||||
#: src/guiConfigureWorld.cpp:374
|
||||
#: src/guiConfigureWorld.cpp:403
|
||||
msgid "Configuration saved. "
|
||||
msgstr "配置已保存。 "
|
||||
|
||||
#: src/guiConfigureWorld.cpp:386
|
||||
#: src/guiConfigureWorld.cpp:415
|
||||
msgid "Warning: Configuration not consistent. "
|
||||
msgstr "警告:配置不一致。 "
|
||||
|
||||
|
@ -112,15 +115,15 @@ msgstr "是"
|
|||
msgid "No"
|
||||
msgstr "否"
|
||||
|
||||
#: src/guiCreateWorld.cpp:123
|
||||
#: src/guiCreateWorld.cpp:125
|
||||
msgid "World name"
|
||||
msgstr "世界名称"
|
||||
|
||||
#: src/guiCreateWorld.cpp:146
|
||||
#: src/guiCreateWorld.cpp:145
|
||||
msgid "Game"
|
||||
msgstr "游戏"
|
||||
|
||||
#: src/guiCreateWorld.cpp:170
|
||||
#: src/guiCreateWorld.cpp:169
|
||||
msgid "Create"
|
||||
msgstr "创建"
|
||||
|
||||
|
@ -132,12 +135,12 @@ msgstr "你死了。"
|
|||
msgid "Respawn"
|
||||
msgstr "重生"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:585
|
||||
#: src/guiFormSpecMenu.cpp:582
|
||||
msgid "Left click: Move all items, Right click: Move single item"
|
||||
msgstr "左键:移动所有物品,右键:移动单个物品"
|
||||
|
||||
#: src/guiFormSpecMenu.cpp:611 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:133
|
||||
#: src/guiFormSpecMenu.cpp:608 src/guiMessageMenu.cpp:107
|
||||
#: src/guiTextInputMenu.cpp:130
|
||||
msgid "Proceed"
|
||||
msgstr "继续游戏"
|
||||
|
||||
|
@ -409,23 +412,23 @@ msgstr "无法配置世界:没有选择世界"
|
|||
msgid "Failed to delete all world files"
|
||||
msgstr "无法删除所有该世界的文件"
|
||||
|
||||
#: src/guiPasswordChange.cpp:107
|
||||
#: src/guiPasswordChange.cpp:108
|
||||
msgid "Old Password"
|
||||
msgstr "旧密码"
|
||||
|
||||
#: src/guiPasswordChange.cpp:125
|
||||
#: src/guiPasswordChange.cpp:126
|
||||
msgid "New Password"
|
||||
msgstr "新密码"
|
||||
|
||||
#: src/guiPasswordChange.cpp:142
|
||||
#: src/guiPasswordChange.cpp:143
|
||||
msgid "Confirm Password"
|
||||
msgstr "确认密码"
|
||||
|
||||
#: src/guiPasswordChange.cpp:160
|
||||
#: src/guiPasswordChange.cpp:161
|
||||
msgid "Change"
|
||||
msgstr "更改"
|
||||
|
||||
#: src/guiPasswordChange.cpp:169
|
||||
#: src/guiPasswordChange.cpp:170
|
||||
msgid "Passwords do not match!"
|
||||
msgstr "密码不匹配!"
|
||||
|
||||
|
@ -475,11 +478,11 @@ msgstr ""
|
|||
"鼠标滚轮: 选择物品\n"
|
||||
"T: 聊天\n"
|
||||
|
||||
#: src/guiVolumeChange.cpp:107
|
||||
#: src/guiVolumeChange.cpp:108
|
||||
msgid "Sound Volume: "
|
||||
msgstr "音量: "
|
||||
|
||||
#: src/guiVolumeChange.cpp:121
|
||||
#: src/guiVolumeChange.cpp:122
|
||||
msgid "Exit"
|
||||
msgstr "退出"
|
||||
|
||||
|
@ -779,23 +782,23 @@ msgstr "缩放"
|
|||
msgid "Main Menu"
|
||||
msgstr "主菜单"
|
||||
|
||||
#: src/main.cpp:2040
|
||||
#: src/main.cpp:2035
|
||||
msgid "Failed to initialize world"
|
||||
msgstr "无法初始化世界"
|
||||
|
||||
#: src/main.cpp:2053
|
||||
#: src/main.cpp:2048
|
||||
msgid "No world selected and no address provided. Nothing to do."
|
||||
msgstr "没有选择世界或提供地址。未执行操作。"
|
||||
|
||||
#: src/main.cpp:2061
|
||||
#: src/main.cpp:2056
|
||||
msgid "Could not find or load game \""
|
||||
msgstr "无法找到或载入游戏模式“"
|
||||
|
||||
#: src/main.cpp:2075
|
||||
#: src/main.cpp:2070
|
||||
msgid "Invalid gamespec."
|
||||
msgstr "非法游戏模式规格。"
|
||||
|
||||
#: src/main.cpp:2116
|
||||
#: src/main.cpp:2111
|
||||
msgid "Connection error (timed out?)"
|
||||
msgstr "连接出错(超时?)"
|
||||
|
||||
|
@ -824,17 +827,3 @@ msgstr "连接出错(超时?)"
|
|||
#~ "I:物品栏\n"
|
||||
#~ "ESC:菜单\n"
|
||||
#~ "T:聊天\n"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some configured mods are missing.\n"
|
||||
#~ "Their setting will be removed when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "警告:缺少一些设定了的MOD。\n"
|
||||
#~ "它们的设置会在你保存配置的时候被移除。 "
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Warning: Some mods are not configured yet.\n"
|
||||
#~ "They will be enabled by default when you save the configuration. "
|
||||
#~ msgstr ""
|
||||
#~ "警告:一些MOD仍未设定。\n"
|
||||
#~ "它们会在你保存配置的时候自动启用。 "
|
||||
|
|
|
@ -271,7 +271,6 @@ set(common_SRCS
|
|||
staticobject.cpp
|
||||
serverlist.cpp
|
||||
pathfinder.cpp
|
||||
convert_json.cpp
|
||||
${SCRIPT_SRCS}
|
||||
${UTIL_SRCS}
|
||||
)
|
||||
|
@ -314,6 +313,7 @@ set(minetest_SRCS
|
|||
clientobject.cpp
|
||||
chat.cpp
|
||||
hud.cpp
|
||||
guiMainMenu.cpp
|
||||
guiKeyChangeMenu.cpp
|
||||
guiMessageMenu.cpp
|
||||
guiTextInputMenu.cpp
|
||||
|
@ -323,16 +323,15 @@ set(minetest_SRCS
|
|||
guiVolumeChange.cpp
|
||||
guiDeathScreen.cpp
|
||||
guiChatConsole.cpp
|
||||
guiCreateWorld.cpp
|
||||
guiConfigureWorld.cpp
|
||||
guiConfirmMenu.cpp
|
||||
client.cpp
|
||||
filecache.cpp
|
||||
tile.cpp
|
||||
shader.cpp
|
||||
game.cpp
|
||||
main.cpp
|
||||
guiEngine.cpp
|
||||
guiLuaApi.cpp
|
||||
guiFileSelectMenu.cpp
|
||||
convert_json.cpp
|
||||
)
|
||||
|
||||
if(USE_FREETYPE)
|
||||
|
|
|
@ -41,21 +41,11 @@ BiomeDefManager::BiomeDefManager() {
|
|||
b->id = 0;
|
||||
b->name = "Default";
|
||||
b->flags = 0;
|
||||
|
||||
b->depth_top = 0;
|
||||
b->depth_filler = 0;
|
||||
|
||||
b->nname_top = "air";
|
||||
b->nname_filler = "air";
|
||||
b->nname_water = "mapgen_water_source";
|
||||
b->nname_dust = "air";
|
||||
b->nname_dust_water = "mapgen_water_source";
|
||||
|
||||
b->c_top = CONTENT_IGNORE;
|
||||
b->c_filler = CONTENT_IGNORE;
|
||||
b->c_water = CONTENT_IGNORE;
|
||||
b->c_dust = CONTENT_IGNORE;
|
||||
b->c_dust_water = CONTENT_IGNORE;
|
||||
b->c_top = CONTENT_AIR;
|
||||
b->top_depth = 0;
|
||||
b->c_filler = b->c_top;
|
||||
b->filler_height = MAP_GENERATION_LIMIT;
|
||||
|
||||
b->height_min = -MAP_GENERATION_LIMIT;
|
||||
b->height_max = MAP_GENERATION_LIMIT;
|
||||
|
@ -111,42 +101,27 @@ void BiomeDefManager::resolveNodeNames(INodeDefManager *ndef) {
|
|||
|
||||
biome_registration_finished = true;
|
||||
|
||||
for (size_t i = 0; i < biomes.size(); i++) {
|
||||
for (size_t i = 0; i != biomes.size(); i++) {
|
||||
b = biomes[i];
|
||||
|
||||
b->c_top = ndef->getId(b->nname_top);
|
||||
|
||||
if (b->c_top == CONTENT_IGNORE) {
|
||||
errorstream << "BiomeDefManager::resolveNodeNames: node '"
|
||||
<< b->nname_top << "' not defined" << std::endl;
|
||||
b->c_top = CONTENT_AIR;
|
||||
b->depth_top = 0;
|
||||
b->c_top = ndef->getId(b->top_nodename);
|
||||
if (b->c_top == CONTENT_IGNORE) {
|
||||
errorstream << "BiomeDefManager::resolveNodeNames: node '"
|
||||
<< b->top_nodename << "' not defined" << std::endl;
|
||||
b->c_top = CONTENT_AIR;
|
||||
b->top_depth = 0;
|
||||
}
|
||||
}
|
||||
|
||||
b->c_filler = ndef->getId(b->nname_filler);
|
||||
|
||||
if (b->c_filler == CONTENT_IGNORE) {
|
||||
errorstream << "BiomeDefManager::resolveNodeNames: node '"
|
||||
<< b->nname_filler << "' not defined" << std::endl;
|
||||
b->c_filler = CONTENT_AIR;
|
||||
b->depth_filler = 0;
|
||||
}
|
||||
|
||||
b->c_water = ndef->getId(b->nname_water);
|
||||
if (b->c_water == CONTENT_IGNORE) {
|
||||
errorstream << "BiomeDefManager::resolveNodeNames: node '"
|
||||
<< b->nname_water << "' not defined" << std::endl;
|
||||
b->c_water = CONTENT_AIR;
|
||||
}
|
||||
|
||||
b->c_dust = ndef->getId(b->nname_dust);
|
||||
if (b->c_dust == CONTENT_IGNORE) {
|
||||
errorstream << "BiomeDefManager::resolveNodeNames: node '"
|
||||
<< b->nname_dust << "' not defined" << std::endl;
|
||||
}
|
||||
|
||||
b->c_dust_water = ndef->getId(b->nname_dust_water);
|
||||
if (b->c_dust_water == CONTENT_IGNORE) {
|
||||
errorstream << "BiomeDefManager::resolveNodeNames: node '"
|
||||
<< b->nname_dust_water << "' not defined" << std::endl;
|
||||
b->c_filler = ndef->getId(b->filler_nodename);
|
||||
if (b->c_filler == CONTENT_IGNORE) {
|
||||
errorstream << "BiomeDefManager::resolveNodeNames: node '"
|
||||
<< b->filler_nodename << "' not defined" << std::endl;
|
||||
b->c_filler = CONTENT_AIR;
|
||||
b->filler_height = MAP_GENERATION_LIMIT;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
16
src/biome.h
16
src/biome.h
|
@ -45,20 +45,14 @@ public:
|
|||
std::string name;
|
||||
u32 flags;
|
||||
|
||||
std::string nname_top;
|
||||
std::string nname_filler;
|
||||
std::string nname_water;
|
||||
std::string nname_dust;
|
||||
std::string nname_dust_water;
|
||||
std::string top_nodename;
|
||||
std::string filler_nodename;
|
||||
|
||||
content_t c_top;
|
||||
s16 top_depth;
|
||||
|
||||
content_t c_filler;
|
||||
content_t c_water;
|
||||
content_t c_dust;
|
||||
content_t c_dust_water;
|
||||
|
||||
s16 depth_top;
|
||||
s16 depth_filler;
|
||||
s16 filler_height;
|
||||
|
||||
s16 height_min;
|
||||
s16 height_max;
|
||||
|
|
|
@ -24,12 +24,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#include "mapgen_v7.h"
|
||||
#include "cavegen.h"
|
||||
|
||||
NoiseParams nparams_caveliquids =
|
||||
{0, 1, v3f(150.0, 150.0, 150.0), 776, 3, 0.6};
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
CaveV6::CaveV6(MapgenV6 *mg, PseudoRandom *ps, PseudoRandom *ps2, bool is_large_cave) {
|
||||
this->mg = mg;
|
||||
|
@ -275,8 +269,6 @@ CaveV7::CaveV7(MapgenV7 *mg, PseudoRandom *ps, bool is_large_cave) {
|
|||
this->ps = ps;
|
||||
this->c_water_source = mg->c_water_source;
|
||||
this->c_lava_source = mg->c_lava_source;
|
||||
this->c_ice = mg->c_ice;
|
||||
this->np_caveliquids = &nparams_caveliquids;
|
||||
|
||||
dswitchint = ps->range(1, 14);
|
||||
flooded = ps->range(1, 2) == 2;
|
||||
|
@ -311,7 +303,7 @@ void CaveV7::makeCave(v3s16 nmin, v3s16 nmax, int max_stone_height) {
|
|||
// Allow a bit more
|
||||
//(this should be more than the maximum radius of the tunnel)
|
||||
s16 insure = 10;
|
||||
s16 more = MYMAX(MAP_BLOCKSIZE - max_tunnel_diameter / 2 - insure, 1);
|
||||
s16 more = MAP_BLOCKSIZE - max_tunnel_diameter / 2 - insure;
|
||||
ar += v3s16(1,0,1) * more * 2;
|
||||
of -= v3s16(1,0,1) * more;
|
||||
|
||||
|
@ -455,9 +447,8 @@ void CaveV7::makeTunnel(bool dirswitch) {
|
|||
bool randomize_xz = (ps->range(1, 2) == 1);
|
||||
|
||||
// Make a ravine every once in a while if it's long enough
|
||||
//float xylen = vec.X * vec.X + vec.Z * vec.Z;
|
||||
//disable ravines for now
|
||||
bool is_ravine = false; //(xylen > 500.0) && !large_cave && (ps->range(1, 8) == 1);
|
||||
float xylen = vec.X * vec.X + vec.Z * vec.Z;
|
||||
bool is_ravine = (xylen > 500.0) && !large_cave && (ps->range(1, 8) == 1);
|
||||
|
||||
// Carve routes
|
||||
for (float f = 0; f < 1.0; f += 1.0 / veclen)
|
||||
|
@ -471,14 +462,11 @@ void CaveV7::carveRoute(v3f vec, float f, bool randomize_xz, bool is_ravine) {
|
|||
MapNode airnode(CONTENT_AIR);
|
||||
MapNode waternode(c_water_source);
|
||||
MapNode lavanode(c_lava_source);
|
||||
MapNode liquidnode = ps->range(0, 4) ? lavanode : waternode;
|
||||
|
||||
v3s16 startp(orp.X, orp.Y, orp.Z);
|
||||
startp += of;
|
||||
|
||||
float nval = NoisePerlin3D(np_caveliquids, startp.X,
|
||||
startp.Y, startp.Z, mg->seed);
|
||||
MapNode liquidnode = nval < 0.40 ? lavanode : waternode;
|
||||
|
||||
v3f fp = orp + vec * f;
|
||||
fp.X += 0.1 * ps->range(-10, 10);
|
||||
fp.Z += 0.1 * ps->range(-10, 10);
|
||||
|
@ -492,7 +480,6 @@ void CaveV7::carveRoute(v3f vec, float f, bool randomize_xz, bool is_ravine) {
|
|||
}
|
||||
|
||||
bool flat_cave_floor = !large_cave && ps->range(0, 2) == 2;
|
||||
bool should_make_cave_hole = ps->range(1, 10) == 1;
|
||||
|
||||
for (s16 z0 = d0; z0 <= d1; z0++) {
|
||||
s16 si = rs / 2 - MYMAX(0, abs(z0) - rs / 7 - 1);
|
||||
|
@ -515,23 +502,15 @@ void CaveV7::carveRoute(v3f vec, float f, bool randomize_xz, bool is_ravine) {
|
|||
|
||||
v3s16 p(cp.X + x0, cp.Y + y0, cp.Z + z0);
|
||||
p += of;
|
||||
|
||||
if (!is_ravine && mg->heightmap && should_make_cave_hole) {
|
||||
int maplen = node_max.X - node_min.X + 1;
|
||||
int idx = (p.Z - node_min.Z) * maplen + (p.X - node_min.X);
|
||||
if (p.Y >= mg->heightmap[idx] - 2)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (vm->m_area.contains(p) == false)
|
||||
continue;
|
||||
|
||||
u32 i = vm->m_area.index(p);
|
||||
|
||||
// Don't replace air, water, lava, or ice
|
||||
// Don't replace air or water or lava
|
||||
content_t c = vm->m_data[i].getContent();
|
||||
if (c == CONTENT_AIR || c == c_water_source ||
|
||||
c == c_lava_source || c == c_ice)
|
||||
if (c == CONTENT_AIR || c == c_water_source || c == c_lava_source)
|
||||
continue;
|
||||
|
||||
if (large_cave) {
|
||||
|
@ -545,9 +524,6 @@ void CaveV7::carveRoute(v3f vec, float f, bool randomize_xz, bool is_ravine) {
|
|||
else
|
||||
vm->m_data[i] = airnode;
|
||||
} else {
|
||||
if (c == CONTENT_IGNORE)
|
||||
continue;
|
||||
|
||||
vm->m_data[i] = airnode;
|
||||
vm->m_flags[i] |= VMANIP_FLAG_CAVE;
|
||||
}
|
||||
|
|
|
@ -75,8 +75,6 @@ public:
|
|||
ManualMapVoxelManipulator *vm;
|
||||
INodeDefManager *ndef;
|
||||
|
||||
NoiseParams *np_caveliquids;
|
||||
|
||||
s16 min_tunnel_diameter;
|
||||
s16 max_tunnel_diameter;
|
||||
u16 tunnel_routepoints;
|
||||
|
@ -104,7 +102,6 @@ public:
|
|||
|
||||
content_t c_water_source;
|
||||
content_t c_lava_source;
|
||||
content_t c_ice;
|
||||
|
||||
int water_level;
|
||||
|
||||
|
|
|
@ -250,7 +250,7 @@ void * MediaFetchThread::Thread()
|
|||
m_file_data.push_back(make_pair(i->name, data));
|
||||
} else {
|
||||
m_failed.push_back(*i);
|
||||
infostream << "cURL request failed for " << i->name << " (" << curl_easy_strerror(res) << ")"<< std::endl;
|
||||
infostream << "cURL request failed for " << i->name << std::endl;
|
||||
}
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
|
@ -320,6 +320,12 @@ Client::Client(
|
|||
m_playerpos_send_timer = 0.0;
|
||||
m_ignore_damage_timer = 0.0;
|
||||
|
||||
// Build main texture atlas, now that the GameDef exists (that is, us)
|
||||
if(g_settings->getBool("enable_texture_atlas"))
|
||||
m_tsrc->buildMainAtlas(this);
|
||||
else
|
||||
infostream<<"Not building texture atlas."<<std::endl;
|
||||
|
||||
/*
|
||||
Add local player
|
||||
*/
|
||||
|
@ -797,8 +803,7 @@ void Client::step(float dtime)
|
|||
all_stopped &= !(*thread)->IsRunning();
|
||||
while (!(*thread)->m_file_data.empty()) {
|
||||
std::pair <std::string, std::string> out = (*thread)->m_file_data.pop_front();
|
||||
if(m_media_received_count < m_media_count)
|
||||
m_media_received_count++;
|
||||
++m_media_received_count;
|
||||
|
||||
bool success = loadMedia(out.second, out.first);
|
||||
if(success){
|
||||
|
@ -1732,9 +1737,15 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
|
|||
}
|
||||
else if(command == TOCLIENT_MEDIA)
|
||||
{
|
||||
if (m_media_count == 0)
|
||||
return;
|
||||
std::string datastring((char*)&data[2], datasize-2);
|
||||
std::istringstream is(datastring, std::ios_base::binary);
|
||||
|
||||
// Mesh update thread must be stopped while
|
||||
// updating content definitions
|
||||
assert(!m_mesh_update_thread.IsRunning());
|
||||
|
||||
/*
|
||||
u16 command
|
||||
u16 total number of file bunches
|
||||
|
@ -1749,31 +1760,11 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
|
|||
*/
|
||||
int num_bunches = readU16(is);
|
||||
int bunch_i = readU16(is);
|
||||
u32 num_files = readU32(is);
|
||||
int num_files = readU32(is);
|
||||
infostream<<"Client: Received files: bunch "<<bunch_i<<"/"
|
||||
<<num_bunches<<" files="<<num_files
|
||||
<<" size="<<datasize<<std::endl;
|
||||
|
||||
// Check total and received media count
|
||||
assert(m_media_received_count <= m_media_count);
|
||||
if (num_files > m_media_count - m_media_received_count) {
|
||||
errorstream<<"Client: Received more files than requested:"
|
||||
<<" total count="<<m_media_count
|
||||
<<" total received="<<m_media_received_count
|
||||
<<" bunch "<<bunch_i<<"/"<<num_bunches
|
||||
<<" files="<<num_files
|
||||
<<" size="<<datasize<<std::endl;
|
||||
num_files = m_media_count - m_media_received_count;
|
||||
}
|
||||
if (num_files == 0)
|
||||
return;
|
||||
|
||||
// Mesh update thread must be stopped while
|
||||
// updating content definitions
|
||||
assert(!m_mesh_update_thread.IsRunning());
|
||||
|
||||
for(u32 i=0; i<num_files; i++){
|
||||
assert(m_media_received_count < m_media_count);
|
||||
for(int i=0; i<num_files; i++){
|
||||
m_media_received_count++;
|
||||
std::string name = deSerializeString(is);
|
||||
std::string data = deSerializeLongString(is);
|
||||
|
@ -2864,8 +2855,12 @@ void Client::afterContentReceived(IrrlichtDevice *device, gui::IGUIFont* font)
|
|||
infostream<<"- Rebuilding images and textures"<<std::endl;
|
||||
m_tsrc->rebuildImagesAndTextures();
|
||||
|
||||
// Update texture atlas
|
||||
infostream<<"- Updating texture atlas"<<std::endl;
|
||||
if(g_settings->getBool("enable_texture_atlas"))
|
||||
m_tsrc->buildMainAtlas(this);
|
||||
|
||||
// Rebuild shaders
|
||||
infostream<<"- Rebuilding shaders"<<std::endl;
|
||||
m_shsrc->rebuildShaders();
|
||||
|
||||
// Update node aliases
|
||||
|
|
|
@ -31,10 +31,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#include "main.h" // g_profiler
|
||||
#include "profiler.h"
|
||||
|
||||
// float error is 10 - 9.96875 = 0.03125
|
||||
//#define COLL_ZERO 0.032 // broken unit tests
|
||||
#define COLL_ZERO 0
|
||||
|
||||
// Helper function:
|
||||
// Checks for collision of a moving aabbox with a static aabbox
|
||||
// Returns -1 if no collision, 0 if X collision, 1 if Y collision, 2 if Z collision
|
||||
|
@ -45,9 +41,9 @@ int axisAlignedCollision(
|
|||
{
|
||||
//TimeTaker tt("axisAlignedCollision");
|
||||
|
||||
f32 xsize = (staticbox.MaxEdge.X - staticbox.MinEdge.X) - COLL_ZERO; // reduce box size for solve collision stuck (flying sand)
|
||||
f32 ysize = (staticbox.MaxEdge.Y - staticbox.MinEdge.Y); // - COLL_ZERO; // Y - no sense for falling, but maybe try later
|
||||
f32 zsize = (staticbox.MaxEdge.Z - staticbox.MinEdge.Z) - COLL_ZERO;
|
||||
f32 xsize = (staticbox.MaxEdge.X - staticbox.MinEdge.X);
|
||||
f32 ysize = (staticbox.MaxEdge.Y - staticbox.MinEdge.Y);
|
||||
f32 zsize = (staticbox.MaxEdge.Z - staticbox.MinEdge.Z);
|
||||
|
||||
aabb3f relbox(
|
||||
movingbox.MinEdge.X - staticbox.MinEdge.X,
|
||||
|
@ -64,9 +60,9 @@ int axisAlignedCollision(
|
|||
{
|
||||
dtime = - relbox.MaxEdge.X / speed.X;
|
||||
if((relbox.MinEdge.Y + speed.Y * dtime < ysize) &&
|
||||
(relbox.MaxEdge.Y + speed.Y * dtime > COLL_ZERO) &&
|
||||
(relbox.MaxEdge.Y + speed.Y * dtime > 0) &&
|
||||
(relbox.MinEdge.Z + speed.Z * dtime < zsize) &&
|
||||
(relbox.MaxEdge.Z + speed.Z * dtime > COLL_ZERO))
|
||||
(relbox.MaxEdge.Z + speed.Z * dtime > 0))
|
||||
return 0;
|
||||
}
|
||||
else if(relbox.MinEdge.X > xsize)
|
||||
|
@ -80,9 +76,9 @@ int axisAlignedCollision(
|
|||
{
|
||||
dtime = (xsize - relbox.MinEdge.X) / speed.X;
|
||||
if((relbox.MinEdge.Y + speed.Y * dtime < ysize) &&
|
||||
(relbox.MaxEdge.Y + speed.Y * dtime > COLL_ZERO) &&
|
||||
(relbox.MaxEdge.Y + speed.Y * dtime > 0) &&
|
||||
(relbox.MinEdge.Z + speed.Z * dtime < zsize) &&
|
||||
(relbox.MaxEdge.Z + speed.Z * dtime > COLL_ZERO))
|
||||
(relbox.MaxEdge.Z + speed.Z * dtime > 0))
|
||||
return 0;
|
||||
}
|
||||
else if(relbox.MaxEdge.X < 0)
|
||||
|
@ -99,9 +95,9 @@ int axisAlignedCollision(
|
|||
{
|
||||
dtime = - relbox.MaxEdge.Y / speed.Y;
|
||||
if((relbox.MinEdge.X + speed.X * dtime < xsize) &&
|
||||
(relbox.MaxEdge.X + speed.X * dtime > COLL_ZERO) &&
|
||||
(relbox.MaxEdge.X + speed.X * dtime > 0) &&
|
||||
(relbox.MinEdge.Z + speed.Z * dtime < zsize) &&
|
||||
(relbox.MaxEdge.Z + speed.Z * dtime > COLL_ZERO))
|
||||
(relbox.MaxEdge.Z + speed.Z * dtime > 0))
|
||||
return 1;
|
||||
}
|
||||
else if(relbox.MinEdge.Y > ysize)
|
||||
|
@ -115,9 +111,9 @@ int axisAlignedCollision(
|
|||
{
|
||||
dtime = (ysize - relbox.MinEdge.Y) / speed.Y;
|
||||
if((relbox.MinEdge.X + speed.X * dtime < xsize) &&
|
||||
(relbox.MaxEdge.X + speed.X * dtime > COLL_ZERO) &&
|
||||
(relbox.MaxEdge.X + speed.X * dtime > 0) &&
|
||||
(relbox.MinEdge.Z + speed.Z * dtime < zsize) &&
|
||||
(relbox.MaxEdge.Z + speed.Z * dtime > COLL_ZERO))
|
||||
(relbox.MaxEdge.Z + speed.Z * dtime > 0))
|
||||
return 1;
|
||||
}
|
||||
else if(relbox.MaxEdge.Y < 0)
|
||||
|
@ -134,9 +130,9 @@ int axisAlignedCollision(
|
|||
{
|
||||
dtime = - relbox.MaxEdge.Z / speed.Z;
|
||||
if((relbox.MinEdge.X + speed.X * dtime < xsize) &&
|
||||
(relbox.MaxEdge.X + speed.X * dtime > COLL_ZERO) &&
|
||||
(relbox.MaxEdge.X + speed.X * dtime > 0) &&
|
||||
(relbox.MinEdge.Y + speed.Y * dtime < ysize) &&
|
||||
(relbox.MaxEdge.Y + speed.Y * dtime > COLL_ZERO))
|
||||
(relbox.MaxEdge.Y + speed.Y * dtime > 0))
|
||||
return 2;
|
||||
}
|
||||
//else if(relbox.MinEdge.Z > zsize)
|
||||
|
@ -150,9 +146,9 @@ int axisAlignedCollision(
|
|||
{
|
||||
dtime = (zsize - relbox.MinEdge.Z) / speed.Z;
|
||||
if((relbox.MinEdge.X + speed.X * dtime < xsize) &&
|
||||
(relbox.MaxEdge.X + speed.X * dtime > COLL_ZERO) &&
|
||||
(relbox.MaxEdge.X + speed.X * dtime > 0) &&
|
||||
(relbox.MinEdge.Y + speed.Y * dtime < ysize) &&
|
||||
(relbox.MaxEdge.Y + speed.Y * dtime > COLL_ZERO))
|
||||
(relbox.MaxEdge.Y + speed.Y * dtime > 0))
|
||||
return 2;
|
||||
}
|
||||
//else if(relbox.MaxEdge.Z < 0)
|
||||
|
|
|
@ -1436,8 +1436,7 @@ SharedBuffer<u8> Connection::processPacket(Channel *channel,
|
|||
else if(type == TYPE_RELIABLE)
|
||||
{
|
||||
// Recursive reliable packets not allowed
|
||||
if(reliable)
|
||||
throw InvalidIncomingDataException("Found nested reliable packets");
|
||||
assert(reliable == false);
|
||||
|
||||
if(packetdata.getSize() < RELIABLE_HEADER_SIZE)
|
||||
throw InvalidIncomingDataException
|
||||
|
|
|
@ -228,12 +228,9 @@ public:
|
|||
ServerMap *map = &env->getServerMap();
|
||||
if (map->transforming_liquid_size() > 500)
|
||||
return;
|
||||
if ( map->getNodeNoEx(p - v3s16(0, 1, 0 )).getContent() != CONTENT_AIR // below
|
||||
&& map->getNodeNoEx(p - v3s16(1, 0, 0 )).getContent() != CONTENT_AIR // right
|
||||
&& map->getNodeNoEx(p - v3s16(-1, 0, 0 )).getContent() != CONTENT_AIR // left
|
||||
&& map->getNodeNoEx(p - v3s16(0, 0, 1 )).getContent() != CONTENT_AIR // back
|
||||
&& map->getNodeNoEx(p - v3s16(0, 0, -1)).getContent() != CONTENT_AIR // front
|
||||
)
|
||||
//todo: look around except top
|
||||
MapNode n_below = map->getNodeNoEx(p - v3s16(0, 1, 0));
|
||||
if (n_below.getContent() != CONTENT_AIR)
|
||||
return;
|
||||
map->transforming_liquid_add(p);
|
||||
}
|
||||
|
|
|
@ -223,7 +223,7 @@ void TestCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc,
|
|||
// Set material
|
||||
buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
|
||||
buf->getMaterial().setFlag(video::EMF_BACK_FACE_CULLING, false);
|
||||
buf->getMaterial().setTexture(0, tsrc->getTexture("rat.png"));
|
||||
buf->getMaterial().setTexture(0, tsrc->getTextureRaw("rat.png"));
|
||||
buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
|
||||
buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
|
||||
buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
|
||||
|
@ -393,7 +393,7 @@ void ItemCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc,
|
|||
buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
|
||||
buf->getMaterial().setFlag(video::EMF_BACK_FACE_CULLING, false);
|
||||
// Initialize with a generated placeholder texture
|
||||
buf->getMaterial().setTexture(0, tsrc->getTexture(""));
|
||||
buf->getMaterial().setTexture(0, tsrc->getTextureRaw(""));
|
||||
buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
|
||||
buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
|
||||
buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
|
||||
|
@ -864,7 +864,7 @@ public:
|
|||
m_spritenode = smgr->addBillboardSceneNode(
|
||||
NULL, v2f(1, 1), v3f(0,0,0), -1);
|
||||
m_spritenode->setMaterialTexture(0,
|
||||
tsrc->getTexture("unknown_node.png"));
|
||||
tsrc->getTextureRaw("unknown_node.png"));
|
||||
m_spritenode->setMaterialFlag(video::EMF_LIGHTING, false);
|
||||
m_spritenode->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
|
||||
m_spritenode->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF);
|
||||
|
@ -1273,7 +1273,7 @@ public:
|
|||
texturestring = m_prop.textures[0];
|
||||
texturestring += mod;
|
||||
m_spritenode->setMaterialTexture(0,
|
||||
tsrc->getTexture(texturestring));
|
||||
tsrc->getTextureRaw(texturestring));
|
||||
|
||||
// This allows setting per-material colors. However, until a real lighting
|
||||
// system is added, the code below will have no effect. Once MineTest
|
||||
|
@ -1300,7 +1300,7 @@ public:
|
|||
if(texturestring == "")
|
||||
continue; // Empty texture string means don't modify that material
|
||||
texturestring += mod;
|
||||
video::ITexture* texture = tsrc->getTexture(texturestring);
|
||||
video::ITexture* texture = tsrc->getTextureRaw(texturestring);
|
||||
if(!texture)
|
||||
{
|
||||
errorstream<<"GenericCAO::updateTextures(): Could not load texture "<<texturestring<<std::endl;
|
||||
|
@ -1308,8 +1308,8 @@ public:
|
|||
}
|
||||
|
||||
// Set material flags and texture
|
||||
m_animated_meshnode->setMaterialTexture(i, texture);
|
||||
video::SMaterial& material = m_animated_meshnode->getMaterial(i);
|
||||
material.TextureLayer[0].Texture = texture;
|
||||
material.setFlag(video::EMF_LIGHTING, false);
|
||||
material.setFlag(video::EMF_BILINEAR_FILTER, false);
|
||||
|
||||
|
@ -1338,15 +1338,20 @@ public:
|
|||
if(m_prop.textures.size() > i)
|
||||
texturestring = m_prop.textures[i];
|
||||
texturestring += mod;
|
||||
AtlasPointer ap = tsrc->getTexture(texturestring);
|
||||
|
||||
// Get the tile texture and atlas transformation
|
||||
video::ITexture* atlas = ap.atlas;
|
||||
v2f pos = ap.pos;
|
||||
v2f size = ap.size;
|
||||
|
||||
// Set material flags and texture
|
||||
video::SMaterial& material = m_meshnode->getMaterial(i);
|
||||
material.setFlag(video::EMF_LIGHTING, false);
|
||||
material.setFlag(video::EMF_BILINEAR_FILTER, false);
|
||||
material.setTexture(0,
|
||||
tsrc->getTexture(texturestring));
|
||||
material.getTextureMatrix(0).makeIdentity();
|
||||
material.setTexture(0, atlas);
|
||||
material.getTextureMatrix(0).setTextureTranslate(pos.X, pos.Y);
|
||||
material.getTextureMatrix(0).setTextureScale(size.X, size.Y);
|
||||
|
||||
// This allows setting per-material colors. However, until a real lighting
|
||||
// system is added, the code below will have no effect. Once MineTest
|
||||
|
@ -1373,7 +1378,7 @@ public:
|
|||
tname += mod;
|
||||
scene::IMeshBuffer *buf = mesh->getMeshBuffer(0);
|
||||
buf->getMaterial().setTexture(0,
|
||||
tsrc->getTexture(tname));
|
||||
tsrc->getTextureRaw(tname));
|
||||
|
||||
// This allows setting per-material colors. However, until a real lighting
|
||||
// system is added, the code below will have no effect. Once MineTest
|
||||
|
@ -1398,7 +1403,7 @@ public:
|
|||
tname += mod;
|
||||
scene::IMeshBuffer *buf = mesh->getMeshBuffer(1);
|
||||
buf->getMaterial().setTexture(0,
|
||||
tsrc->getTexture(tname));
|
||||
tsrc->getTextureRaw(tname));
|
||||
|
||||
// This allows setting per-material colors. However, until a real lighting
|
||||
// system is added, the code below will have no effect. Once MineTest
|
||||
|
|
|
@ -50,7 +50,7 @@ public:
|
|||
m_spritenode = smgr->addBillboardSceneNode(
|
||||
NULL, v2f(1,1), pos, -1);
|
||||
m_spritenode->setMaterialTexture(0,
|
||||
env->getGameDef()->tsrc()->getTexture("smoke_puff.png"));
|
||||
env->getGameDef()->tsrc()->getTextureRaw("smoke_puff.png"));
|
||||
m_spritenode->setMaterialFlag(video::EMF_LIGHTING, false);
|
||||
m_spritenode->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
|
||||
//m_spritenode->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF);
|
||||
|
|
|
@ -99,6 +99,7 @@ void makeCuboid(MeshCollector *collector, const aabb3f &box,
|
|||
video::S3DVertex(min.X,min.Y,min.Z, 0,0,-1, c, txc[20],txc[23]),
|
||||
};
|
||||
|
||||
v2f t;
|
||||
for(int i = 0; i < tilecount; i++)
|
||||
{
|
||||
switch (tiles[i].rotation)
|
||||
|
@ -118,43 +119,49 @@ void makeCuboid(MeshCollector *collector, const aabb3f &box,
|
|||
vertices[i*4+x].TCoords.rotateBy(270,irr::core::vector2df(0, 0));
|
||||
break;
|
||||
case 4: //FXR90
|
||||
for (int x = 0; x < 4; x++){
|
||||
vertices[i*4+x].TCoords.X = 1.0 - vertices[i*4+x].TCoords.X;
|
||||
for (int x = 0; x < 4; x++)
|
||||
vertices[i*4+x].TCoords.rotateBy(90,irr::core::vector2df(0, 0));
|
||||
}
|
||||
|
||||
tiles[i].texture.pos.Y += tiles[i].texture.size.Y;
|
||||
tiles[i].texture.size.Y *= -1;
|
||||
break;
|
||||
case 5: //FXR270
|
||||
for (int x = 0; x < 4; x++){
|
||||
vertices[i*4+x].TCoords.X = 1.0 - vertices[i*4+x].TCoords.X;
|
||||
for (int x = 0; x < 4; x++)
|
||||
vertices[i*4+x].TCoords.rotateBy(270,irr::core::vector2df(0, 0));
|
||||
}
|
||||
t=vertices[i*4].TCoords;
|
||||
tiles[i].texture.pos.Y += tiles[i].texture.size.Y;
|
||||
tiles[i].texture.size.Y *= -1;
|
||||
break;
|
||||
case 6: //FYR90
|
||||
for (int x = 0; x < 4; x++){
|
||||
vertices[i*4+x].TCoords.Y = 1.0 - vertices[i*4+x].TCoords.Y;
|
||||
for (int x = 0; x < 4; x++)
|
||||
vertices[i*4+x].TCoords.rotateBy(90,irr::core::vector2df(0, 0));
|
||||
}
|
||||
tiles[i].texture.pos.X += tiles[i].texture.size.X;
|
||||
tiles[i].texture.size.X *= -1;
|
||||
break;
|
||||
case 7: //FYR270
|
||||
for (int x = 0; x < 4; x++){
|
||||
vertices[i*4+x].TCoords.Y = 1.0 - vertices[i*4+x].TCoords.Y;
|
||||
for (int x = 0; x < 4; x++)
|
||||
vertices[i*4+x].TCoords.rotateBy(270,irr::core::vector2df(0, 0));
|
||||
}
|
||||
tiles[i].texture.pos.X += tiles[i].texture.size.X;
|
||||
tiles[i].texture.size.X *= -1;
|
||||
break;
|
||||
case 8: //FX
|
||||
for (int x = 0; x < 4; x++){
|
||||
vertices[i*4+x].TCoords.X = 1.0 - vertices[i*4+x].TCoords.X;
|
||||
}
|
||||
tiles[i].texture.pos.Y += tiles[i].texture.size.Y;
|
||||
tiles[i].texture.size.Y *= -1;
|
||||
break;
|
||||
case 9: //FY
|
||||
for (int x = 0; x < 4; x++){
|
||||
vertices[i*4+x].TCoords.Y = 1.0 - vertices[i*4+x].TCoords.Y;
|
||||
}
|
||||
tiles[i].texture.pos.X += tiles[i].texture.size.X;
|
||||
tiles[i].texture.size.X *= -1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
for(s32 j=0; j<24; j++)
|
||||
{
|
||||
int tileindex = MYMIN(j/4, tilecount-1);
|
||||
vertices[j].TCoords *= tiles[tileindex].texture.size;
|
||||
vertices[j].TCoords += tiles[tileindex].texture.pos;
|
||||
}
|
||||
u16 indices[] = {0,1,2,2,3,0};
|
||||
// Add to mesh collector
|
||||
for(s32 j=0; j<24; j+=4)
|
||||
|
@ -211,6 +218,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||
*/
|
||||
TileSpec tile_liquid = f.special_tiles[0];
|
||||
TileSpec tile_liquid_bfculled = getNodeTile(n, p, v3s16(0,0,0), data);
|
||||
AtlasPointer &pa_liquid = tile_liquid.texture;
|
||||
|
||||
bool top_is_same_liquid = false;
|
||||
MapNode ntop = data->m_vmanip.getNodeNoEx(blockpos_nodes + v3s16(x,y+1,z));
|
||||
|
@ -272,10 +280,14 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||
|
||||
video::S3DVertex vertices[4] =
|
||||
{
|
||||
video::S3DVertex(-BS/2,0,BS/2,0,0,0, c, 0,1),
|
||||
video::S3DVertex(BS/2,0,BS/2,0,0,0, c, 1,1),
|
||||
video::S3DVertex(BS/2,0,BS/2, 0,0,0, c, 1,0),
|
||||
video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c, 0,0),
|
||||
video::S3DVertex(-BS/2,0,BS/2,0,0,0, c,
|
||||
pa_liquid.x0(), pa_liquid.y1()),
|
||||
video::S3DVertex(BS/2,0,BS/2,0,0,0, c,
|
||||
pa_liquid.x1(), pa_liquid.y1()),
|
||||
video::S3DVertex(BS/2,0,BS/2, 0,0,0, c,
|
||||
pa_liquid.x1(), pa_liquid.y0()),
|
||||
video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c,
|
||||
pa_liquid.x0(), pa_liquid.y0()),
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -347,10 +359,14 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||
|
||||
video::S3DVertex vertices[4] =
|
||||
{
|
||||
video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c, 0,1),
|
||||
video::S3DVertex(BS/2,0,BS/2, 0,0,0, c, 1,1),
|
||||
video::S3DVertex(BS/2,0,-BS/2, 0,0,0, c, 1,0),
|
||||
video::S3DVertex(-BS/2,0,-BS/2, 0,0,0, c, 0,0),
|
||||
video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c,
|
||||
pa_liquid.x0(), pa_liquid.y1()),
|
||||
video::S3DVertex(BS/2,0,BS/2, 0,0,0, c,
|
||||
pa_liquid.x1(), pa_liquid.y1()),
|
||||
video::S3DVertex(BS/2,0,-BS/2, 0,0,0, c,
|
||||
pa_liquid.x1(), pa_liquid.y0()),
|
||||
video::S3DVertex(-BS/2,0,-BS/2, 0,0,0, c,
|
||||
pa_liquid.x0(), pa_liquid.y0()),
|
||||
};
|
||||
|
||||
v3f offset(p.X*BS, p.Y*BS + (-0.5+node_liquid_level)*BS, p.Z*BS);
|
||||
|
@ -370,6 +386,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||
*/
|
||||
TileSpec tile_liquid = f.special_tiles[0];
|
||||
TileSpec tile_liquid_bfculled = f.special_tiles[1];
|
||||
AtlasPointer &pa_liquid = tile_liquid.texture;
|
||||
|
||||
bool top_is_same_liquid = false;
|
||||
MapNode ntop = data->m_vmanip.getNodeNoEx(blockpos_nodes + v3s16(x,y+1,z));
|
||||
|
@ -549,10 +566,14 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||
|
||||
video::S3DVertex vertices[4] =
|
||||
{
|
||||
video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c, 0,1),
|
||||
video::S3DVertex(BS/2,0,BS/2, 0,0,0, c, 1,1),
|
||||
video::S3DVertex(BS/2,0,BS/2, 0,0,0, c, 1,0),
|
||||
video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c, 0,0),
|
||||
video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c,
|
||||
pa_liquid.x0(), pa_liquid.y1()),
|
||||
video::S3DVertex(BS/2,0,BS/2, 0,0,0, c,
|
||||
pa_liquid.x1(), pa_liquid.y1()),
|
||||
video::S3DVertex(BS/2,0,BS/2, 0,0,0, c,
|
||||
pa_liquid.x1(), pa_liquid.y0()),
|
||||
video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c,
|
||||
pa_liquid.x0(), pa_liquid.y0()),
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -626,10 +647,14 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||
{
|
||||
video::S3DVertex vertices[4] =
|
||||
{
|
||||
video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c, 0,1),
|
||||
video::S3DVertex(BS/2,0,BS/2, 0,0,0, c, 1,1),
|
||||
video::S3DVertex(BS/2,0,-BS/2, 0,0,0, c, 1,0),
|
||||
video::S3DVertex(-BS/2,0,-BS/2, 0,0,0, c, 0,0),
|
||||
video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c,
|
||||
pa_liquid.x0(), pa_liquid.y1()),
|
||||
video::S3DVertex(BS/2,0,BS/2, 0,0,0, c,
|
||||
pa_liquid.x1(), pa_liquid.y1()),
|
||||
video::S3DVertex(BS/2,0,-BS/2, 0,0,0, c,
|
||||
pa_liquid.x1(), pa_liquid.y0()),
|
||||
video::S3DVertex(-BS/2,0,-BS/2, 0,0,0, c,
|
||||
pa_liquid.x0(), pa_liquid.y0()),
|
||||
};
|
||||
|
||||
// To get backface culling right, the vertices need to go
|
||||
|
@ -700,6 +725,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||
case NDT_GLASSLIKE:
|
||||
{
|
||||
TileSpec tile = getNodeTile(n, p, v3s16(0,0,0), data);
|
||||
AtlasPointer ap = tile.texture;
|
||||
|
||||
u16 l = getInteriorLight(n, 1, data);
|
||||
video::SColor c = MapBlock_LightColor(255, l, decode_light(f.light_source));
|
||||
|
@ -715,10 +741,14 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||
|
||||
// The face at Z+
|
||||
video::S3DVertex vertices[4] = {
|
||||
video::S3DVertex(-BS/2,-BS/2,BS/2, 0,0,0, c, 0,1),
|
||||
video::S3DVertex(BS/2,-BS/2,BS/2, 0,0,0, c, 1,1),
|
||||
video::S3DVertex(BS/2,BS/2,BS/2, 0,0,0, c, 1,0),
|
||||
video::S3DVertex(-BS/2,BS/2,BS/2, 0,0,0, c, 0,0),
|
||||
video::S3DVertex(-BS/2,-BS/2,BS/2, 0,0,0, c,
|
||||
ap.x0(), ap.y1()),
|
||||
video::S3DVertex(BS/2,-BS/2,BS/2, 0,0,0, c,
|
||||
ap.x1(), ap.y1()),
|
||||
video::S3DVertex(BS/2,BS/2,BS/2, 0,0,0, c,
|
||||
ap.x1(), ap.y0()),
|
||||
video::S3DVertex(-BS/2,BS/2,BS/2, 0,0,0, c,
|
||||
ap.x0(), ap.y0()),
|
||||
};
|
||||
|
||||
// Rotations in the g_6dirs format
|
||||
|
@ -880,6 +910,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||
{
|
||||
TileSpec tile_leaves = getNodeTile(n, p,
|
||||
v3s16(0,0,0), data);
|
||||
AtlasPointer pa_leaves = tile_leaves.texture;
|
||||
|
||||
u16 l = getInteriorLight(n, 1, data);
|
||||
video::SColor c = MapBlock_LightColor(255, l, decode_light(f.light_source));
|
||||
|
@ -914,16 +945,22 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||
tile.material_flags &= ~MATERIAL_FLAG_BACKFACE_CULLING;
|
||||
tile.material_flags |= MATERIAL_FLAG_CRACK_OVERLAY;
|
||||
|
||||
AtlasPointer ap = tile.texture;
|
||||
|
||||
u16 l = getInteriorLight(n, 1, data);
|
||||
video::SColor c = MapBlock_LightColor(255, l, decode_light(f.light_source));
|
||||
|
||||
// Wall at X+ of node
|
||||
video::S3DVertex vertices[4] =
|
||||
{
|
||||
video::S3DVertex(-BS/2,-BS/2,0, 0,0,0, c, 0,1),
|
||||
video::S3DVertex(BS/2,-BS/2,0, 0,0,0, c, 1,1),
|
||||
video::S3DVertex(BS/2,BS/2,0, 0,0,0, c, 1,0),
|
||||
video::S3DVertex(-BS/2,BS/2,0, 0,0,0, c, 0,0),
|
||||
video::S3DVertex(-BS/2,-BS/2,0, 0,0,0, c,
|
||||
ap.x0(), ap.y1()),
|
||||
video::S3DVertex(BS/2,-BS/2,0, 0,0,0, c,
|
||||
ap.x1(), ap.y1()),
|
||||
video::S3DVertex(BS/2,BS/2,0, 0,0,0, c,
|
||||
ap.x1(), ap.y0()),
|
||||
video::S3DVertex(-BS/2,BS/2,0, 0,0,0, c,
|
||||
ap.x0(), ap.y0()),
|
||||
};
|
||||
|
||||
for(s32 i=0; i<4; i++)
|
||||
|
@ -953,6 +990,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||
TileSpec tile = getNodeTileN(n, p, 0, data);
|
||||
tile.material_flags &= ~MATERIAL_FLAG_BACKFACE_CULLING;
|
||||
tile.material_flags |= MATERIAL_FLAG_CRACK_OVERLAY;
|
||||
AtlasPointer ap = tile.texture;
|
||||
|
||||
u16 l = getInteriorLight(n, 0, data);
|
||||
video::SColor c = MapBlock_LightColor(255, l, decode_light(f.light_source));
|
||||
|
@ -961,10 +999,14 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||
// Wall at X+ of node
|
||||
video::S3DVertex vertices[4] =
|
||||
{
|
||||
video::S3DVertex(BS/2-d,BS/2,BS/2, 0,0,0, c, 0,0),
|
||||
video::S3DVertex(BS/2-d,BS/2,-BS/2, 0,0,0, c, 1,0),
|
||||
video::S3DVertex(BS/2-d,-BS/2,-BS/2, 0,0,0, c, 1,1),
|
||||
video::S3DVertex(BS/2-d,-BS/2,BS/2, 0,0,0, c, 0,1),
|
||||
video::S3DVertex(BS/2-d,BS/2,BS/2, 0,0,0, c,
|
||||
ap.x0(), ap.y0()),
|
||||
video::S3DVertex(BS/2-d,BS/2,-BS/2, 0,0,0, c,
|
||||
ap.x1(), ap.y0()),
|
||||
video::S3DVertex(BS/2-d,-BS/2,-BS/2, 0,0,0, c,
|
||||
ap.x1(), ap.y1()),
|
||||
video::S3DVertex(BS/2-d,-BS/2,BS/2, 0,0,0, c,
|
||||
ap.x0(), ap.y1()),
|
||||
};
|
||||
|
||||
v3s16 dir = n.getWallMountedDir(nodedef);
|
||||
|
@ -995,6 +1037,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||
{
|
||||
TileSpec tile = getNodeTileN(n, p, 0, data);
|
||||
tile.material_flags |= MATERIAL_FLAG_CRACK_OVERLAY;
|
||||
AtlasPointer ap = tile.texture;
|
||||
|
||||
u16 l = getInteriorLight(n, 1, data);
|
||||
video::SColor c = MapBlock_LightColor(255, l, decode_light(f.light_source));
|
||||
|
@ -1003,12 +1046,16 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||
{
|
||||
video::S3DVertex vertices[4] =
|
||||
{
|
||||
video::S3DVertex(-BS/2*f.visual_scale,-BS/2,0, 0,0,0, c, 0,1),
|
||||
video::S3DVertex( BS/2*f.visual_scale,-BS/2,0, 0,0,0, c, 1,1),
|
||||
video::S3DVertex(-BS/2*f.visual_scale,-BS/2,0, 0,0,0, c,
|
||||
ap.x0(), ap.y1()),
|
||||
video::S3DVertex( BS/2*f.visual_scale,-BS/2,0, 0,0,0, c,
|
||||
ap.x1(), ap.y1()),
|
||||
video::S3DVertex( BS/2*f.visual_scale,
|
||||
-BS/2 + f.visual_scale*BS,0, 0,0,0, c, 1,0),
|
||||
-BS/2 + f.visual_scale*BS,0, 0,0,0, c,
|
||||
ap.x1(), ap.y0()),
|
||||
video::S3DVertex(-BS/2*f.visual_scale,
|
||||
-BS/2 + f.visual_scale*BS,0, 0,0,0, c, 0,0),
|
||||
-BS/2 + f.visual_scale*BS,0, 0,0,0, c,
|
||||
ap.x0(), ap.y0()),
|
||||
};
|
||||
|
||||
if(j == 0)
|
||||
|
@ -1041,13 +1088,10 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||
|
||||
// A hack to put wood the right way around in the posts
|
||||
ITextureSource *tsrc = data->m_gamedef->tsrc();
|
||||
std::string texturestring_rot = tsrc->getTextureName(
|
||||
tile.texture_id) + "^[transformR90";
|
||||
TileSpec tile_rot = tile;
|
||||
tile_rot.texture = tsrc->getTexture(
|
||||
texturestring_rot,
|
||||
&tile_rot.texture_id);
|
||||
|
||||
tile_rot.texture = tsrc->getTexture(tsrc->getTextureName(
|
||||
tile.texture.id) + "^[transformR90");
|
||||
|
||||
u16 l = getInteriorLight(n, 1, data);
|
||||
video::SColor c = MapBlock_LightColor(255, l, decode_light(f.light_source));
|
||||
|
||||
|
@ -1297,6 +1341,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||
tile.material_flags &= ~MATERIAL_FLAG_BACKFACE_CULLING;
|
||||
tile.material_flags |= MATERIAL_FLAG_CRACK_OVERLAY;
|
||||
|
||||
AtlasPointer ap = tile.texture;
|
||||
|
||||
u16 l = getInteriorLight(n, 0, data);
|
||||
video::SColor c = MapBlock_LightColor(255, l, decode_light(f.light_source));
|
||||
|
||||
|
@ -1308,10 +1354,14 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||
|
||||
video::S3DVertex vertices[4] =
|
||||
{
|
||||
video::S3DVertex(-BS/2,-BS/2+d,-BS/2, 0,0,0, c, 0,1),
|
||||
video::S3DVertex(BS/2,-BS/2+d,-BS/2, 0,0,0, c, 1,1),
|
||||
video::S3DVertex(BS/2,g*BS/2+d,BS/2, 0,0,0, c, 1,0),
|
||||
video::S3DVertex(-BS/2,g*BS/2+d,BS/2, 0,0,0, c, 0,0),
|
||||
video::S3DVertex(-BS/2,-BS/2+d,-BS/2, 0,0,0, c,
|
||||
ap.x0(), ap.y1()),
|
||||
video::S3DVertex(BS/2,-BS/2+d,-BS/2, 0,0,0, c,
|
||||
ap.x1(), ap.y1()),
|
||||
video::S3DVertex(BS/2,g*BS/2+d,BS/2, 0,0,0, c,
|
||||
ap.x1(), ap.y0()),
|
||||
video::S3DVertex(-BS/2,g*BS/2+d,BS/2, 0,0,0, c,
|
||||
ap.x0(), ap.y0()),
|
||||
};
|
||||
|
||||
for(s32 i=0; i<4; i++)
|
||||
|
|
|
@ -1,367 +0,0 @@
|
|||
/*
|
||||
Minetest
|
||||
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#include <vector>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
|
||||
#include "convert_json.h"
|
||||
#include "mods.h"
|
||||
#include "config.h"
|
||||
#include "log.h"
|
||||
|
||||
#if USE_CURL
|
||||
#include <curl/curl.h>
|
||||
|
||||
static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp)
|
||||
{
|
||||
((std::string*)userp)->append((char*)contents, size * nmemb);
|
||||
return size * nmemb;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Json::Value fetchJsonValue(const std::string url,
|
||||
struct curl_slist *chunk) {
|
||||
#if USE_CURL
|
||||
std::string liststring;
|
||||
CURL *curl;
|
||||
|
||||
curl = curl_easy_init();
|
||||
if (curl)
|
||||
{
|
||||
CURLcode res;
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &liststring);
|
||||
|
||||
if (chunk != 0)
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
|
||||
|
||||
|
||||
res = curl_easy_perform(curl);
|
||||
if (res != CURLE_OK)
|
||||
errorstream<<"Jsonreader: "<< url <<" not found (" << curl_easy_strerror(res) << ")" <<std::endl;
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
|
||||
Json::Value root;
|
||||
Json::Reader reader;
|
||||
std::istringstream stream(liststring);
|
||||
if (!liststring.size()) {
|
||||
return Json::Value();
|
||||
}
|
||||
|
||||
if (!reader.parse( stream, root ) )
|
||||
{
|
||||
errorstream << "URL: " << url << std::endl;
|
||||
errorstream << "Failed to parse json data " << reader.getFormattedErrorMessages();
|
||||
errorstream << "data: \"" << liststring << "\"" << std::endl;
|
||||
return Json::Value();
|
||||
}
|
||||
|
||||
if (root.isArray()) {
|
||||
return root;
|
||||
}
|
||||
if ((root["list"].isArray())) {
|
||||
return root["list"];
|
||||
}
|
||||
else {
|
||||
return root;
|
||||
}
|
||||
#endif
|
||||
return Json::Value();
|
||||
}
|
||||
|
||||
std::vector<ModStoreMod> readModStoreList(Json::Value& modlist) {
|
||||
std::vector<ModStoreMod> retval;
|
||||
|
||||
if (modlist.isArray()) {
|
||||
for (unsigned int i = 0; i < modlist.size(); i++)
|
||||
{
|
||||
ModStoreMod toadd;
|
||||
toadd.valid = true;
|
||||
|
||||
//id
|
||||
if (modlist[i]["id"].asString().size()) {
|
||||
const char* id_raw = modlist[i]["id"].asString().c_str();
|
||||
char* endptr = 0;
|
||||
int numbervalue = strtol(id_raw,&endptr,10);
|
||||
|
||||
if ((*id_raw != 0) && (*endptr == 0)) {
|
||||
toadd.id = numbervalue;
|
||||
}
|
||||
}
|
||||
else {
|
||||
toadd.valid = false;
|
||||
}
|
||||
|
||||
//title
|
||||
if (modlist[i]["title"].asString().size()) {
|
||||
toadd.title = modlist[i]["title"].asString();
|
||||
}
|
||||
else {
|
||||
toadd.valid = false;
|
||||
}
|
||||
|
||||
//basename
|
||||
if (modlist[i]["basename"].asString().size()) {
|
||||
toadd.basename = modlist[i]["basename"].asString();
|
||||
}
|
||||
else {
|
||||
toadd.valid = false;
|
||||
}
|
||||
|
||||
//author
|
||||
|
||||
//rating
|
||||
|
||||
//version
|
||||
|
||||
if (toadd.valid) {
|
||||
retval.push_back(toadd);
|
||||
}
|
||||
}
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
ModStoreModDetails readModStoreModDetails(Json::Value& details) {
|
||||
|
||||
ModStoreModDetails retval;
|
||||
|
||||
retval.valid = true;
|
||||
|
||||
//version set
|
||||
if (details["version_set"].isArray()) {
|
||||
for (unsigned int i = 0; i < details["version_set"].size(); i++)
|
||||
{
|
||||
ModStoreVersionEntry toadd;
|
||||
|
||||
if (details["version_set"][i]["id"].asString().size()) {
|
||||
const char* id_raw = details["version_set"][i]["id"].asString().c_str();
|
||||
char* endptr = 0;
|
||||
int numbervalue = strtol(id_raw,&endptr,10);
|
||||
|
||||
if ((*id_raw != 0) && (*endptr == 0)) {
|
||||
toadd.id = numbervalue;
|
||||
}
|
||||
}
|
||||
else {
|
||||
retval.valid = false;
|
||||
}
|
||||
|
||||
//date
|
||||
if (details["version_set"][i]["date"].asString().size()) {
|
||||
toadd.date = details["version_set"][i]["date"].asString();
|
||||
}
|
||||
|
||||
//file
|
||||
if (details["version_set"][i]["file"].asString().size()) {
|
||||
toadd.file = details["version_set"][i]["file"].asString();
|
||||
}
|
||||
else {
|
||||
retval.valid = false;
|
||||
}
|
||||
|
||||
//approved
|
||||
|
||||
//mtversion
|
||||
|
||||
if( retval.valid ) {
|
||||
retval.versions.push_back(toadd);
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (retval.versions.size() < 1) {
|
||||
retval.valid = false;
|
||||
}
|
||||
|
||||
//categories
|
||||
if (details["categories"].isObject()) {
|
||||
for (unsigned int i = 0; i < details["categories"].size(); i++) {
|
||||
ModStoreCategoryInfo toadd;
|
||||
|
||||
if (details["categories"][i]["id"].asString().size()) {
|
||||
|
||||
const char* id_raw = details["categories"][i]["id"].asString().c_str();
|
||||
char* endptr = 0;
|
||||
int numbervalue = strtol(id_raw,&endptr,10);
|
||||
|
||||
if ((*id_raw != 0) && (*endptr == 0)) {
|
||||
toadd.id = numbervalue;
|
||||
}
|
||||
}
|
||||
else {
|
||||
retval.valid = false;
|
||||
}
|
||||
if (details["categories"][i]["title"].asString().size()) {
|
||||
toadd.name = details["categories"][i]["title"].asString();
|
||||
}
|
||||
else {
|
||||
retval.valid = false;
|
||||
}
|
||||
|
||||
if( retval.valid ) {
|
||||
retval.categories.push_back(toadd);
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//author
|
||||
if (details["author"].isObject()) {
|
||||
if (details["author"]["id"].asString().size()) {
|
||||
|
||||
const char* id_raw = details["author"]["id"].asString().c_str();
|
||||
char* endptr = 0;
|
||||
int numbervalue = strtol(id_raw,&endptr,10);
|
||||
|
||||
if ((*id_raw != 0) && (*endptr == 0)) {
|
||||
retval.author.id = numbervalue;
|
||||
}
|
||||
else {
|
||||
retval.valid = false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
retval.valid = false;
|
||||
}
|
||||
|
||||
if (details["author"]["username"].asString().size()) {
|
||||
retval.author.username = details["author"]["username"].asString();
|
||||
}
|
||||
else {
|
||||
retval.valid = false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
retval.valid = false;
|
||||
}
|
||||
|
||||
//license
|
||||
if (details["license"].isObject()) {
|
||||
if (details["license"]["id"].asString().size()) {
|
||||
|
||||
const char* id_raw = details["license"]["id"].asString().c_str();
|
||||
char* endptr = 0;
|
||||
int numbervalue = strtol(id_raw,&endptr,10);
|
||||
|
||||
if ((*id_raw != 0) && (*endptr == 0)) {
|
||||
retval.license.id = numbervalue;
|
||||
}
|
||||
}
|
||||
else {
|
||||
retval.valid = false;
|
||||
}
|
||||
|
||||
if (details["license"]["short"].asString().size()) {
|
||||
retval.license.shortinfo = details["license"]["short"].asString();
|
||||
}
|
||||
else {
|
||||
retval.valid = false;
|
||||
}
|
||||
|
||||
if (details["license"]["link"].asString().size()) {
|
||||
retval.license.url = details["license"]["link"].asString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//id
|
||||
if (details["id"].asString().size()) {
|
||||
|
||||
const char* id_raw = details["id"].asString().c_str();
|
||||
char* endptr = 0;
|
||||
int numbervalue = strtol(id_raw,&endptr,10);
|
||||
|
||||
if ((*id_raw != 0) && (*endptr == 0)) {
|
||||
retval.id = numbervalue;
|
||||
}
|
||||
}
|
||||
else {
|
||||
retval.valid = false;
|
||||
}
|
||||
|
||||
//title
|
||||
if (details["title"].asString().size()) {
|
||||
retval.title = details["title"].asString();
|
||||
}
|
||||
else {
|
||||
retval.valid = false;
|
||||
}
|
||||
|
||||
//basename
|
||||
if (details["basename"].asString().size()) {
|
||||
retval.basename = details["basename"].asString();
|
||||
}
|
||||
else {
|
||||
retval.valid = false;
|
||||
}
|
||||
|
||||
//description
|
||||
if (details["desc"].asString().size()) {
|
||||
retval.description = details["desc"].asString();
|
||||
}
|
||||
|
||||
//repository
|
||||
if (details["replink"].asString().size()) {
|
||||
retval.repository = details["replink"].asString();
|
||||
}
|
||||
|
||||
//value
|
||||
if (details["rating"].asString().size()) {
|
||||
|
||||
const char* id_raw = details["rating"].asString().c_str();
|
||||
char* endptr = 0;
|
||||
float numbervalue = strtof(id_raw,&endptr);
|
||||
|
||||
if ((*id_raw != 0) && (*endptr == 0)) {
|
||||
retval.rating = numbervalue;
|
||||
}
|
||||
}
|
||||
else {
|
||||
retval.rating = 0.0;
|
||||
}
|
||||
|
||||
//depends
|
||||
if (details["depends"].isArray()) {
|
||||
//TODO
|
||||
}
|
||||
|
||||
//softdepends
|
||||
if (details["softdep"].isArray()) {
|
||||
//TODO
|
||||
}
|
||||
|
||||
//screenshot url
|
||||
if (details["screenshot_url"].asString().size()) {
|
||||
retval.screenshot_url = details["screenshot_url"].asString();
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
|
@ -94,6 +94,7 @@ void set_default_settings(Settings *settings)
|
|||
settings->setDefault("new_style_water", "false");
|
||||
settings->setDefault("new_style_leaves", "true");
|
||||
settings->setDefault("smooth_lighting", "true");
|
||||
settings->setDefault("enable_texture_atlas", "false");
|
||||
settings->setDefault("texture_path", "");
|
||||
settings->setDefault("shader_path", "");
|
||||
settings->setDefault("video_driver", "opengl");
|
||||
|
@ -126,8 +127,7 @@ void set_default_settings(Settings *settings)
|
|||
settings->setDefault("bilinear_filter", "false");
|
||||
settings->setDefault("trilinear_filter", "false");
|
||||
settings->setDefault("preload_item_visuals", "true");
|
||||
settings->setDefault("enable_bumpmapping", "false");
|
||||
settings->setDefault("enable_shaders", "true");
|
||||
settings->setDefault("enable_shaders", "2");
|
||||
settings->setDefault("repeat_rightclick_time", "0.25");
|
||||
settings->setDefault("enable_particles", "true");
|
||||
|
||||
|
@ -235,15 +235,12 @@ void set_default_settings(Settings *settings)
|
|||
settings->setDefault("mgv6_np_trees", "0, 1, (125, 125, 125), 2, 4, 0.66");
|
||||
settings->setDefault("mgv6_np_apple_trees", "0, 1, (100, 100, 100), 342902, 3, 0.45");
|
||||
|
||||
settings->setDefault("mgv7_np_terrain_base", "4, 70, (300, 300, 300), 82341, 6, 0.7");
|
||||
settings->setDefault("mgv7_np_terrain_alt", "4, 25, (600, 600, 600), 5934, 5, 0.6");
|
||||
settings->setDefault("mgv7_np_terrain_persist", "0.6, 0.1, (500, 500, 500), 539, 3, 0.6");
|
||||
settings->setDefault("mgv7_np_height_select", "-0.5, 1, (250, 250, 250), 4213, 5, 0.69");
|
||||
settings->setDefault("mgv7_np_filler_depth", "0, 1.2, (150, 150, 150), 261, 4, 0.7");
|
||||
settings->setDefault("mgv7_np_mount_height", "100, 30, (500, 500, 500), 72449, 4, 0.6");
|
||||
settings->setDefault("mgv7_np_ridge_uwater", "0, 1, (500, 500, 500), 85039, 4, 0.6");
|
||||
settings->setDefault("mgv7_np_mountain", "0, 1, (250, 350, 250), 5333, 5, 0.68");
|
||||
settings->setDefault("mgv7_np_ridge", "0, 1, (100, 120, 100), 6467, 4, 0.75");
|
||||
settings->setDefault("mgv7_np_terrain_base", "0, 80, (250, 250, 250), 82341, 5, 0.6");
|
||||
settings->setDefault("mgv7_np_terrain_alt", "0, 20, (250, 250, 250), 5934, 5, 0.6");
|
||||
settings->setDefault("mgv7_np_terrain_mod", "0, 1, (350, 350, 350), 85039, 5, 0.6");
|
||||
settings->setDefault("mgv7_np_terrain_persist", "0, 1, (500, 500, 500), 539, 3, 0.6");
|
||||
settings->setDefault("mgv7_np_height_select", "0.5, 0.5, (250, 250, 250), 4213, 5, 0.69");
|
||||
settings->setDefault("mgv7_np_ridge", "0, 1, (100, 100, 100), 6467, 4, 0.75");
|
||||
|
||||
settings->setDefault("mgindev_np_terrain_base", "-4, 20, (250, 250, 250), 82341, 5, 0.6, 10, 10");
|
||||
settings->setDefault("mgindev_np_terrain_higher", "20, 16, (500, 500, 500), 85039, 5, 0.6, 10, 10");
|
||||
|
@ -260,11 +257,6 @@ void set_default_settings(Settings *settings)
|
|||
// IPv6
|
||||
settings->setDefault("enable_ipv6", "true");
|
||||
settings->setDefault("ipv6_server", "false");
|
||||
|
||||
settings->setDefault("modstore_download_url", "http://forum.minetest.net/media/");
|
||||
settings->setDefault("modstore_listmods_url", "http://forum.minetest.net/mmdb/mods/");
|
||||
settings->setDefault("modstore_details_url", "http://forum.minetest.net/mmdb/mod/*/");
|
||||
|
||||
}
|
||||
|
||||
void override_default_settings(Settings *settings, Settings *from)
|
||||
|
|
|
@ -204,7 +204,7 @@ void Environment::printPlayers(std::ostream &o)
|
|||
|
||||
u32 Environment::getDayNightRatio()
|
||||
{
|
||||
bool smooth = g_settings->getBool("enable_shaders");
|
||||
bool smooth = (g_settings->getS32("enable_shaders") != 0);
|
||||
return time_to_daynight_ratio(m_time_of_day_f*24000, smooth);
|
||||
}
|
||||
|
||||
|
|
|
@ -65,7 +65,7 @@ FarMesh::FarMesh(
|
|||
m_materials[1].setFlag(video::EMF_BACK_FACE_CULLING, false);
|
||||
m_materials[1].setFlag(video::EMF_BILINEAR_FILTER, false);
|
||||
m_materials[1].setFlag(video::EMF_FOG_ENABLE, false);
|
||||
m_materials[1].setTexture(0, client->tsrc()->getTexture("treeprop.png"));
|
||||
m_materials[1].setTexture(0, client->tsrc()->getTextureRaw("treeprop.png"));
|
||||
m_materials[1].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
|
||||
m_materials[1].setFlag(video::EMF_FOG_ENABLE, true);
|
||||
|
||||
|
|
267
src/filesys.cpp
267
src/filesys.cpp
|
@ -20,9 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#include "filesys.h"
|
||||
#include "strfnd.h"
|
||||
#include <iostream>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include "log.h"
|
||||
|
||||
namespace fs
|
||||
|
@ -32,9 +30,11 @@ namespace fs
|
|||
|
||||
#define _WIN32_WINNT 0x0501
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <malloc.h>
|
||||
#include <tchar.h>
|
||||
#include <wchar.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define BUFSIZE MAX_PATH
|
||||
|
||||
|
@ -145,11 +145,6 @@ bool IsDir(std::string path)
|
|||
(attr & FILE_ATTRIBUTE_DIRECTORY));
|
||||
}
|
||||
|
||||
bool IsDirDelimiter(char c)
|
||||
{
|
||||
return c == '/' || c == '\\';
|
||||
}
|
||||
|
||||
bool RecursiveDelete(std::string path)
|
||||
{
|
||||
infostream<<"Recursively deleting \""<<path<<"\""<<std::endl;
|
||||
|
@ -212,26 +207,11 @@ bool DeleteSingleFileOrEmptyDirectory(std::string path)
|
|||
}
|
||||
}
|
||||
|
||||
std::string TempPath()
|
||||
{
|
||||
DWORD bufsize = GetTempPath(0, "");
|
||||
if(bufsize == 0){
|
||||
errorstream<<"GetTempPath failed, error = "<<GetLastError()<<std::endl;
|
||||
return "";
|
||||
}
|
||||
std::vector<char> buf(bufsize);
|
||||
DWORD len = GetTempPath(bufsize, &buf[0]);
|
||||
if(len == 0 || len > bufsize){
|
||||
errorstream<<"GetTempPath failed, error = "<<GetLastError()<<std::endl;
|
||||
return "";
|
||||
}
|
||||
return std::string(buf.begin(), buf.begin() + len);
|
||||
}
|
||||
|
||||
#else // POSIX
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <dirent.h>
|
||||
#include <errno.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/wait.h>
|
||||
#include <unistd.h>
|
||||
|
@ -321,11 +301,6 @@ bool IsDir(std::string path)
|
|||
return ((statbuf.st_mode & S_IFDIR) == S_IFDIR);
|
||||
}
|
||||
|
||||
bool IsDirDelimiter(char c)
|
||||
{
|
||||
return c == '/';
|
||||
}
|
||||
|
||||
bool RecursiveDelete(std::string path)
|
||||
{
|
||||
/*
|
||||
|
@ -389,20 +364,6 @@ bool DeleteSingleFileOrEmptyDirectory(std::string path)
|
|||
}
|
||||
}
|
||||
|
||||
std::string TempPath()
|
||||
{
|
||||
/*
|
||||
Should the environment variables TMPDIR, TMP and TEMP
|
||||
and the macro P_tmpdir (if defined by stdio.h) be checked
|
||||
before falling back on /tmp?
|
||||
|
||||
Probably not, because this function is intended to be
|
||||
compatible with lua's os.tmpname which under the default
|
||||
configuration hardcodes mkstemp("/tmp/lua_XXXXXX").
|
||||
*/
|
||||
return std::string(DIR_DELIM) + "tmp";
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void GetRecursiveSubPaths(std::string path, std::vector<std::string> &dst)
|
||||
|
@ -453,14 +414,16 @@ bool RecursiveDeleteContent(std::string path)
|
|||
bool CreateAllDirs(std::string path)
|
||||
{
|
||||
|
||||
size_t pos;
|
||||
std::vector<std::string> tocreate;
|
||||
std::string basepath = path;
|
||||
while(!PathExists(basepath))
|
||||
{
|
||||
tocreate.push_back(basepath);
|
||||
basepath = RemoveLastPathComponent(basepath);
|
||||
if(basepath.empty())
|
||||
pos = basepath.rfind(DIR_DELIM_C);
|
||||
if(pos == std::string::npos)
|
||||
break;
|
||||
basepath = basepath.substr(0,pos);
|
||||
}
|
||||
for(int i=tocreate.size()-1;i>=0;i--)
|
||||
if(!CreateDir(tocreate[i]))
|
||||
|
@ -468,221 +431,5 @@ bool CreateAllDirs(std::string path)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool CopyFileContents(std::string source, std::string target)
|
||||
{
|
||||
FILE *sourcefile = fopen(source.c_str(), "rb");
|
||||
if(sourcefile == NULL){
|
||||
errorstream<<source<<": can't open for reading: "
|
||||
<<strerror(errno)<<std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
FILE *targetfile = fopen(target.c_str(), "wb");
|
||||
if(targetfile == NULL){
|
||||
errorstream<<target<<": can't open for writing: "
|
||||
<<strerror(errno)<<std::endl;
|
||||
fclose(sourcefile);
|
||||
return false;
|
||||
}
|
||||
|
||||
size_t total = 0;
|
||||
bool retval = true;
|
||||
bool done = false;
|
||||
char readbuffer[BUFSIZ];
|
||||
while(!done){
|
||||
size_t readbytes = fread(readbuffer, 1,
|
||||
sizeof(readbuffer), sourcefile);
|
||||
total += readbytes;
|
||||
if(ferror(sourcefile)){
|
||||
errorstream<<source<<": IO error: "
|
||||
<<strerror(errno)<<std::endl;
|
||||
retval = false;
|
||||
done = true;
|
||||
}
|
||||
if(readbytes > 0){
|
||||
fwrite(readbuffer, 1, readbytes, targetfile);
|
||||
}
|
||||
if(feof(sourcefile) || ferror(sourcefile)){
|
||||
// flush destination file to catch write errors
|
||||
// (e.g. disk full)
|
||||
fflush(targetfile);
|
||||
done = true;
|
||||
}
|
||||
if(ferror(targetfile)){
|
||||
errorstream<<target<<": IO error: "
|
||||
<<strerror(errno)<<std::endl;
|
||||
retval = false;
|
||||
done = true;
|
||||
}
|
||||
}
|
||||
infostream<<"copied "<<total<<" bytes from "
|
||||
<<source<<" to "<<target<<std::endl;
|
||||
fclose(sourcefile);
|
||||
fclose(targetfile);
|
||||
return retval;
|
||||
}
|
||||
|
||||
bool CopyDir(std::string source, std::string target)
|
||||
{
|
||||
if(PathExists(source)){
|
||||
if(!PathExists(target)){
|
||||
fs::CreateAllDirs(target);
|
||||
}
|
||||
bool retval = true;
|
||||
std::vector<DirListNode> content = fs::GetDirListing(source);
|
||||
|
||||
for(unsigned int i=0; i < content.size(); i++){
|
||||
std::string sourcechild = source + DIR_DELIM + content[i].name;
|
||||
std::string targetchild = target + DIR_DELIM + content[i].name;
|
||||
if(content[i].dir){
|
||||
if(!fs::CopyDir(sourcechild, targetchild)){
|
||||
retval = false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if(!fs::CopyFileContents(sourcechild, targetchild)){
|
||||
retval = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool PathStartsWith(std::string path, std::string prefix)
|
||||
{
|
||||
size_t pathsize = path.size();
|
||||
size_t pathpos = 0;
|
||||
size_t prefixsize = prefix.size();
|
||||
size_t prefixpos = 0;
|
||||
for(;;){
|
||||
bool delim1 = pathpos == pathsize
|
||||
|| IsDirDelimiter(path[pathpos]);
|
||||
bool delim2 = prefixpos == prefixsize
|
||||
|| IsDirDelimiter(prefix[prefixpos]);
|
||||
|
||||
if(delim1 != delim2)
|
||||
return false;
|
||||
|
||||
if(delim1){
|
||||
while(pathpos < pathsize &&
|
||||
IsDirDelimiter(path[pathpos]))
|
||||
++pathpos;
|
||||
while(prefixpos < prefixsize &&
|
||||
IsDirDelimiter(prefix[prefixpos]))
|
||||
++prefixpos;
|
||||
if(prefixpos == prefixsize)
|
||||
return true;
|
||||
if(pathpos == pathsize)
|
||||
return false;
|
||||
}
|
||||
else{
|
||||
size_t len = 0;
|
||||
do{
|
||||
char pathchar = path[pathpos+len];
|
||||
char prefixchar = prefix[prefixpos+len];
|
||||
if(FILESYS_CASE_INSENSITIVE){
|
||||
pathchar = tolower(pathchar);
|
||||
prefixchar = tolower(prefixchar);
|
||||
}
|
||||
if(pathchar != prefixchar)
|
||||
return false;
|
||||
++len;
|
||||
} while(pathpos+len < pathsize
|
||||
&& !IsDirDelimiter(path[pathpos+len])
|
||||
&& prefixpos+len < prefixsize
|
||||
&& !IsDirDelimiter(
|
||||
prefix[prefixsize+len]));
|
||||
pathpos += len;
|
||||
prefixpos += len;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::string RemoveLastPathComponent(std::string path,
|
||||
std::string *removed, int count)
|
||||
{
|
||||
if(removed)
|
||||
*removed = "";
|
||||
|
||||
size_t remaining = path.size();
|
||||
|
||||
for(int i = 0; i < count; ++i){
|
||||
// strip a dir delimiter
|
||||
while(remaining != 0 && IsDirDelimiter(path[remaining-1]))
|
||||
remaining--;
|
||||
// strip a path component
|
||||
size_t component_end = remaining;
|
||||
while(remaining != 0 && !IsDirDelimiter(path[remaining-1]))
|
||||
remaining--;
|
||||
size_t component_start = remaining;
|
||||
// strip a dir delimiter
|
||||
while(remaining != 0 && IsDirDelimiter(path[remaining-1]))
|
||||
remaining--;
|
||||
if(removed){
|
||||
std::string component = path.substr(component_start,
|
||||
component_end - component_start);
|
||||
if(i)
|
||||
*removed = component + DIR_DELIM + *removed;
|
||||
else
|
||||
*removed = component;
|
||||
}
|
||||
}
|
||||
return path.substr(0, remaining);
|
||||
}
|
||||
|
||||
std::string RemoveRelativePathComponents(std::string path)
|
||||
{
|
||||
size_t pos = path.size();
|
||||
size_t dotdot_count = 0;
|
||||
while(pos != 0){
|
||||
size_t component_with_delim_end = pos;
|
||||
// skip a dir delimiter
|
||||
while(pos != 0 && IsDirDelimiter(path[pos-1]))
|
||||
pos--;
|
||||
// strip a path component
|
||||
size_t component_end = pos;
|
||||
while(pos != 0 && !IsDirDelimiter(path[pos-1]))
|
||||
pos--;
|
||||
size_t component_start = pos;
|
||||
|
||||
std::string component = path.substr(component_start,
|
||||
component_end - component_start);
|
||||
bool remove_this_component = false;
|
||||
if(component == "."){
|
||||
remove_this_component = true;
|
||||
}
|
||||
else if(component == ".."){
|
||||
remove_this_component = true;
|
||||
dotdot_count += 1;
|
||||
}
|
||||
else if(dotdot_count != 0){
|
||||
remove_this_component = true;
|
||||
dotdot_count -= 1;
|
||||
}
|
||||
|
||||
if(remove_this_component){
|
||||
while(pos != 0 && IsDirDelimiter(path[pos-1]))
|
||||
pos--;
|
||||
path = path.substr(0, pos) + DIR_DELIM +
|
||||
path.substr(component_with_delim_end,
|
||||
std::string::npos);
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
|
||||
if(dotdot_count > 0)
|
||||
return "";
|
||||
|
||||
// remove trailing dir delimiters
|
||||
pos = path.size();
|
||||
while(pos != 0 && IsDirDelimiter(path[pos-1]))
|
||||
pos--;
|
||||
return path.substr(0, pos);
|
||||
}
|
||||
|
||||
} // namespace fs
|
||||
|
||||
|
|
|
@ -26,10 +26,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
|
||||
#ifdef _WIN32 // WINDOWS
|
||||
#define DIR_DELIM "\\"
|
||||
#define FILESYS_CASE_INSENSITIVE 1
|
||||
#define DIR_DELIM_C '\\'
|
||||
#else // POSIX
|
||||
#define DIR_DELIM "/"
|
||||
#define FILESYS_CASE_INSENSITIVE 0
|
||||
#define DIR_DELIM_C '/'
|
||||
#endif
|
||||
|
||||
namespace fs
|
||||
|
@ -49,17 +49,12 @@ bool PathExists(std::string path);
|
|||
|
||||
bool IsDir(std::string path);
|
||||
|
||||
bool IsDirDelimiter(char c);
|
||||
|
||||
// Only pass full paths to this one. True on success.
|
||||
// NOTE: The WIN32 version returns always true.
|
||||
bool RecursiveDelete(std::string path);
|
||||
|
||||
bool DeleteSingleFileOrEmptyDirectory(std::string path);
|
||||
|
||||
// Returns path to temp directory, can return "" on error
|
||||
std::string TempPath();
|
||||
|
||||
/* Multiplatform */
|
||||
|
||||
// The path itself not included
|
||||
|
@ -74,30 +69,6 @@ bool RecursiveDeleteContent(std::string path);
|
|||
// Create all directories on the given path that don't already exist.
|
||||
bool CreateAllDirs(std::string path);
|
||||
|
||||
// Copy a regular file
|
||||
bool CopyFileContents(std::string source, std::string target);
|
||||
|
||||
// Copy directory and all subdirectories
|
||||
// Omits files and subdirectories that start with a period
|
||||
bool CopyDir(std::string source, std::string target);
|
||||
|
||||
// Check if one path is prefix of another
|
||||
// For example, "/tmp" is a prefix of "/tmp" and "/tmp/file" but not "/tmp2"
|
||||
// Ignores case differences and '/' vs. '\\' on Windows
|
||||
bool PathStartsWith(std::string path, std::string prefix);
|
||||
|
||||
// Remove last path component and the dir delimiter before and/or after it,
|
||||
// returns "" if there is only one path component.
|
||||
// removed: If non-NULL, receives the removed component(s).
|
||||
// count: Number of components to remove
|
||||
std::string RemoveLastPathComponent(std::string path,
|
||||
std::string *removed = NULL, int count = 1);
|
||||
|
||||
// Remove "." and ".." path components and for every ".." removed, remove
|
||||
// the last normal path component before it. Unlike AbsolutePath,
|
||||
// this does not resolve symlinks and check for existence of directories.
|
||||
std::string RemoveRelativePathComponents(std::string path);
|
||||
|
||||
}//fs
|
||||
|
||||
#endif
|
||||
|
|
88
src/game.cpp
88
src/game.cpp
|
@ -208,6 +208,33 @@ public:
|
|||
Client *m_client;
|
||||
};
|
||||
|
||||
class FormspecFormSource: public IFormSource
|
||||
{
|
||||
public:
|
||||
FormspecFormSource(std::string formspec,FormspecFormSource** game_formspec)
|
||||
{
|
||||
m_formspec = formspec;
|
||||
m_game_formspec = game_formspec;
|
||||
}
|
||||
|
||||
~FormspecFormSource()
|
||||
{
|
||||
*m_game_formspec = 0;
|
||||
}
|
||||
|
||||
void setForm(std::string formspec) {
|
||||
m_formspec = formspec;
|
||||
}
|
||||
|
||||
std::string getForm()
|
||||
{
|
||||
return m_formspec;
|
||||
}
|
||||
|
||||
std::string m_formspec;
|
||||
FormspecFormSource** m_game_formspec;
|
||||
};
|
||||
|
||||
/*
|
||||
Check if a node is pointable
|
||||
*/
|
||||
|
@ -804,10 +831,6 @@ public:
|
|||
u32 daynight_ratio = m_client->getEnv().getDayNightRatio();
|
||||
float daynight_ratio_f = (float)daynight_ratio / 1000.0;
|
||||
services->setPixelShaderConstant("dayNightRatio", &daynight_ratio_f, 1);
|
||||
|
||||
// Normal map texture layer
|
||||
int layer = 1;
|
||||
services->setPixelShaderConstant("normalTexture" , (irr::f32*)&layer, 1);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -1209,28 +1232,26 @@ void the_game(
|
|||
}
|
||||
|
||||
// Display status
|
||||
std::ostringstream ss;
|
||||
int progress=0;
|
||||
if (!client.itemdefReceived())
|
||||
{
|
||||
wchar_t* text = wgettext("Item definitions...");
|
||||
ss << "Item definitions...";
|
||||
progress = 0;
|
||||
draw_load_screen(text, device, font, dtime, progress);
|
||||
delete[] text;
|
||||
}
|
||||
else if (!client.nodedefReceived())
|
||||
{
|
||||
wchar_t* text = wgettext("Node definitions...");
|
||||
ss << "Node definitions...";
|
||||
progress = 25;
|
||||
draw_load_screen(text, device, font, dtime, progress);
|
||||
delete[] text;
|
||||
}
|
||||
else
|
||||
{
|
||||
wchar_t* text = wgettext("Media...");
|
||||
ss << "Media...";
|
||||
progress = 50+client.mediaReceiveProgress()*50+0.5;
|
||||
draw_load_screen(text, device, font, dtime, progress);
|
||||
delete[] text;
|
||||
}
|
||||
wchar_t* text = wgettext(ss.str().c_str());
|
||||
draw_load_screen(text, device, font, dtime, progress);
|
||||
delete[] text;
|
||||
|
||||
// On some computers framerate doesn't seem to be
|
||||
// automatically limited
|
||||
|
@ -1322,7 +1343,7 @@ void the_game(
|
|||
*/
|
||||
int crack_animation_length = 5;
|
||||
{
|
||||
video::ITexture *t = tsrc->getTexture("crack_anylength.png");
|
||||
video::ITexture *t = tsrc->getTextureRaw("crack_anylength.png");
|
||||
v2u32 size = t->getOriginalSize();
|
||||
crack_animation_length = size.Y / size.X;
|
||||
}
|
||||
|
@ -2289,7 +2310,7 @@ void the_game(
|
|||
else if(event.type == CE_SPAWN_PARTICLE)
|
||||
{
|
||||
LocalPlayer* player = client.getEnv().getLocalPlayer();
|
||||
video::ITexture *texture =
|
||||
AtlasPointer ap =
|
||||
gamedef->tsrc()->getTexture(*(event.spawn_particle.texture));
|
||||
|
||||
new Particle(gamedef, smgr, player, client.getEnv(),
|
||||
|
@ -2298,15 +2319,12 @@ void the_game(
|
|||
*event.spawn_particle.acc,
|
||||
event.spawn_particle.expirationtime,
|
||||
event.spawn_particle.size,
|
||||
event.spawn_particle.collisiondetection,
|
||||
texture,
|
||||
v2f(0.0, 0.0),
|
||||
v2f(1.0, 1.0));
|
||||
event.spawn_particle.collisiondetection, ap);
|
||||
}
|
||||
else if(event.type == CE_ADD_PARTICLESPAWNER)
|
||||
{
|
||||
LocalPlayer* player = client.getEnv().getLocalPlayer();
|
||||
video::ITexture *texture =
|
||||
AtlasPointer ap =
|
||||
gamedef->tsrc()->getTexture(*(event.add_particlespawner.texture));
|
||||
|
||||
new ParticleSpawner(gamedef, smgr, player,
|
||||
|
@ -2323,7 +2341,7 @@ void the_game(
|
|||
event.add_particlespawner.minsize,
|
||||
event.add_particlespawner.maxsize,
|
||||
event.add_particlespawner.collisiondetection,
|
||||
texture,
|
||||
ap,
|
||||
event.add_particlespawner.id);
|
||||
}
|
||||
else if(event.type == CE_DELETE_PARTICLESPAWNER)
|
||||
|
@ -2612,6 +2630,20 @@ void the_game(
|
|||
if(tp)
|
||||
params = getDigParams(nodedef->get(n).groups, tp);
|
||||
}
|
||||
|
||||
SimpleSoundSpec sound_dig = nodedef->get(n).sound_dig;
|
||||
if(sound_dig.exists()){
|
||||
if(sound_dig.name == "__group"){
|
||||
if(params.main_group != ""){
|
||||
soundmaker.m_player_leftpunch_sound.gain = 0.5;
|
||||
soundmaker.m_player_leftpunch_sound.name =
|
||||
std::string("default_dig_") +
|
||||
params.main_group;
|
||||
}
|
||||
} else{
|
||||
soundmaker.m_player_leftpunch_sound = sound_dig;
|
||||
}
|
||||
}
|
||||
|
||||
float dig_time_complete = 0.0;
|
||||
|
||||
|
@ -2644,20 +2676,6 @@ void the_game(
|
|||
dig_index = crack_animation_length;
|
||||
}
|
||||
|
||||
SimpleSoundSpec sound_dig = nodedef->get(n).sound_dig;
|
||||
if(sound_dig.exists() && params.diggable){
|
||||
if(sound_dig.name == "__group"){
|
||||
if(params.main_group != ""){
|
||||
soundmaker.m_player_leftpunch_sound.gain = 0.5;
|
||||
soundmaker.m_player_leftpunch_sound.name =
|
||||
std::string("default_dig_") +
|
||||
params.main_group;
|
||||
}
|
||||
} else{
|
||||
soundmaker.m_player_leftpunch_sound = sound_dig;
|
||||
}
|
||||
}
|
||||
|
||||
// Don't show cracks if not diggable
|
||||
if(dig_time_complete >= 100000.0)
|
||||
{
|
||||
|
|
|
@ -0,0 +1,693 @@
|
|||
/*
|
||||
Minetest
|
||||
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <map>
|
||||
|
||||
#include "guiConfigureWorld.h"
|
||||
#include "guiMessageMenu.h"
|
||||
#include <IGUIButton.h>
|
||||
#include <IGUICheckBox.h>
|
||||
#include <IGUIListBox.h>
|
||||
#include <IGUIStaticText.h>
|
||||
#include <IGUITreeView.h>
|
||||
#include "gettext.h"
|
||||
#include "util/string.h"
|
||||
#include "settings.h"
|
||||
#include "filesys.h"
|
||||
|
||||
enum
|
||||
{
|
||||
GUI_ID_MOD_TREEVIEW = 101,
|
||||
GUI_ID_ENABLED_CHECKBOX,
|
||||
GUI_ID_ENABLEALL,
|
||||
GUI_ID_DISABLEALL,
|
||||
GUI_ID_DEPENDS_LISTBOX,
|
||||
GUI_ID_RDEPENDS_LISTBOX,
|
||||
GUI_ID_CANCEL,
|
||||
GUI_ID_SAVE
|
||||
};
|
||||
|
||||
#define QUESTIONMARK_STR L"?"
|
||||
#define CHECKMARK_STR L"\411"
|
||||
#define CROSS_STR L"\403"
|
||||
|
||||
GUIConfigureWorld::GUIConfigureWorld(gui::IGUIEnvironment* env,
|
||||
gui::IGUIElement* parent, s32 id,
|
||||
IMenuManager *menumgr, WorldSpec wspec):
|
||||
GUIModalMenu(env, parent, id, menumgr),
|
||||
m_wspec(wspec),
|
||||
m_gspec(findWorldSubgame(m_wspec.path)),
|
||||
m_menumgr(menumgr)
|
||||
{
|
||||
//will be initialized in regenerateGUI()
|
||||
m_treeview=NULL;
|
||||
|
||||
// game mods
|
||||
m_gamemods = flattenModTree(getModsInPath(m_gspec.gamemods_path));
|
||||
|
||||
// world mods
|
||||
std::string worldmods_path = wspec.path + DIR_DELIM + "worldmods";
|
||||
m_worldmods = flattenModTree(getModsInPath(worldmods_path));
|
||||
|
||||
// fill m_addontree with add-on mods
|
||||
std::set<std::string> paths = m_gspec.addon_mods_paths;
|
||||
for(std::set<std::string>::iterator it=paths.begin();
|
||||
it != paths.end(); ++it)
|
||||
{
|
||||
std::map<std::string,ModSpec> mods = getModsInPath(*it);
|
||||
m_addontree.insert(mods.begin(), mods.end());
|
||||
}
|
||||
|
||||
// expand modpacks
|
||||
m_addonmods = flattenModTree(m_addontree);
|
||||
|
||||
// collect reverse dependencies
|
||||
for(std::map<std::string, ModSpec>::iterator it = m_addonmods.begin();
|
||||
it != m_addonmods.end(); ++it)
|
||||
{
|
||||
std::string modname = (*it).first;
|
||||
ModSpec mod = (*it).second;
|
||||
for(std::set<std::string>::iterator dep_it = mod.depends.begin();
|
||||
dep_it != mod.depends.end(); ++dep_it)
|
||||
{
|
||||
m_reverse_depends.insert(std::make_pair((*dep_it),modname));
|
||||
}
|
||||
}
|
||||
|
||||
m_settings.readConfigFile((m_wspec.path + DIR_DELIM + "world.mt").c_str());
|
||||
std::vector<std::string> names = m_settings.getNames();
|
||||
|
||||
// mod_names contains the names of mods mentioned in the world.mt file
|
||||
std::set<std::string> mod_names;
|
||||
for(std::vector<std::string>::iterator it = names.begin();
|
||||
it != names.end(); ++it)
|
||||
{
|
||||
std::string name = *it;
|
||||
if (name.compare(0,9,"load_mod_")==0)
|
||||
mod_names.insert(name.substr(9));
|
||||
}
|
||||
|
||||
// find new mods (installed but not mentioned in world.mt)
|
||||
for(std::map<std::string, ModSpec>::iterator it = m_addonmods.begin();
|
||||
it != m_addonmods.end(); ++it)
|
||||
{
|
||||
std::string modname = (*it).first;
|
||||
ModSpec mod = (*it).second;
|
||||
// a mod is new if it is not a modpack, and does not occur in
|
||||
// mod_names
|
||||
if(!mod.is_modpack &&
|
||||
mod_names.count(modname) == 0)
|
||||
m_settings.setBool("load_mod_"+modname, false);
|
||||
}
|
||||
// find missing mods (mentioned in world.mt, but not installed)
|
||||
for(std::set<std::string>::iterator it = mod_names.begin();
|
||||
it != mod_names.end(); ++it)
|
||||
{
|
||||
std::string modname = *it;
|
||||
if(m_addonmods.count(modname) == 0)
|
||||
m_settings.remove("load_mod_"+modname);
|
||||
}
|
||||
std::string worldmtfile = m_wspec.path+DIR_DELIM+"world.mt";
|
||||
m_settings.updateConfigFile(worldmtfile.c_str());
|
||||
}
|
||||
|
||||
void GUIConfigureWorld::drawMenu()
|
||||
{
|
||||
gui::IGUISkin* skin = Environment->getSkin();
|
||||
if (!skin)
|
||||
return;
|
||||
video::IVideoDriver* driver = Environment->getVideoDriver();
|
||||
|
||||
video::SColor bgcolor(140,0,0,0);
|
||||
driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect);
|
||||
|
||||
gui::IGUIElement::draw();
|
||||
}
|
||||
|
||||
|
||||
void GUIConfigureWorld::regenerateGui(v2u32 screensize)
|
||||
{
|
||||
|
||||
/*
|
||||
Remove stuff
|
||||
*/
|
||||
removeChildren();
|
||||
|
||||
/*
|
||||
Calculate new sizes and positions
|
||||
*/
|
||||
core::rect<s32> rect(
|
||||
screensize.X/2 - 580/2,
|
||||
screensize.Y/2 - 300/2,
|
||||
screensize.X/2 + 580/2,
|
||||
screensize.Y/2 + 300/2
|
||||
);
|
||||
|
||||
DesiredRect = rect;
|
||||
recalculateAbsolutePosition(false);
|
||||
|
||||
v2s32 topleft = v2s32(10, 10);
|
||||
|
||||
/*
|
||||
Add stuff
|
||||
*/
|
||||
changeCtype("");
|
||||
{
|
||||
core::rect<s32> rect(0, 0, 200, 20);
|
||||
rect += topleft;
|
||||
//proper text is set below, when a mod is selected
|
||||
m_modname_text = Environment->addStaticText(L"Mod: N/A", rect, false,
|
||||
false, this, -1);
|
||||
}
|
||||
{
|
||||
core::rect<s32> rect(0, 0, 200, 20);
|
||||
rect += v2s32(0, 25) + topleft;
|
||||
wchar_t* text = wgettext("enabled");
|
||||
m_enabled_checkbox =
|
||||
Environment->addCheckBox(false, rect, this, GUI_ID_ENABLED_CHECKBOX,
|
||||
text);
|
||||
delete[] text;
|
||||
m_enabled_checkbox->setVisible(false);
|
||||
}
|
||||
{
|
||||
core::rect<s32> rect(0, 0, 85, 30);
|
||||
rect = rect + v2s32(0, 25) + topleft;
|
||||
wchar_t* text = wgettext("Enable All");
|
||||
m_enableall = Environment->addButton(rect, this, GUI_ID_ENABLEALL,
|
||||
text);
|
||||
delete[] text;
|
||||
m_enableall->setVisible(false);
|
||||
}
|
||||
{
|
||||
core::rect<s32> rect(0, 0, 85, 30);
|
||||
rect = rect + v2s32(115, 25) + topleft;
|
||||
wchar_t* text = wgettext("Disable All");
|
||||
m_disableall = Environment->addButton(rect, this, GUI_ID_DISABLEALL, text );
|
||||
delete[] text;
|
||||
m_disableall->setVisible(false);
|
||||
}
|
||||
{
|
||||
core::rect<s32> rect(0, 0, 200, 20);
|
||||
rect += v2s32(0, 60) + topleft;
|
||||
wchar_t* text = wgettext("depends on:");
|
||||
Environment->addStaticText(text, rect, false, false, this, -1);
|
||||
delete[] text;
|
||||
}
|
||||
{
|
||||
core::rect<s32> rect(0, 0, 200, 85);
|
||||
rect += v2s32(0, 80) + topleft;
|
||||
m_dependencies_listbox =
|
||||
Environment->addListBox(rect, this, GUI_ID_DEPENDS_LISTBOX, true);
|
||||
}
|
||||
{
|
||||
core::rect<s32> rect(0, 0, 200, 20);
|
||||
rect += v2s32(0, 175) + topleft;
|
||||
wchar_t* text = wgettext("is required by:");
|
||||
Environment->addStaticText( text, rect, false, false, this, -1);
|
||||
delete[] text;
|
||||
}
|
||||
{
|
||||
core::rect<s32> rect(0, 0, 200, 85);
|
||||
rect += v2s32(0, 195) + topleft;
|
||||
m_rdependencies_listbox =
|
||||
Environment->addListBox(rect,this, GUI_ID_RDEPENDS_LISTBOX,true);
|
||||
}
|
||||
{
|
||||
core::rect<s32> rect(0, 0, 340, 250);
|
||||
rect += v2s32(220, 0) + topleft;
|
||||
m_treeview = Environment->addTreeView(rect, this,
|
||||
GUI_ID_MOD_TREEVIEW,true);
|
||||
gui::IGUITreeViewNode* node
|
||||
= m_treeview->getRoot()->addChildBack(L"Add-Ons");
|
||||
buildTreeView(m_addontree, node);
|
||||
}
|
||||
{
|
||||
core::rect<s32> rect(0, 0, 120, 30);
|
||||
rect = rect + v2s32(330, 270) - topleft;
|
||||
wchar_t* text = wgettext("Cancel");
|
||||
Environment->addButton(rect, this, GUI_ID_CANCEL, text);
|
||||
delete[] text;
|
||||
}
|
||||
{
|
||||
core::rect<s32> rect(0, 0, 120, 30);
|
||||
rect = rect + v2s32(460, 270) - topleft;
|
||||
wchar_t* text = wgettext("Save");
|
||||
Environment->addButton(rect, this, GUI_ID_SAVE, text);
|
||||
delete[] text;
|
||||
}
|
||||
changeCtype("C");
|
||||
|
||||
// at start, none of the treeview nodes is selected, so we select
|
||||
// the first element in the treeview of mods manually here.
|
||||
if(m_treeview->getRoot()->hasChilds())
|
||||
{
|
||||
m_treeview->getRoot()->getFirstChild()->setExpanded(true);
|
||||
m_treeview->getRoot()->getFirstChild()->setSelected(true);
|
||||
// Because a manual ->setSelected() doesn't cause an event, we
|
||||
// have to do this here:
|
||||
adjustSidebar();
|
||||
}
|
||||
}
|
||||
|
||||
bool GUIConfigureWorld::OnEvent(const SEvent& event)
|
||||
{
|
||||
|
||||
gui::IGUITreeViewNode* selected_node = NULL;
|
||||
if(m_treeview != NULL)
|
||||
selected_node = m_treeview->getSelected();
|
||||
|
||||
if(event.EventType==EET_KEY_INPUT_EVENT && event.KeyInput.PressedDown)
|
||||
{
|
||||
switch (event.KeyInput.Key) {
|
||||
case KEY_ESCAPE: {
|
||||
quitMenu();
|
||||
return true;
|
||||
}
|
||||
// irrlicht's built-in TreeView gui has no keyboard control,
|
||||
// so we do it here: up/down to select prev/next node,
|
||||
// left/right to collapse/expand nodes, space to toggle
|
||||
// enabled/disabled.
|
||||
case KEY_DOWN: {
|
||||
if(selected_node != NULL)
|
||||
{
|
||||
gui::IGUITreeViewNode* node = selected_node->getNextVisible();
|
||||
if(node != NULL)
|
||||
{
|
||||
node->setSelected(true);
|
||||
adjustSidebar();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
case KEY_UP: {
|
||||
if(selected_node != NULL)
|
||||
{
|
||||
gui::IGUITreeViewNode* node = selected_node->getPrevSibling();
|
||||
if(node!=NULL)
|
||||
{
|
||||
node->setSelected(true);
|
||||
adjustSidebar();
|
||||
}
|
||||
else
|
||||
{
|
||||
gui::IGUITreeViewNode* parent = selected_node->getParent();
|
||||
if(selected_node == parent->getFirstChild() &&
|
||||
parent != m_treeview->getRoot())
|
||||
{
|
||||
parent->setSelected(true);
|
||||
adjustSidebar();
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
case KEY_RIGHT: {
|
||||
if(selected_node != NULL && selected_node->hasChilds())
|
||||
selected_node->setExpanded(true);
|
||||
return true;
|
||||
}
|
||||
case KEY_LEFT: {
|
||||
if(selected_node != NULL && selected_node->hasChilds())
|
||||
selected_node->setExpanded(false);
|
||||
return true;
|
||||
}
|
||||
case KEY_SPACE: {
|
||||
if(selected_node != NULL && !selected_node->hasChilds() &&
|
||||
selected_node->getText() != NULL)
|
||||
{
|
||||
std::string modname = wide_to_narrow(selected_node->getText());
|
||||
bool checked = m_enabled_checkbox->isChecked();
|
||||
m_enabled_checkbox->setChecked(!checked);
|
||||
setEnabled(modname,!checked);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
default: {}
|
||||
}
|
||||
}
|
||||
if(event.EventType==EET_GUI_EVENT)
|
||||
{
|
||||
if(event.GUIEvent.EventType==gui::EGET_ELEMENT_FOCUS_LOST
|
||||
&& isVisible())
|
||||
{
|
||||
if(!canTakeFocus(event.GUIEvent.Element))
|
||||
{
|
||||
dstream<<"GUIConfigureWorld: Not allowing focus change."
|
||||
<<std::endl;
|
||||
// Returning true disables focus change
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED){
|
||||
switch(event.GUIEvent.Caller->getID()){
|
||||
case GUI_ID_CANCEL: {
|
||||
quitMenu();
|
||||
return true;
|
||||
}
|
||||
case GUI_ID_SAVE: {
|
||||
std::string worldmtfile = m_wspec.path+DIR_DELIM+"world.mt";
|
||||
m_settings.updateConfigFile(worldmtfile.c_str());
|
||||
|
||||
// The trailing spaces are because there seems to be a
|
||||
// bug in the text-size calculation. if the trailing
|
||||
// spaces are removed from the message text, the
|
||||
// message gets wrapped and parts of it are cut off:
|
||||
wchar_t* text = wgettext("Configuration saved. ");
|
||||
GUIMessageMenu *menu =
|
||||
new GUIMessageMenu(Environment, Parent, -1, m_menumgr,
|
||||
text );
|
||||
delete[] text;
|
||||
menu->drop();
|
||||
|
||||
try
|
||||
{
|
||||
ModConfiguration modconf(m_wspec.path);
|
||||
if(!modconf.isConsistent())
|
||||
{
|
||||
wchar_t* text = wgettext("Warning: Configuration not consistent. ");
|
||||
GUIMessageMenu *menu =
|
||||
new GUIMessageMenu(Environment, Parent, -1, m_menumgr,
|
||||
text );
|
||||
delete[] text;
|
||||
menu->drop();
|
||||
}
|
||||
}
|
||||
catch(ModError &err)
|
||||
{
|
||||
errorstream<<err.what()<<std::endl;
|
||||
std::wstring text = narrow_to_wide(err.what()) + wgettext("\nCheck debug.txt for details.");
|
||||
GUIMessageMenu *menu =
|
||||
new GUIMessageMenu(Environment, Parent, -1, m_menumgr,
|
||||
text );
|
||||
menu->drop();
|
||||
}
|
||||
|
||||
quitMenu();
|
||||
return true;
|
||||
}
|
||||
case GUI_ID_ENABLEALL: {
|
||||
if(selected_node != NULL && selected_node->getParent() == m_treeview->getRoot())
|
||||
{
|
||||
enableAllMods(m_addonmods,true);
|
||||
}
|
||||
else if(selected_node != NULL && selected_node->getText() != NULL)
|
||||
{
|
||||
std::string modname = wide_to_narrow(selected_node->getText());
|
||||
std::map<std::string, ModSpec>::iterator mod_it = m_addonmods.find(modname);
|
||||
if(mod_it != m_addonmods.end())
|
||||
enableAllMods(mod_it->second.modpack_content,true);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
case GUI_ID_DISABLEALL: {
|
||||
if(selected_node != NULL && selected_node->getParent() == m_treeview->getRoot())
|
||||
{
|
||||
enableAllMods(m_addonmods,false);
|
||||
}
|
||||
if(selected_node != NULL && selected_node->getText() != NULL)
|
||||
{
|
||||
std::string modname = wide_to_narrow(selected_node->getText());
|
||||
std::map<std::string, ModSpec>::iterator mod_it = m_addonmods.find(modname);
|
||||
if(mod_it != m_addonmods.end())
|
||||
enableAllMods(mod_it->second.modpack_content,false);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(event.GUIEvent.EventType==gui::EGET_CHECKBOX_CHANGED &&
|
||||
event.GUIEvent.Caller->getID() == GUI_ID_ENABLED_CHECKBOX)
|
||||
{
|
||||
if(selected_node != NULL && !selected_node->hasChilds() &&
|
||||
selected_node->getText() != NULL)
|
||||
{
|
||||
std::string modname = wide_to_narrow(selected_node->getText());
|
||||
setEnabled(modname, m_enabled_checkbox->isChecked());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if(event.GUIEvent.EventType==gui::EGET_TREEVIEW_NODE_SELECT &&
|
||||
event.GUIEvent.Caller->getID() == GUI_ID_MOD_TREEVIEW)
|
||||
{
|
||||
selecting_dep = -1;
|
||||
selecting_rdep = -1;
|
||||
adjustSidebar();
|
||||
return true;
|
||||
}
|
||||
if(event.GUIEvent.EventType==gui::EGET_LISTBOX_CHANGED &&
|
||||
event.GUIEvent.Caller->getID() == GUI_ID_DEPENDS_LISTBOX)
|
||||
{
|
||||
selecting_dep = m_dependencies_listbox->getSelected();
|
||||
selecting_rdep = -1;
|
||||
return true;
|
||||
}
|
||||
if(event.GUIEvent.EventType==gui::EGET_LISTBOX_CHANGED &&
|
||||
event.GUIEvent.Caller->getID() == GUI_ID_RDEPENDS_LISTBOX)
|
||||
{
|
||||
selecting_dep = -1;
|
||||
selecting_rdep = m_rdependencies_listbox->getSelected();
|
||||
return true;
|
||||
}
|
||||
|
||||
//double click in a dependency listbox: find corresponding
|
||||
//treeviewnode and select it:
|
||||
if(event.GUIEvent.EventType==gui::EGET_LISTBOX_SELECTED_AGAIN)
|
||||
{
|
||||
gui::IGUIListBox* box = NULL;
|
||||
if(event.GUIEvent.Caller->getID() == GUI_ID_DEPENDS_LISTBOX)
|
||||
{
|
||||
box = m_dependencies_listbox;
|
||||
if(box->getSelected() != selecting_dep)
|
||||
return true;
|
||||
}
|
||||
if(event.GUIEvent.Caller->getID() == GUI_ID_RDEPENDS_LISTBOX)
|
||||
{
|
||||
box = m_rdependencies_listbox;
|
||||
if(box->getSelected() != selecting_rdep)
|
||||
return true;
|
||||
}
|
||||
if(box != NULL && box->getSelected() != -1 &&
|
||||
box->getListItem(box->getSelected()) != NULL)
|
||||
{
|
||||
std::string modname =
|
||||
wide_to_narrow(box->getListItem(box->getSelected()));
|
||||
std::map<std::string, gui::IGUITreeViewNode*>::iterator it =
|
||||
m_nodes.find(modname);
|
||||
if(it != m_nodes.end())
|
||||
{
|
||||
// select node and make sure node is visible by
|
||||
// expanding all parents
|
||||
gui::IGUITreeViewNode* node = (*it).second;
|
||||
node->setSelected(true);
|
||||
while(!node->isVisible() &&
|
||||
node->getParent() != m_treeview->getRoot())
|
||||
{
|
||||
node = node->getParent();
|
||||
node->setExpanded(true);
|
||||
}
|
||||
adjustSidebar();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return Parent ? Parent->OnEvent(event) : false;
|
||||
}
|
||||
|
||||
void GUIConfigureWorld::buildTreeView(std::map<std::string, ModSpec> mods,
|
||||
gui::IGUITreeViewNode* node)
|
||||
{
|
||||
for(std::map<std::string,ModSpec>::iterator it = mods.begin();
|
||||
it != mods.end(); ++it)
|
||||
{
|
||||
std::string modname = (*it).first;
|
||||
ModSpec mod = (*it).second;
|
||||
gui::IGUITreeViewNode* new_node =
|
||||
node->addChildBack(narrow_to_wide(modname).c_str());
|
||||
m_nodes.insert(std::make_pair(modname, new_node));
|
||||
if(mod.is_modpack)
|
||||
buildTreeView(mod.modpack_content, new_node);
|
||||
else
|
||||
{
|
||||
// set icon for node: x for disabled mods, checkmark for enabled mods
|
||||
bool mod_enabled = false;
|
||||
if(m_settings.exists("load_mod_"+modname))
|
||||
mod_enabled = m_settings.getBool("load_mod_"+modname);
|
||||
if(mod_enabled)
|
||||
new_node->setIcon(CHECKMARK_STR);
|
||||
else
|
||||
new_node->setIcon(CROSS_STR);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void GUIConfigureWorld::adjustSidebar()
|
||||
{
|
||||
gui::IGUITreeViewNode* node = m_treeview->getSelected();
|
||||
std::wstring modname_w;
|
||||
if(node->getText() != NULL)
|
||||
modname_w = node->getText();
|
||||
else
|
||||
modname_w = L"N/A";
|
||||
std::string modname = wide_to_narrow(modname_w);
|
||||
|
||||
ModSpec mspec;
|
||||
std::map<std::string, ModSpec>::iterator it = m_addonmods.find(modname);
|
||||
if(it != m_addonmods.end())
|
||||
mspec = it->second;
|
||||
|
||||
m_dependencies_listbox->clear();
|
||||
m_rdependencies_listbox->clear();
|
||||
|
||||
// if no mods installed, there is nothing to enable/disable, so we
|
||||
// don't show buttons or checkbox on the sidebar
|
||||
if(node->getParent() == m_treeview->getRoot() && !node->hasChilds())
|
||||
{
|
||||
m_disableall->setVisible(false);
|
||||
m_enableall->setVisible(false);
|
||||
m_enabled_checkbox->setVisible(false);
|
||||
return;
|
||||
}
|
||||
|
||||
// a modpack is not enabled/disabled by itself, only its cotnents
|
||||
// are. so we show show enable/disable all buttons, but hide the
|
||||
// checkbox
|
||||
if(node->getParent() == m_treeview->getRoot() ||
|
||||
mspec.is_modpack)
|
||||
{
|
||||
m_enabled_checkbox->setVisible(false);
|
||||
m_disableall->setVisible(true);
|
||||
m_enableall->setVisible(true);
|
||||
m_modname_text->setText((L"Modpack: "+modname_w).c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
// for a normal mod, we hide the enable/disable all buttons, but show the checkbox.
|
||||
m_disableall->setVisible(false);
|
||||
m_enableall->setVisible(false);
|
||||
m_enabled_checkbox->setVisible(true);
|
||||
m_modname_text->setText((L"Mod: "+modname_w).c_str());
|
||||
|
||||
// the mod is enabled unless it is disabled in the world.mt settings.
|
||||
bool mod_enabled = true;
|
||||
if(m_settings.exists("load_mod_"+modname))
|
||||
mod_enabled = m_settings.getBool("load_mod_"+modname);
|
||||
m_enabled_checkbox->setChecked(mod_enabled);
|
||||
|
||||
for(std::set<std::string>::iterator it=mspec.depends.begin();
|
||||
it != mspec.depends.end(); ++it)
|
||||
{
|
||||
// check if it is an add-on mod or a game/world mod. We only
|
||||
// want to show add-ons
|
||||
std::string dependency = (*it);
|
||||
if(m_gamemods.count(dependency) > 0)
|
||||
dependency += " (" + m_gspec.id + ")";
|
||||
else if(m_worldmods.count(dependency) > 0)
|
||||
dependency += " (" + m_wspec.name + ")";
|
||||
else if(m_addonmods.count(dependency) == 0)
|
||||
dependency += " (missing)";
|
||||
m_dependencies_listbox->addItem(narrow_to_wide(dependency).c_str());
|
||||
}
|
||||
|
||||
// reverse dependencies of this mod:
|
||||
std::pair< std::multimap<std::string, std::string>::iterator,
|
||||
std::multimap<std::string, std::string>::iterator > rdep =
|
||||
m_reverse_depends.equal_range(modname);
|
||||
for(std::multimap<std::string,std::string>::iterator it = rdep.first;
|
||||
it != rdep.second; ++it)
|
||||
{
|
||||
// check if it is an add-on mod or a game/world mod. We only
|
||||
// want to show add-ons
|
||||
std::string rdependency = (*it).second;
|
||||
if(m_addonmods.count(rdependency) > 0)
|
||||
m_rdependencies_listbox->addItem(narrow_to_wide(rdependency).c_str());
|
||||
}
|
||||
}
|
||||
|
||||
void GUIConfigureWorld::enableAllMods(std::map<std::string, ModSpec> mods,bool enable)
|
||||
{
|
||||
for(std::map<std::string, ModSpec>::iterator it = mods.begin();
|
||||
it != mods.end(); ++it)
|
||||
{
|
||||
ModSpec mod = (*it).second;
|
||||
if(mod.is_modpack)
|
||||
// a modpack, recursively enable all mods in it
|
||||
enableAllMods(mod.modpack_content,enable);
|
||||
else // not a modpack
|
||||
setEnabled(mod.name, enable);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void GUIConfigureWorld::enableMod(std::string modname)
|
||||
{
|
||||
std::map<std::string, ModSpec>::iterator mod_it = m_addonmods.find(modname);
|
||||
if(mod_it == m_addonmods.end()){
|
||||
errorstream << "enableMod() called with invalid mod name \"" << modname << "\"" << std::endl;
|
||||
return;
|
||||
}
|
||||
ModSpec mspec = mod_it->second;
|
||||
m_settings.setBool("load_mod_"+modname,true);
|
||||
std::map<std::string,gui::IGUITreeViewNode*>::iterator it =
|
||||
m_nodes.find(modname);
|
||||
if(it != m_nodes.end())
|
||||
(*it).second->setIcon(CHECKMARK_STR);
|
||||
//also enable all dependencies
|
||||
for(std::set<std::string>::iterator it=mspec.depends.begin();
|
||||
it != mspec.depends.end(); ++it)
|
||||
{
|
||||
std::string dependency = *it;
|
||||
// only enable it if it is an add-on mod
|
||||
if(m_addonmods.count(dependency) > 0)
|
||||
enableMod(dependency);
|
||||
}
|
||||
}
|
||||
|
||||
void GUIConfigureWorld::disableMod(std::string modname)
|
||||
{
|
||||
std::map<std::string, ModSpec>::iterator mod_it = m_addonmods.find(modname);
|
||||
if(mod_it == m_addonmods.end()){
|
||||
errorstream << "disableMod() called with invalid mod name \"" << modname << "\"" << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
m_settings.setBool("load_mod_"+modname,false);
|
||||
std::map<std::string,gui::IGUITreeViewNode*>::iterator it =
|
||||
m_nodes.find(modname);
|
||||
if(it != m_nodes.end())
|
||||
(*it).second->setIcon(CROSS_STR);
|
||||
//also disable all mods that depend on this one
|
||||
std::pair<std::multimap<std::string, std::string>::iterator,
|
||||
std::multimap<std::string, std::string>::iterator > rdep =
|
||||
m_reverse_depends.equal_range(modname);
|
||||
for(std::multimap<std::string,std::string>::iterator it = rdep.first;
|
||||
it != rdep.second; ++it)
|
||||
{
|
||||
std::string rdependency = (*it).second;
|
||||
// only disable it if it is an add-on mod
|
||||
if(m_addonmods.count(rdependency) > 0)
|
||||
disableMod(rdependency);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,107 @@
|
|||
/*
|
||||
Minetest
|
||||
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#ifndef GUICONFIGUREWORLD_HEADER
|
||||
#define GUICONFIGUREWORLD_HEADER
|
||||
|
||||
#include "irrlichttypes_extrabloated.h"
|
||||
#include "modalMenu.h"
|
||||
#include "mods.h"
|
||||
#include "subgame.h"
|
||||
#include "settings.h"
|
||||
|
||||
|
||||
namespace irr{
|
||||
namespace gui{
|
||||
class IGUITreeViewNode;
|
||||
}
|
||||
}
|
||||
|
||||
class GUIConfigureWorld : public GUIModalMenu
|
||||
{
|
||||
public:
|
||||
GUIConfigureWorld(gui::IGUIEnvironment* env,
|
||||
gui::IGUIElement* parent, s32 id,
|
||||
IMenuManager *menumgr, WorldSpec wspec);
|
||||
|
||||
void regenerateGui(v2u32 screensize);
|
||||
|
||||
void drawMenu();
|
||||
|
||||
bool OnEvent(const SEvent& event);
|
||||
|
||||
private:
|
||||
WorldSpec m_wspec;
|
||||
SubgameSpec m_gspec;
|
||||
|
||||
// tree of installed add-on mods. key is the mod name, modpacks
|
||||
// are not expanded.
|
||||
std::map<std::string, ModSpec> m_addontree;
|
||||
|
||||
// like m_addontree, but modpacks are expanded.
|
||||
std::map<std::string, ModSpec> m_addonmods;
|
||||
|
||||
// list of game mods (flattened)
|
||||
std::map<std::string, ModSpec> m_gamemods;
|
||||
|
||||
// list of world mods (flattened)
|
||||
std::map<std::string, ModSpec> m_worldmods;
|
||||
|
||||
// for each mod, the set of mods depending on it
|
||||
std::multimap<std::string, std::string> m_reverse_depends;
|
||||
|
||||
// the settings in the world.mt file
|
||||
Settings m_settings;
|
||||
|
||||
// maps modnames to nodes in m_treeview
|
||||
std::map<std::string,gui::IGUITreeViewNode*> m_nodes;
|
||||
|
||||
gui::IGUIStaticText* m_modname_text;
|
||||
gui::IGUITreeView* m_treeview;
|
||||
gui::IGUIButton* m_enableall;
|
||||
gui::IGUIButton* m_disableall;
|
||||
gui::IGUICheckBox* m_enabled_checkbox;
|
||||
gui::IGUIListBox* m_dependencies_listbox;
|
||||
gui::IGUIListBox* m_rdependencies_listbox;
|
||||
void buildTreeView(std::map<std::string,ModSpec> mods,
|
||||
gui::IGUITreeViewNode* node);
|
||||
void adjustSidebar();
|
||||
void enableAllMods(std::map<std::string,ModSpec> mods, bool enable);
|
||||
void setEnabled(std::string modname, bool enable)
|
||||
{
|
||||
if(enable)
|
||||
enableMod(modname);
|
||||
else
|
||||
disableMod(modname);
|
||||
};
|
||||
|
||||
void enableMod(std::string modname);
|
||||
void disableMod(std::string modname);
|
||||
|
||||
// hack to work around wonky handling of double-click in
|
||||
// irrlicht. store selected index of listbox items here so event
|
||||
// handling can check whether it was a real double click on the
|
||||
// same item. (irrlicht also reports a double click if you rapidly
|
||||
// select two different items.)
|
||||
int selecting_dep;
|
||||
int selecting_rdep;
|
||||
|
||||
IMenuManager* m_menumgr;
|
||||
};
|
||||
#endif
|
|
@ -0,0 +1,204 @@
|
|||
/*
|
||||
Minetest
|
||||
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#include "guiConfirmMenu.h"
|
||||
#include "debug.h"
|
||||
#include "serialization.h"
|
||||
#include <string>
|
||||
#include <IGUICheckBox.h>
|
||||
#include <IGUIEditBox.h>
|
||||
#include <IGUIButton.h>
|
||||
#include <IGUIStaticText.h>
|
||||
#include <IGUIFont.h>
|
||||
|
||||
#include "gettext.h"
|
||||
|
||||
enum
|
||||
{
|
||||
GUI_ID_YES = 101,
|
||||
GUI_ID_NO,
|
||||
};
|
||||
|
||||
GUIConfirmMenu::GUIConfirmMenu(gui::IGUIEnvironment* env,
|
||||
gui::IGUIElement* parent, s32 id,
|
||||
IMenuManager *menumgr,
|
||||
ConfirmDest *dest,
|
||||
std::wstring message_text
|
||||
):
|
||||
GUIModalMenu(env, parent, id, menumgr),
|
||||
m_dest(dest),
|
||||
m_message_text(message_text)
|
||||
{
|
||||
}
|
||||
|
||||
GUIConfirmMenu::~GUIConfirmMenu()
|
||||
{
|
||||
removeChildren();
|
||||
if(m_dest)
|
||||
delete m_dest;
|
||||
}
|
||||
|
||||
void GUIConfirmMenu::removeChildren()
|
||||
{
|
||||
const core::list<gui::IGUIElement*> &children = getChildren();
|
||||
core::list<gui::IGUIElement*> children_copy;
|
||||
for(core::list<gui::IGUIElement*>::ConstIterator
|
||||
i = children.begin(); i != children.end(); i++)
|
||||
{
|
||||
children_copy.push_back(*i);
|
||||
}
|
||||
for(core::list<gui::IGUIElement*>::Iterator
|
||||
i = children_copy.begin();
|
||||
i != children_copy.end(); i++)
|
||||
{
|
||||
(*i)->remove();
|
||||
}
|
||||
}
|
||||
|
||||
void GUIConfirmMenu::regenerateGui(v2u32 screensize)
|
||||
{
|
||||
/*
|
||||
Remove stuff
|
||||
*/
|
||||
removeChildren();
|
||||
|
||||
/*
|
||||
Calculate new sizes and positions
|
||||
*/
|
||||
core::rect<s32> rect(
|
||||
screensize.X/2 - 580/2,
|
||||
screensize.Y/2 - 300/2,
|
||||
screensize.X/2 + 580/2,
|
||||
screensize.Y/2 + 300/2
|
||||
);
|
||||
|
||||
DesiredRect = rect;
|
||||
recalculateAbsolutePosition(false);
|
||||
|
||||
v2s32 size = rect.getSize();
|
||||
|
||||
gui::IGUISkin *skin = Environment->getSkin();
|
||||
gui::IGUIFont *font = skin->getFont();
|
||||
s32 msg_h = font->getDimension(m_message_text.c_str()).Height;
|
||||
s32 msg_w = font->getDimension(m_message_text.c_str()).Width;
|
||||
if(msg_h > 200)
|
||||
msg_h = 200;
|
||||
if(msg_w > 540)
|
||||
msg_w = 540;
|
||||
|
||||
/*
|
||||
Add stuff
|
||||
*/
|
||||
{
|
||||
core::rect<s32> rect(0, 0, msg_w, msg_h);
|
||||
rect += v2s32(size.X/2-msg_w/2, size.Y/2-30/2 - msg_h/2);
|
||||
Environment->addStaticText(m_message_text.c_str(),
|
||||
rect, false, true, this, -1);
|
||||
}
|
||||
changeCtype("");
|
||||
int bw = 100;
|
||||
{
|
||||
core::rect<s32> rect(0, 0, bw, 30);
|
||||
rect = rect + v2s32(size.X/2-bw/2-(bw/2+5), size.Y/2-30/2+5 + msg_h/2);
|
||||
wchar_t* text = wgettext("Yes");
|
||||
Environment->addButton(rect, this, GUI_ID_YES,
|
||||
text);
|
||||
delete[] text;
|
||||
}
|
||||
{
|
||||
core::rect<s32> rect(0, 0, bw, 30);
|
||||
rect = rect + v2s32(size.X/2-bw/2+(bw/2+5), size.Y/2-30/2+5 + msg_h/2);
|
||||
wchar_t* text = wgettext("No");
|
||||
Environment->addButton(rect, this, GUI_ID_NO,
|
||||
text);
|
||||
delete[] text;
|
||||
}
|
||||
changeCtype("C");
|
||||
}
|
||||
|
||||
void GUIConfirmMenu::drawMenu()
|
||||
{
|
||||
gui::IGUISkin* skin = Environment->getSkin();
|
||||
if (!skin)
|
||||
return;
|
||||
video::IVideoDriver* driver = Environment->getVideoDriver();
|
||||
|
||||
video::SColor bgcolor(140,0,0,0);
|
||||
driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect);
|
||||
|
||||
gui::IGUIElement::draw();
|
||||
}
|
||||
|
||||
void GUIConfirmMenu::acceptInput(bool answer)
|
||||
{
|
||||
if(m_dest)
|
||||
m_dest->answer(answer);
|
||||
}
|
||||
|
||||
bool GUIConfirmMenu::OnEvent(const SEvent& event)
|
||||
{
|
||||
if(event.EventType==EET_KEY_INPUT_EVENT)
|
||||
{
|
||||
if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown)
|
||||
{
|
||||
acceptInput(false);
|
||||
quitMenu();
|
||||
return true;
|
||||
}
|
||||
if(event.KeyInput.Key==KEY_RETURN && event.KeyInput.PressedDown)
|
||||
{
|
||||
acceptInput(true);
|
||||
quitMenu();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if(event.EventType==EET_GUI_EVENT)
|
||||
{
|
||||
if(event.GUIEvent.EventType==gui::EGET_ELEMENT_FOCUS_LOST
|
||||
&& isVisible())
|
||||
{
|
||||
if(!canTakeFocus(event.GUIEvent.Element))
|
||||
{
|
||||
dstream<<"GUIConfirmMenu: Not allowing focus change."
|
||||
<<std::endl;
|
||||
// Returning true disables focus change
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED)
|
||||
{
|
||||
switch(event.GUIEvent.Caller->getID())
|
||||
{
|
||||
case GUI_ID_YES:
|
||||
acceptInput(true);
|
||||
quitMenu();
|
||||
// quitMenu deallocates menu
|
||||
return true;
|
||||
case GUI_ID_NO:
|
||||
acceptInput(false);
|
||||
quitMenu();
|
||||
// quitMenu deallocates menu
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return Parent ? Parent->OnEvent(event) : false;
|
||||
}
|
||||
|
|
@ -17,18 +17,40 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef __CONVERT_JSON_H__
|
||||
#define __CONVERT_JSON_H__
|
||||
#ifndef GUICONFIRMMENU_HEADER
|
||||
#define GUICONFIRMMENU_HEADER
|
||||
|
||||
#include "json/json.h"
|
||||
#include "irrlichttypes_extrabloated.h"
|
||||
#include "modalMenu.h"
|
||||
#include <string>
|
||||
|
||||
struct ModStoreMod;
|
||||
struct ModStoreModDetails;
|
||||
struct ConfirmDest
|
||||
{
|
||||
virtual void answer(bool answer) = 0;
|
||||
virtual ~ConfirmDest() {};
|
||||
};
|
||||
|
||||
std::vector<ModStoreMod> readModStoreList(Json::Value& modlist);
|
||||
ModStoreModDetails readModStoreModDetails(Json::Value& details);
|
||||
|
||||
Json::Value fetchJsonValue(const std::string url,
|
||||
struct curl_slist *chunk);
|
||||
class GUIConfirmMenu : public GUIModalMenu
|
||||
{
|
||||
public:
|
||||
GUIConfirmMenu(gui::IGUIEnvironment* env,
|
||||
gui::IGUIElement* parent, s32 id,
|
||||
IMenuManager *menumgr,
|
||||
ConfirmDest *dest,
|
||||
std::wstring message_text);
|
||||
~GUIConfirmMenu();
|
||||
|
||||
void removeChildren();
|
||||
// Remove and re-add (or reposition) stuff
|
||||
void regenerateGui(v2u32 screensize);
|
||||
void drawMenu();
|
||||
void acceptInput(bool answer);
|
||||
bool OnEvent(const SEvent& event);
|
||||
|
||||
private:
|
||||
ConfirmDest *m_dest;
|
||||
std::wstring m_message_text;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,280 @@
|
|||
/*
|
||||
Minetest
|
||||
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#include "guiCreateWorld.h"
|
||||
#include "debug.h"
|
||||
#include "serialization.h"
|
||||
#include <string>
|
||||
#include <IGUICheckBox.h>
|
||||
#include <IGUIEditBox.h>
|
||||
#include <IGUIButton.h>
|
||||
#include <IGUIStaticText.h>
|
||||
#include <IGUIFont.h>
|
||||
#include <IGUIListBox.h>
|
||||
#include "gettext.h"
|
||||
#include "util/string.h"
|
||||
|
||||
enum
|
||||
{
|
||||
GUI_ID_NAME_INPUT = 101,
|
||||
GUI_ID_GAME_LISTBOX,
|
||||
GUI_ID_CREATE,
|
||||
GUI_ID_CANCEL
|
||||
};
|
||||
|
||||
GUICreateWorld::GUICreateWorld(gui::IGUIEnvironment* env,
|
||||
gui::IGUIElement* parent, s32 id,
|
||||
IMenuManager *menumgr,
|
||||
CreateWorldDest *dest,
|
||||
const std::vector<SubgameSpec> &games,
|
||||
const std::string &initial_game
|
||||
):
|
||||
GUIModalMenu(env, parent, id, menumgr),
|
||||
m_dest(dest),
|
||||
m_games(games),
|
||||
m_initial_game_i(0)
|
||||
{
|
||||
assert(games.size() > 0);
|
||||
|
||||
for(size_t i=0; i<games.size(); i++){
|
||||
if(games[i].id == initial_game){
|
||||
m_initial_game_i = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GUICreateWorld::~GUICreateWorld()
|
||||
{
|
||||
removeChildren();
|
||||
if(m_dest)
|
||||
delete m_dest;
|
||||
}
|
||||
|
||||
void GUICreateWorld::removeChildren()
|
||||
{
|
||||
const core::list<gui::IGUIElement*> &children = getChildren();
|
||||
core::list<gui::IGUIElement*> children_copy;
|
||||
for(core::list<gui::IGUIElement*>::ConstIterator
|
||||
i = children.begin(); i != children.end(); i++)
|
||||
{
|
||||
children_copy.push_back(*i);
|
||||
}
|
||||
for(core::list<gui::IGUIElement*>::Iterator
|
||||
i = children_copy.begin();
|
||||
i != children_copy.end(); i++)
|
||||
{
|
||||
(*i)->remove();
|
||||
}
|
||||
}
|
||||
|
||||
void GUICreateWorld::regenerateGui(v2u32 screensize)
|
||||
{
|
||||
std::wstring name = L"";
|
||||
|
||||
{
|
||||
gui::IGUIElement *e = getElementFromId(GUI_ID_NAME_INPUT);
|
||||
if(e != NULL)
|
||||
name = e->getText();
|
||||
}
|
||||
|
||||
/*
|
||||
Remove stuff
|
||||
*/
|
||||
removeChildren();
|
||||
|
||||
/*
|
||||
Calculate new sizes and positions
|
||||
*/
|
||||
core::rect<s32> rect(
|
||||
screensize.X/2 - 580/2,
|
||||
screensize.Y/2 - 300/2,
|
||||
screensize.X/2 + 580/2,
|
||||
screensize.Y/2 + 300/2
|
||||
);
|
||||
|
||||
DesiredRect = rect;
|
||||
recalculateAbsolutePosition(false);
|
||||
|
||||
v2s32 topleft = v2s32(10+80, 10+70);
|
||||
|
||||
/*
|
||||
Add stuff
|
||||
*/
|
||||
{
|
||||
core::rect<s32> rect(0, 0, 100, 20);
|
||||
rect += v2s32(0, 5) + topleft;
|
||||
wchar_t* text = wgettext("World name");
|
||||
Environment->addStaticText(text, rect, false, true, this, -1);
|
||||
delete[] text;
|
||||
}
|
||||
{
|
||||
core::rect<s32> rect(0, 0, 300, 30);
|
||||
rect = rect + v2s32(100, 0) + topleft;
|
||||
gui::IGUIElement *e =
|
||||
Environment->addEditBox(name.c_str(), rect, true, this, GUI_ID_NAME_INPUT);
|
||||
Environment->setFocus(e);
|
||||
|
||||
irr::SEvent evt;
|
||||
evt.EventType = EET_KEY_INPUT_EVENT;
|
||||
evt.KeyInput.Key = KEY_END;
|
||||
evt.KeyInput.PressedDown = true;
|
||||
evt.KeyInput.Char = 0;
|
||||
evt.KeyInput.Control = 0;
|
||||
evt.KeyInput.Shift = 0;
|
||||
e->OnEvent(evt);
|
||||
}
|
||||
{
|
||||
core::rect<s32> rect(0, 0, 100, 20);
|
||||
rect += v2s32(0, 40+5) + topleft;
|
||||
wchar_t* text = wgettext("Game");
|
||||
Environment->addStaticText(text, rect, false, true, this, -1);
|
||||
delete[] text;
|
||||
}
|
||||
{
|
||||
core::rect<s32> rect(0, 0, 300, 80);
|
||||
rect += v2s32(100, 40) + topleft;
|
||||
gui::IGUIListBox *e = Environment->addListBox(rect, this,
|
||||
GUI_ID_GAME_LISTBOX);
|
||||
e->setDrawBackground(true);
|
||||
for(u32 i=0; i<m_games.size(); i++){
|
||||
std::wostringstream os(std::ios::binary);
|
||||
os<<narrow_to_wide(m_games[i].name).c_str();
|
||||
os<<L" [";
|
||||
os<<narrow_to_wide(m_games[i].id).c_str();
|
||||
os<<L"]";
|
||||
e->addItem(os.str().c_str());
|
||||
}
|
||||
e->setSelected(m_initial_game_i);
|
||||
}
|
||||
changeCtype("");
|
||||
{
|
||||
core::rect<s32> rect(0, 0, 120, 30);
|
||||
rect = rect + v2s32(170, 140) + topleft;
|
||||
wchar_t* text = wgettext("Create");
|
||||
Environment->addButton(rect, this, GUI_ID_CREATE,
|
||||
text);
|
||||
delete[] text;
|
||||
}
|
||||
{
|
||||
core::rect<s32> rect(0, 0, 120, 30);
|
||||
rect = rect + v2s32(300, 140) + topleft;
|
||||
wchar_t* text = wgettext("Cancel");
|
||||
Environment->addButton(rect, this, GUI_ID_CANCEL,
|
||||
text);
|
||||
delete [] text;
|
||||
}
|
||||
changeCtype("C");
|
||||
}
|
||||
|
||||
void GUICreateWorld::drawMenu()
|
||||
{
|
||||
gui::IGUISkin* skin = Environment->getSkin();
|
||||
if (!skin)
|
||||
return;
|
||||
video::IVideoDriver* driver = Environment->getVideoDriver();
|
||||
|
||||
video::SColor bgcolor(140,0,0,0);
|
||||
driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect);
|
||||
|
||||
gui::IGUIElement::draw();
|
||||
}
|
||||
|
||||
void GUICreateWorld::acceptInput()
|
||||
{
|
||||
if(m_dest)
|
||||
{
|
||||
int selected = -1;
|
||||
{
|
||||
gui::IGUIElement *e = getElementFromId(GUI_ID_GAME_LISTBOX);
|
||||
if(e != NULL && e->getType() == gui::EGUIET_LIST_BOX)
|
||||
selected = ((gui::IGUIListBox*)e)->getSelected();
|
||||
}
|
||||
std::wstring name;
|
||||
{
|
||||
gui::IGUIElement *e = getElementFromId(GUI_ID_NAME_INPUT);
|
||||
if(e != NULL)
|
||||
name = e->getText();
|
||||
}
|
||||
if(selected != -1 && name != L"")
|
||||
m_dest->accepted(name, m_games[selected].id);
|
||||
delete m_dest;
|
||||
m_dest = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
bool GUICreateWorld::OnEvent(const SEvent& event)
|
||||
{
|
||||
if(event.EventType==EET_KEY_INPUT_EVENT)
|
||||
{
|
||||
if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown)
|
||||
{
|
||||
quitMenu();
|
||||
return true;
|
||||
}
|
||||
if(event.KeyInput.Key==KEY_RETURN && event.KeyInput.PressedDown)
|
||||
{
|
||||
acceptInput();
|
||||
quitMenu();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if(event.EventType==EET_GUI_EVENT)
|
||||
{
|
||||
if(event.GUIEvent.EventType==gui::EGET_ELEMENT_FOCUS_LOST
|
||||
&& isVisible())
|
||||
{
|
||||
if(!canTakeFocus(event.GUIEvent.Element))
|
||||
{
|
||||
dstream<<"GUICreateWorld: Not allowing focus change."
|
||||
<<std::endl;
|
||||
// Returning true disables focus change
|
||||
return true;
|
||||
}
|
||||
}
|
||||
bool accept_input = false;
|
||||
if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED){
|
||||
switch(event.GUIEvent.Caller->getID()){
|
||||
case GUI_ID_CANCEL:
|
||||
quitMenu();
|
||||
return true;
|
||||
break;
|
||||
case GUI_ID_CREATE:
|
||||
accept_input = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(event.GUIEvent.EventType==gui::EGET_EDITBOX_ENTER){
|
||||
switch(event.GUIEvent.Caller->getID()){
|
||||
case GUI_ID_NAME_INPUT:
|
||||
accept_input = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(accept_input){
|
||||
acceptInput();
|
||||
quitMenu();
|
||||
// quitMenu deallocates menu
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return Parent ? Parent->OnEvent(event) : false;
|
||||
}
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
Minetest
|
||||
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#ifndef GUICREATEWORLD_HEADER
|
||||
#define GUICREATEWORLD_HEADER
|
||||
|
||||
#include "irrlichttypes_extrabloated.h"
|
||||
#include "modalMenu.h"
|
||||
#include <string>
|
||||
#include "subgame.h"
|
||||
|
||||
struct CreateWorldDest
|
||||
{
|
||||
virtual void accepted(std::wstring name, std::string gameid) = 0;
|
||||
virtual ~CreateWorldDest() {};
|
||||
};
|
||||
|
||||
class GUICreateWorld : public GUIModalMenu
|
||||
{
|
||||
public:
|
||||
GUICreateWorld(gui::IGUIEnvironment* env,
|
||||
gui::IGUIElement* parent, s32 id,
|
||||
IMenuManager *menumgr,
|
||||
CreateWorldDest *dest,
|
||||
const std::vector<SubgameSpec> &games,
|
||||
const std::string &initial_game);
|
||||
~GUICreateWorld();
|
||||
|
||||
void removeChildren();
|
||||
/*
|
||||
Remove and re-add (or reposition) stuff
|
||||
*/
|
||||
void regenerateGui(v2u32 screensize);
|
||||
|
||||
void drawMenu();
|
||||
|
||||
void acceptInput();
|
||||
|
||||
bool OnEvent(const SEvent& event);
|
||||
|
||||
private:
|
||||
CreateWorldDest *m_dest;
|
||||
std::vector<SubgameSpec> m_games;
|
||||
int m_initial_game_i;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -1,573 +0,0 @@
|
|||
/*
|
||||
Minetest
|
||||
Copyright (C) 2013 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.
|
||||
*/
|
||||
|
||||
extern "C" {
|
||||
#include "lua.h"
|
||||
#include "lauxlib.h"
|
||||
#include "lualib.h"
|
||||
}
|
||||
|
||||
#include "irrlicht.h"
|
||||
|
||||
#include "porting.h"
|
||||
#include "filesys.h"
|
||||
#include "main.h"
|
||||
#include "settings.h"
|
||||
#include "guiMainMenu.h"
|
||||
|
||||
#include "guiEngine.h"
|
||||
|
||||
#if USE_CURL
|
||||
#include <curl/curl.h>
|
||||
#endif
|
||||
|
||||
/******************************************************************************/
|
||||
int menuscript_ErrorHandler(lua_State *L) {
|
||||
lua_getfield(L, LUA_GLOBALSINDEX, "debug");
|
||||
if (!lua_istable(L, -1)) {
|
||||
lua_pop(L, 1);
|
||||
return 1;
|
||||
}
|
||||
lua_getfield(L, -1, "traceback");
|
||||
if (!lua_isfunction(L, -1)) {
|
||||
lua_pop(L, 2);
|
||||
return 1;
|
||||
}
|
||||
lua_pushvalue(L, 1);
|
||||
lua_pushinteger(L, 2);
|
||||
lua_call(L, 2, 1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
TextDestGuiEngine::TextDestGuiEngine(GUIEngine* engine)
|
||||
{
|
||||
m_engine = engine;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void TextDestGuiEngine::gotText(std::map<std::string, std::string> fields)
|
||||
{
|
||||
m_engine->handleButtons(fields);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void TextDestGuiEngine::gotText(std::wstring text)
|
||||
{
|
||||
m_engine->handleEvent(wide_to_narrow(text));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
GUIEngine::GUIEngine( irr::IrrlichtDevice* dev,
|
||||
gui::IGUIElement* parent,
|
||||
IMenuManager *menumgr,
|
||||
scene::ISceneManager* smgr,
|
||||
MainMenuData* data) :
|
||||
m_device(dev),
|
||||
m_parent(parent),
|
||||
m_menumanager(menumgr),
|
||||
m_smgr(smgr),
|
||||
m_data(data),
|
||||
m_formspecgui(0),
|
||||
m_buttonhandler(0),
|
||||
m_menu(0),
|
||||
m_startgame(false),
|
||||
m_engineluastack(0),
|
||||
m_luaerrorhandler(-1),
|
||||
m_scriptdir(""),
|
||||
m_irr_toplefttext(0),
|
||||
m_clouds_enabled(true),
|
||||
m_cloud()
|
||||
{
|
||||
//initialize texture pointers
|
||||
for (unsigned int i = 0; i < TEX_LAYER_MAX; i++) {
|
||||
m_textures[i] = 0;
|
||||
}
|
||||
// is deleted by guiformspec!
|
||||
m_buttonhandler = new TextDestGuiEngine(this);
|
||||
|
||||
//create luastack
|
||||
m_engineluastack = luaL_newstate();
|
||||
|
||||
//load basic lua modules
|
||||
luaL_openlibs(m_engineluastack);
|
||||
|
||||
//init
|
||||
guiLuaApi::initialize(m_engineluastack,this);
|
||||
|
||||
//push errorstring
|
||||
if (m_data->errormessage != "")
|
||||
{
|
||||
lua_getglobal(m_engineluastack, "gamedata");
|
||||
int gamedata_idx = lua_gettop(m_engineluastack);
|
||||
lua_pushstring(m_engineluastack, "errormessage");
|
||||
lua_pushstring(m_engineluastack,m_data->errormessage.c_str());
|
||||
lua_settable(m_engineluastack, gamedata_idx);
|
||||
m_data->errormessage = "";
|
||||
}
|
||||
|
||||
//create topleft header
|
||||
core::rect<s32> rect(0, 0, 500, 40);
|
||||
rect += v2s32(4, 0);
|
||||
std::string t = "Minetest " VERSION_STRING;
|
||||
|
||||
m_irr_toplefttext =
|
||||
m_device->getGUIEnvironment()->addStaticText(narrow_to_wide(t).c_str(),
|
||||
rect,false,true,0,-1);
|
||||
|
||||
//create formspecsource
|
||||
m_formspecgui = new FormspecFormSource("",&m_formspecgui);
|
||||
|
||||
/* Create menu */
|
||||
m_menu =
|
||||
new GUIFormSpecMenu( m_device,
|
||||
m_parent,
|
||||
-1,
|
||||
m_menumanager,
|
||||
0 /* &client */,
|
||||
0 /* gamedef */);
|
||||
|
||||
m_menu->allowClose(false);
|
||||
m_menu->lockSize(true,v2u32(800,600));
|
||||
m_menu->setFormSource(m_formspecgui);
|
||||
m_menu->setTextDest(m_buttonhandler);
|
||||
m_menu->useGettext(true);
|
||||
|
||||
std::string builtin_helpers
|
||||
= porting::path_share + DIR_DELIM + "builtin"
|
||||
+ DIR_DELIM + "mainmenu_helper.lua";
|
||||
|
||||
if (!runScript(builtin_helpers)) {
|
||||
errorstream
|
||||
<< "GUIEngine::GUIEngine unable to load builtin helper script"
|
||||
<< std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
std::string menuscript = "";
|
||||
if (g_settings->exists("main_menu_script"))
|
||||
menuscript = g_settings->get("main_menu_script");
|
||||
std::string builtin_menuscript =
|
||||
porting::path_share + DIR_DELIM + "builtin"
|
||||
+ DIR_DELIM + "mainmenu.lua";
|
||||
|
||||
lua_pushcfunction(m_engineluastack, menuscript_ErrorHandler);
|
||||
m_luaerrorhandler = lua_gettop(m_engineluastack);
|
||||
|
||||
m_scriptdir = menuscript.substr(0,menuscript.find_last_of(DIR_DELIM)-1);
|
||||
if((menuscript == "") || (!runScript(menuscript))) {
|
||||
infostream
|
||||
<< "GUIEngine::GUIEngine execution of custom menu failed!"
|
||||
<< std::endl
|
||||
<< "\tfalling back to builtin menu"
|
||||
<< std::endl;
|
||||
m_scriptdir = fs::RemoveRelativePathComponents(porting::path_share + DIR_DELIM + "builtin"+ DIR_DELIM);
|
||||
if(!runScript(builtin_menuscript)) {
|
||||
errorstream
|
||||
<< "GUIEngine::GUIEngine unable to load builtin menu"
|
||||
<< std::endl;
|
||||
assert("no future without mainmenu" == 0);
|
||||
}
|
||||
}
|
||||
|
||||
run();
|
||||
|
||||
m_menumanager->deletingMenu(m_menu);
|
||||
m_menu->drop();
|
||||
m_menu = 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
bool GUIEngine::runScript(std::string script) {
|
||||
|
||||
int ret = luaL_loadfile(m_engineluastack, script.c_str()) ||
|
||||
lua_pcall(m_engineluastack, 0, 0, m_luaerrorhandler);
|
||||
if(ret){
|
||||
errorstream<<"========== ERROR FROM LUA WHILE CREATING MAIN MENU ==========="<<std::endl;
|
||||
errorstream<<"Failed to load and run script from "<<std::endl;
|
||||
errorstream<<script<<":"<<std::endl;
|
||||
errorstream<<std::endl;
|
||||
errorstream<<lua_tostring(m_engineluastack, -1)<<std::endl;
|
||||
errorstream<<std::endl;
|
||||
errorstream<<"=================== END OF ERROR FROM LUA ===================="<<std::endl;
|
||||
lua_pop(m_engineluastack, 1); // Pop error message from stack
|
||||
lua_pop(m_engineluastack, 1); // Pop the error handler from stack
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void GUIEngine::run()
|
||||
{
|
||||
|
||||
// Always create clouds because they may or may not be
|
||||
// needed based on the game selected
|
||||
video::IVideoDriver* driver = m_device->getVideoDriver();
|
||||
|
||||
cloudInit();
|
||||
|
||||
while(m_device->run() && (!m_startgame)) {
|
||||
driver->beginScene(true, true, video::SColor(255,140,186,250));
|
||||
|
||||
if (m_clouds_enabled)
|
||||
{
|
||||
cloudPreProcess();
|
||||
drawOverlay(driver);
|
||||
}
|
||||
else
|
||||
drawBackground(driver);
|
||||
|
||||
drawHeader(driver);
|
||||
drawFooter(driver);
|
||||
|
||||
m_device->getGUIEnvironment()->drawAll();
|
||||
|
||||
driver->endScene();
|
||||
|
||||
if (m_clouds_enabled)
|
||||
cloudPostProcess();
|
||||
else
|
||||
sleep_ms(25);
|
||||
}
|
||||
|
||||
m_menu->quitMenu();
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void GUIEngine::handleEvent(std::string text)
|
||||
{
|
||||
lua_getglobal(m_engineluastack, "engine");
|
||||
|
||||
lua_getfield(m_engineluastack, -1, "event_handler");
|
||||
|
||||
if(lua_isnil(m_engineluastack, -1))
|
||||
return;
|
||||
|
||||
luaL_checktype(m_engineluastack, -1, LUA_TFUNCTION);
|
||||
|
||||
lua_pushstring(m_engineluastack, text.c_str());
|
||||
|
||||
if(lua_pcall(m_engineluastack, 1, 0, m_luaerrorhandler))
|
||||
scriptError("error: %s", lua_tostring(m_engineluastack, -1));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void GUIEngine::handleButtons(std::map<std::string, std::string> fields)
|
||||
{
|
||||
lua_getglobal(m_engineluastack, "engine");
|
||||
|
||||
lua_getfield(m_engineluastack, -1, "button_handler");
|
||||
|
||||
if(lua_isnil(m_engineluastack, -1))
|
||||
return;
|
||||
|
||||
luaL_checktype(m_engineluastack, -1, LUA_TFUNCTION);
|
||||
|
||||
lua_newtable(m_engineluastack);
|
||||
for(std::map<std::string, std::string>::const_iterator
|
||||
i = fields.begin(); i != fields.end(); i++){
|
||||
const std::string &name = i->first;
|
||||
const std::string &value = i->second;
|
||||
lua_pushstring(m_engineluastack, name.c_str());
|
||||
lua_pushlstring(m_engineluastack, value.c_str(), value.size());
|
||||
lua_settable(m_engineluastack, -3);
|
||||
}
|
||||
|
||||
if(lua_pcall(m_engineluastack, 1, 0, m_luaerrorhandler))
|
||||
scriptError("error: %s", lua_tostring(m_engineluastack, -1));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
GUIEngine::~GUIEngine()
|
||||
{
|
||||
video::IVideoDriver* driver = m_device->getVideoDriver();
|
||||
assert(driver != 0);
|
||||
|
||||
//TODO: clean up m_menu here
|
||||
|
||||
lua_close(m_engineluastack);
|
||||
|
||||
m_irr_toplefttext->setText(L"");
|
||||
|
||||
//initialize texture pointers
|
||||
for (unsigned int i = 0; i < TEX_LAYER_MAX; i++) {
|
||||
if (m_textures[i] != 0)
|
||||
driver->removeTexture(m_textures[i]);
|
||||
}
|
||||
|
||||
if (m_cloud.clouds)
|
||||
m_cloud.clouds->drop();
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void GUIEngine::cloudInit()
|
||||
{
|
||||
m_cloud.clouds = new Clouds(m_smgr->getRootSceneNode(),
|
||||
m_smgr, -1, rand(), 100);
|
||||
m_cloud.clouds->update(v2f(0, 0), video::SColor(255,200,200,255));
|
||||
|
||||
m_cloud.camera = m_smgr->addCameraSceneNode(0,
|
||||
v3f(0,0,0), v3f(0, 60, 100));
|
||||
m_cloud.camera->setFarValue(10000);
|
||||
|
||||
m_cloud.lasttime = m_device->getTimer()->getTime();
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void GUIEngine::cloudPreProcess()
|
||||
{
|
||||
u32 time = m_device->getTimer()->getTime();
|
||||
|
||||
if(time > m_cloud.lasttime)
|
||||
m_cloud.dtime = (time - m_cloud.lasttime) / 1000.0;
|
||||
else
|
||||
m_cloud.dtime = 0;
|
||||
|
||||
m_cloud.lasttime = time;
|
||||
|
||||
m_cloud.clouds->step(m_cloud.dtime*3);
|
||||
m_cloud.clouds->render();
|
||||
m_smgr->drawAll();
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void GUIEngine::cloudPostProcess()
|
||||
{
|
||||
float fps_max = g_settings->getFloat("fps_max");
|
||||
// Time of frame without fps limit
|
||||
float busytime;
|
||||
u32 busytime_u32;
|
||||
// not using getRealTime is necessary for wine
|
||||
u32 time = m_device->getTimer()->getTime();
|
||||
if(time > m_cloud.lasttime)
|
||||
busytime_u32 = time - m_cloud.lasttime;
|
||||
else
|
||||
busytime_u32 = 0;
|
||||
busytime = busytime_u32 / 1000.0;
|
||||
|
||||
// FPS limiter
|
||||
u32 frametime_min = 1000./fps_max;
|
||||
|
||||
if(busytime_u32 < frametime_min) {
|
||||
u32 sleeptime = frametime_min - busytime_u32;
|
||||
m_device->sleep(sleeptime);
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void GUIEngine::drawBackground(video::IVideoDriver* driver)
|
||||
{
|
||||
v2u32 screensize = driver->getScreenSize();
|
||||
|
||||
video::ITexture* texture = m_textures[TEX_LAYER_BACKGROUND];
|
||||
|
||||
/* If no texture, draw background of solid color */
|
||||
if(!texture){
|
||||
video::SColor color(255,80,58,37);
|
||||
core::rect<s32> rect(0, 0, screensize.X, screensize.Y);
|
||||
driver->draw2DRectangle(color, rect, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Draw background texture */
|
||||
v2u32 sourcesize = texture->getSize();
|
||||
driver->draw2DImage(texture,
|
||||
core::rect<s32>(0, 0, screensize.X, screensize.Y),
|
||||
core::rect<s32>(0, 0, sourcesize.X, sourcesize.Y),
|
||||
NULL, NULL, true);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void GUIEngine::drawOverlay(video::IVideoDriver* driver)
|
||||
{
|
||||
v2u32 screensize = driver->getScreenSize();
|
||||
|
||||
video::ITexture* texture = m_textures[TEX_LAYER_OVERLAY];
|
||||
|
||||
/* If no texture, draw background of solid color */
|
||||
if(!texture)
|
||||
return;
|
||||
|
||||
/* Draw background texture */
|
||||
v2u32 sourcesize = texture->getSize();
|
||||
driver->draw2DImage(texture,
|
||||
core::rect<s32>(0, 0, screensize.X, screensize.Y),
|
||||
core::rect<s32>(0, 0, sourcesize.X, sourcesize.Y),
|
||||
NULL, NULL, true);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void GUIEngine::drawHeader(video::IVideoDriver* driver)
|
||||
{
|
||||
core::dimension2d<u32> screensize = driver->getScreenSize();
|
||||
|
||||
video::ITexture* texture = m_textures[TEX_LAYER_HEADER];
|
||||
|
||||
/* If no texture, draw nothing */
|
||||
if(!texture)
|
||||
return;
|
||||
|
||||
f32 mult = (((f32)screensize.Width / 2)) /
|
||||
((f32)texture->getOriginalSize().Width);
|
||||
|
||||
v2s32 splashsize(((f32)texture->getOriginalSize().Width) * mult,
|
||||
((f32)texture->getOriginalSize().Height) * mult);
|
||||
|
||||
// Don't draw the header is there isn't enough room
|
||||
s32 free_space = (((s32)screensize.Height)-320)/2;
|
||||
|
||||
if (free_space > splashsize.Y) {
|
||||
core::rect<s32> splashrect(0, 0, splashsize.X, splashsize.Y);
|
||||
splashrect += v2s32((screensize.Width/2)-(splashsize.X/2),
|
||||
((free_space/2)-splashsize.Y/2)+10);
|
||||
|
||||
video::SColor bgcolor(255,50,50,50);
|
||||
|
||||
driver->draw2DImage(texture, splashrect,
|
||||
core::rect<s32>(core::position2d<s32>(0,0),
|
||||
core::dimension2di(texture->getSize())),
|
||||
NULL, NULL, true);
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void GUIEngine::drawFooter(video::IVideoDriver* driver)
|
||||
{
|
||||
core::dimension2d<u32> screensize = driver->getScreenSize();
|
||||
|
||||
video::ITexture* texture = m_textures[TEX_LAYER_FOOTER];
|
||||
|
||||
/* If no texture, draw nothing */
|
||||
if(!texture)
|
||||
return;
|
||||
|
||||
f32 mult = (((f32)screensize.Width)) /
|
||||
((f32)texture->getOriginalSize().Width);
|
||||
|
||||
v2s32 footersize(((f32)texture->getOriginalSize().Width) * mult,
|
||||
((f32)texture->getOriginalSize().Height) * mult);
|
||||
|
||||
// Don't draw the footer if there isn't enough room
|
||||
s32 free_space = (((s32)screensize.Height)-320)/2;
|
||||
|
||||
if (free_space > footersize.Y) {
|
||||
core::rect<s32> rect(0,0,footersize.X,footersize.Y);
|
||||
rect += v2s32(screensize.Width/2,screensize.Height-footersize.Y);
|
||||
rect -= v2s32(footersize.X/2, 0);
|
||||
|
||||
driver->draw2DImage(texture, rect,
|
||||
core::rect<s32>(core::position2d<s32>(0,0),
|
||||
core::dimension2di(texture->getSize())),
|
||||
NULL, NULL, true);
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
bool GUIEngine::setTexture(texture_layer layer,std::string texturepath) {
|
||||
|
||||
video::IVideoDriver* driver = m_device->getVideoDriver();
|
||||
assert(driver != 0);
|
||||
|
||||
if (m_textures[layer] != 0)
|
||||
{
|
||||
driver->removeTexture(m_textures[layer]);
|
||||
m_textures[layer] = 0;
|
||||
}
|
||||
|
||||
if ((texturepath == "") || !fs::PathExists(texturepath))
|
||||
return false;
|
||||
|
||||
m_textures[layer] = driver->getTexture(texturepath.c_str());
|
||||
|
||||
if (m_textures[layer] == 0) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
#if USE_CURL
|
||||
static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp)
|
||||
{
|
||||
FILE* targetfile = (FILE*) userp;
|
||||
fwrite(contents,size,nmemb,targetfile);
|
||||
return size * nmemb;
|
||||
}
|
||||
#endif
|
||||
bool GUIEngine::downloadFile(std::string url,std::string target) {
|
||||
#if USE_CURL
|
||||
//download file via curl
|
||||
CURL *curl;
|
||||
|
||||
curl = curl_easy_init();
|
||||
|
||||
if (curl)
|
||||
{
|
||||
CURLcode res;
|
||||
bool retval = true;
|
||||
|
||||
FILE* targetfile = fopen(target.c_str(),"wb");
|
||||
|
||||
if (targetfile) {
|
||||
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, targetfile);
|
||||
|
||||
res = curl_easy_perform(curl);
|
||||
if (res != CURLE_OK) {
|
||||
errorstream << "File at url \"" << url
|
||||
<<"\" not found (" << curl_easy_strerror(res) << ")" <<std::endl;
|
||||
retval = false;
|
||||
}
|
||||
fclose(targetfile);
|
||||
}
|
||||
else {
|
||||
retval = false;
|
||||
}
|
||||
|
||||
curl_easy_cleanup(curl);
|
||||
return retval;
|
||||
}
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void GUIEngine::scriptError(const char *fmt, ...)
|
||||
{
|
||||
va_list argp;
|
||||
va_start(argp, fmt);
|
||||
char buf[10000];
|
||||
vsnprintf(buf, 10000, fmt, argp);
|
||||
va_end(argp);
|
||||
errorstream<<"MAINMENU ERROR: "<<buf;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void GUIEngine::setTopleftText(std::string append) {
|
||||
std::string toset = "Minetest " VERSION_STRING;
|
||||
|
||||
if (append != "") {
|
||||
toset += " / ";
|
||||
toset += append;
|
||||
}
|
||||
|
||||
m_irr_toplefttext->setText(narrow_to_wide(toset).c_str());
|
||||
}
|
260
src/guiEngine.h
260
src/guiEngine.h
|
@ -1,260 +0,0 @@
|
|||
/*
|
||||
Minetest
|
||||
Copyright (C) 2013 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.
|
||||
*/
|
||||
|
||||
#ifndef GUI_ENGINE_H_
|
||||
#define GUI_ENGINE_H_
|
||||
|
||||
/******************************************************************************/
|
||||
/* Includes */
|
||||
/******************************************************************************/
|
||||
#include "irrlichttypes.h"
|
||||
#include "modalMenu.h"
|
||||
#include "clouds.h"
|
||||
#include "guiLuaApi.h"
|
||||
#include "guiFormSpecMenu.h"
|
||||
|
||||
/******************************************************************************/
|
||||
/* Typedefs and macros */
|
||||
/******************************************************************************/
|
||||
#define MAX_MENUBAR_BTN_COUNT 10
|
||||
#define MAX_MENUBAR_BTN_ID 256
|
||||
#define MIN_MENUBAR_BTN_ID (MAX_MENUBAR_BTN_ID - MAX_MENUBAR_BTN_COUNT)
|
||||
|
||||
/** texture layer ids */
|
||||
typedef enum {
|
||||
TEX_LAYER_BACKGROUND = 0,
|
||||
TEX_LAYER_OVERLAY,
|
||||
TEX_LAYER_HEADER,
|
||||
TEX_LAYER_FOOTER,
|
||||
TEX_LAYER_MAX
|
||||
} texture_layer;
|
||||
|
||||
/******************************************************************************/
|
||||
/* forward declarations */
|
||||
/******************************************************************************/
|
||||
class GUIEngine;
|
||||
struct MainMenuData;
|
||||
|
||||
/******************************************************************************/
|
||||
/* declarations */
|
||||
/******************************************************************************/
|
||||
|
||||
/** GUIEngine specific implementation of TextDest used within guiFormSpecMenu */
|
||||
class TextDestGuiEngine : public TextDest
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* default constructor
|
||||
* @param engine the engine data is transmitted for further processing
|
||||
*/
|
||||
TextDestGuiEngine(GUIEngine* engine);
|
||||
/**
|
||||
* receive fields transmitted by guiFormSpecMenu
|
||||
* @param fields map containing formspec field elements currently active
|
||||
*/
|
||||
void gotText(std::map<std::string, std::string> fields);
|
||||
|
||||
/**
|
||||
* receive text/events transmitted by guiFormSpecMenu
|
||||
* @param text textual representation of event
|
||||
*/
|
||||
void gotText(std::wstring text);
|
||||
private:
|
||||
/** target to transmit data to */
|
||||
GUIEngine* m_engine;
|
||||
};
|
||||
|
||||
|
||||
/** implementation of main menu based uppon formspecs */
|
||||
class GUIEngine {
|
||||
public:
|
||||
/** TextDestGuiEngine needs to transfer data to engine */
|
||||
friend class TextDestGuiEngine;
|
||||
/** guiLuaApi is used to initialize contained stack */
|
||||
friend class guiLuaApi;
|
||||
|
||||
/**
|
||||
* default constructor
|
||||
* @param dev device to draw at
|
||||
* @param parent parent gui element
|
||||
* @param menumgr manager to add menus to
|
||||
* @param smgr scene manager to add scene elements to
|
||||
* @param data struct to transfer data to main game handling
|
||||
*/
|
||||
GUIEngine( irr::IrrlichtDevice* dev,
|
||||
gui::IGUIElement* parent,
|
||||
IMenuManager *menumgr,
|
||||
scene::ISceneManager* smgr,
|
||||
MainMenuData* data);
|
||||
|
||||
/** default destructor */
|
||||
virtual ~GUIEngine();
|
||||
|
||||
protected:
|
||||
/**
|
||||
* process field data recieved from formspec
|
||||
* @param fields data in field format
|
||||
*/
|
||||
void handleButtons(std::map<std::string, std::string> fields);
|
||||
/**
|
||||
* process events received from formspec
|
||||
* @param text events in textual form
|
||||
*/
|
||||
void handleEvent(std::string text);
|
||||
|
||||
/**
|
||||
* return dir of current menuscript
|
||||
*/
|
||||
std::string getScriptDir() {
|
||||
return m_scriptdir;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
/* run main menu loop */
|
||||
void run();
|
||||
|
||||
/** handler to limit frame rate within main menu */
|
||||
void limitFrameRate();
|
||||
|
||||
/** device to draw at */
|
||||
irr::IrrlichtDevice* m_device;
|
||||
/** parent gui element */
|
||||
gui::IGUIElement* m_parent;
|
||||
/** manager to add menus to */
|
||||
IMenuManager* m_menumanager;
|
||||
/** scene manager to add scene elements to */
|
||||
scene::ISceneManager* m_smgr;
|
||||
/** pointer to data beeing transfered back to main game handling */
|
||||
MainMenuData* m_data;
|
||||
|
||||
/** representation of form source to be used in mainmenu formspec */
|
||||
FormspecFormSource* m_formspecgui;
|
||||
/** formspec input receiver */
|
||||
TextDestGuiEngine* m_buttonhandler;
|
||||
/** the formspec menu */
|
||||
GUIFormSpecMenu* m_menu;
|
||||
|
||||
/** variable used to abort menu and return back to main game handling */
|
||||
bool m_startgame;
|
||||
|
||||
/**
|
||||
* initialize lua stack
|
||||
* @param L stack to initialize
|
||||
*/
|
||||
void initalize_api(lua_State * L);
|
||||
|
||||
/**
|
||||
* run a lua script
|
||||
* @param script full path to script to run
|
||||
*/
|
||||
bool runScript(std::string script);
|
||||
|
||||
/**
|
||||
* script error handler to process errors within lua
|
||||
*/
|
||||
void scriptError(const char *fmt, ...);
|
||||
|
||||
/** lua stack */
|
||||
lua_State* m_engineluastack;
|
||||
/** lua internal stack number of error handler*/
|
||||
int m_luaerrorhandler;
|
||||
|
||||
/** script basefolder */
|
||||
std::string m_scriptdir;
|
||||
|
||||
/**
|
||||
* draw background layer
|
||||
* @param driver to use for drawing
|
||||
*/
|
||||
void drawBackground(video::IVideoDriver* driver);
|
||||
/**
|
||||
* draw overlay layer
|
||||
* @param driver to use for drawing
|
||||
*/
|
||||
void drawOverlay(video::IVideoDriver* driver);
|
||||
/**
|
||||
* draw header layer
|
||||
* @param driver to use for drawing
|
||||
*/
|
||||
void drawHeader(video::IVideoDriver* driver);
|
||||
/**
|
||||
* draw footer layer
|
||||
* @param driver to use for drawing
|
||||
*/
|
||||
void drawFooter(video::IVideoDriver* driver);
|
||||
|
||||
/**
|
||||
* load a texture for a specified layer
|
||||
* @param layer draw layer to specify texture
|
||||
* @param texturepath full path of texture to load
|
||||
*/
|
||||
bool setTexture(texture_layer layer,std::string texturepath);
|
||||
|
||||
/**
|
||||
* download a file using curl
|
||||
* @param url url to download
|
||||
* @param target file to store to
|
||||
*/
|
||||
bool downloadFile(std::string url,std::string target);
|
||||
|
||||
/** array containing pointers to current specified texture layers */
|
||||
video::ITexture* m_textures[TEX_LAYER_MAX];
|
||||
|
||||
/** draw version string in topleft corner */
|
||||
void drawVersion();
|
||||
|
||||
/**
|
||||
* specify text to be appended to version string
|
||||
* @param text to set
|
||||
*/
|
||||
void setTopleftText(std::string append);
|
||||
|
||||
/** pointer to gui element shown at topleft corner */
|
||||
irr::gui::IGUIStaticText* m_irr_toplefttext;
|
||||
|
||||
/** initialize cloud subsystem */
|
||||
void cloudInit();
|
||||
/** do preprocessing for cloud subsystem */
|
||||
void cloudPreProcess();
|
||||
/** do postprocessing for cloud subsystem */
|
||||
void cloudPostProcess();
|
||||
|
||||
/** internam data required for drawing clouds */
|
||||
struct clouddata {
|
||||
/** delta time since last cloud processing */
|
||||
f32 dtime;
|
||||
/** absolute time of last cloud processing */
|
||||
u32 lasttime;
|
||||
/** pointer to cloud class */
|
||||
Clouds* clouds;
|
||||
/** camera required for drawing clouds */
|
||||
scene::ICameraSceneNode* camera;
|
||||
};
|
||||
|
||||
/** is drawing of clouds enabled atm */
|
||||
bool m_clouds_enabled;
|
||||
/** data used to draw clouds */
|
||||
clouddata m_cloud;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif /* GUI_ENGINE_H_ */
|
|
@ -1,133 +0,0 @@
|
|||
/*
|
||||
Minetest
|
||||
Copyright (C) 2013 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.
|
||||
*/
|
||||
|
||||
#include "guiFileSelectMenu.h"
|
||||
#include "util/string.h"
|
||||
#include <locale.h>
|
||||
|
||||
GUIFileSelectMenu::GUIFileSelectMenu(gui::IGUIEnvironment* env,
|
||||
gui::IGUIElement* parent, s32 id, IMenuManager *menumgr,
|
||||
std::string title, std::string formname) :
|
||||
GUIModalMenu(env, parent, id, menumgr)
|
||||
{
|
||||
m_title = narrow_to_wide(title);
|
||||
m_parent = parent;
|
||||
m_formname = formname;
|
||||
m_text_dst = 0;
|
||||
m_accepted = false;
|
||||
m_previous_locale = setlocale(LC_ALL,0);
|
||||
}
|
||||
|
||||
GUIFileSelectMenu::~GUIFileSelectMenu()
|
||||
{
|
||||
removeChildren();
|
||||
setlocale(LC_ALL,m_previous_locale.c_str());
|
||||
}
|
||||
|
||||
void GUIFileSelectMenu::removeChildren()
|
||||
{
|
||||
const core::list<gui::IGUIElement*> &children = getChildren();
|
||||
core::list<gui::IGUIElement*> children_copy;
|
||||
for (core::list<gui::IGUIElement*>::ConstIterator i = children.begin(); i
|
||||
!= children.end(); i++)
|
||||
{
|
||||
children_copy.push_back(*i);
|
||||
}
|
||||
for (core::list<gui::IGUIElement*>::Iterator i = children_copy.begin(); i
|
||||
!= children_copy.end(); i++)
|
||||
{
|
||||
(*i)->remove();
|
||||
}
|
||||
}
|
||||
|
||||
void GUIFileSelectMenu::regenerateGui(v2u32 screensize)
|
||||
{
|
||||
removeChildren();
|
||||
m_fileOpenDialog = 0;
|
||||
|
||||
core::dimension2du size(600,400);
|
||||
core::rect < s32 > rect(0,0,screensize.X,screensize.Y);
|
||||
|
||||
DesiredRect = rect;
|
||||
recalculateAbsolutePosition(false);
|
||||
|
||||
m_fileOpenDialog =
|
||||
Environment->addFileOpenDialog(m_title.c_str(),false,this,-1);
|
||||
|
||||
core::position2di pos = core::position2di(screensize.X/2 - size.Width/2,screensize.Y/2 -size.Height/2);
|
||||
m_fileOpenDialog->setRelativePosition(pos);
|
||||
m_fileOpenDialog->setMinSize(size);
|
||||
}
|
||||
|
||||
void GUIFileSelectMenu::drawMenu()
|
||||
{
|
||||
gui::IGUISkin* skin = Environment->getSkin();
|
||||
if (!skin)
|
||||
return;
|
||||
|
||||
gui::IGUIElement::draw();
|
||||
}
|
||||
|
||||
void GUIFileSelectMenu::acceptInput() {
|
||||
if ((m_text_dst != 0) && (this->m_formname != "")){
|
||||
std::map<std::string, std::string> fields;
|
||||
|
||||
if (m_accepted)
|
||||
fields[m_formname + "_accepted"] = wide_to_narrow(m_fileOpenDialog->getFileName());
|
||||
else
|
||||
fields[m_formname + "_canceled"] = m_formname;
|
||||
|
||||
this->m_text_dst->gotText(fields);
|
||||
}
|
||||
}
|
||||
|
||||
bool GUIFileSelectMenu::OnEvent(const SEvent& event)
|
||||
{
|
||||
|
||||
if (event.EventType == irr::EET_GUI_EVENT) {
|
||||
|
||||
int callerId = event.GUIEvent.Caller->getID();
|
||||
if (callerId >= 0) {
|
||||
std::cout << "CallerId:" << callerId << std::endl;
|
||||
}
|
||||
|
||||
switch (event.GUIEvent.EventType) {
|
||||
case gui::EGET_ELEMENT_CLOSED:
|
||||
case gui::EGET_FILE_CHOOSE_DIALOG_CANCELLED:
|
||||
m_accepted=false;
|
||||
acceptInput();
|
||||
quitMenu();
|
||||
return true;
|
||||
break;
|
||||
|
||||
case gui::EGET_DIRECTORY_SELECTED:
|
||||
case gui::EGET_FILE_SELECTED:
|
||||
m_accepted=true;
|
||||
acceptInput();
|
||||
quitMenu();
|
||||
return true;
|
||||
break;
|
||||
|
||||
default:
|
||||
//ignore this event
|
||||
break;
|
||||
}
|
||||
}
|
||||
return Parent ? Parent->OnEvent(event) : false;
|
||||
}
|
|
@ -1,80 +0,0 @@
|
|||
/*
|
||||
Minetest
|
||||
Copyright (C) 2013 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.
|
||||
*/
|
||||
|
||||
#ifndef GUIFILESELECTMENU_H_
|
||||
#define GUIFILESELECTMENU_H_
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "modalMenu.h"
|
||||
#include "IGUIFileOpenDialog.h"
|
||||
#include "guiFormSpecMenu.h" //required because of TextDest only !!!
|
||||
|
||||
|
||||
class GUIFileSelectMenu: public GUIModalMenu
|
||||
{
|
||||
public:
|
||||
GUIFileSelectMenu(gui::IGUIEnvironment* env, gui::IGUIElement* parent,
|
||||
s32 id, IMenuManager *menumgr,
|
||||
std::string title,
|
||||
std::string formid);
|
||||
~GUIFileSelectMenu();
|
||||
|
||||
void removeChildren();
|
||||
|
||||
/*
|
||||
Remove and re-add (or reposition) stuff
|
||||
*/
|
||||
void regenerateGui(v2u32 screensize);
|
||||
|
||||
void drawMenu();
|
||||
|
||||
bool OnEvent(const SEvent& event);
|
||||
|
||||
bool isRunning() {
|
||||
return m_running;
|
||||
}
|
||||
|
||||
void setTextDest(TextDest * dest) {
|
||||
m_text_dst = dest;
|
||||
}
|
||||
|
||||
private:
|
||||
void acceptInput();
|
||||
|
||||
std::wstring m_title;
|
||||
bool m_accepted;
|
||||
gui::IGUIElement* m_parent;
|
||||
|
||||
std::string m_selectedPath;
|
||||
|
||||
gui::IGUIFileOpenDialog* m_fileOpenDialog;
|
||||
|
||||
std::string m_previous_locale;
|
||||
|
||||
bool m_running;
|
||||
|
||||
TextDest *m_text_dst;
|
||||
|
||||
std::string m_formname;
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif /* GUIFILESELECTMENU_H_ */
|
File diff suppressed because it is too large
Load Diff
|
@ -21,8 +21,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#ifndef GUIINVENTORYMENU_HEADER
|
||||
#define GUIINVENTORYMENU_HEADER
|
||||
|
||||
#include <utility>
|
||||
|
||||
#include "irrlichttypes_extrabloated.h"
|
||||
#include "inventory.h"
|
||||
#include "inventorymanager.h"
|
||||
|
@ -31,15 +29,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
class IGameDef;
|
||||
class InventoryManager;
|
||||
|
||||
typedef enum {
|
||||
f_Button,
|
||||
f_ListBox,
|
||||
f_TabHeader,
|
||||
f_CheckBox,
|
||||
f_DropDown,
|
||||
f_Unknown
|
||||
} FormspecFieldType;
|
||||
|
||||
struct TextDest
|
||||
{
|
||||
virtual ~TextDest() {};
|
||||
|
@ -124,19 +113,10 @@ class GUIFormSpecMenu : public GUIModalMenu
|
|||
pos(a_pos),
|
||||
geom(a_geom)
|
||||
{
|
||||
scale = true;
|
||||
}
|
||||
ImageDrawSpec(const std::string &a_name,
|
||||
v2s32 a_pos):
|
||||
name(a_name),
|
||||
pos(a_pos)
|
||||
{
|
||||
scale = false;
|
||||
}
|
||||
std::string name;
|
||||
v2s32 pos;
|
||||
v2s32 geom;
|
||||
bool scale;
|
||||
};
|
||||
|
||||
struct FieldSpec
|
||||
|
@ -151,7 +131,7 @@ class GUIFormSpecMenu : public GUIModalMenu
|
|||
fid(id)
|
||||
{
|
||||
send = false;
|
||||
ftype = f_Unknown;
|
||||
is_button = false;
|
||||
is_exit = false;
|
||||
tooltip="";
|
||||
}
|
||||
|
@ -160,24 +140,12 @@ class GUIFormSpecMenu : public GUIModalMenu
|
|||
std::wstring fdefault;
|
||||
int fid;
|
||||
bool send;
|
||||
FormspecFieldType ftype;
|
||||
bool is_button;
|
||||
bool is_exit;
|
||||
core::rect<s32> rect;
|
||||
std::string tooltip;
|
||||
};
|
||||
|
||||
struct BoxDrawSpec {
|
||||
BoxDrawSpec(v2s32 a_pos, v2s32 a_geom,irr::video::SColor a_color):
|
||||
pos(a_pos),
|
||||
geom(a_geom),
|
||||
color(a_color)
|
||||
{
|
||||
}
|
||||
v2s32 pos;
|
||||
v2s32 geom;
|
||||
irr::video::SColor color;
|
||||
};
|
||||
|
||||
public:
|
||||
GUIFormSpecMenu(irr::IrrlichtDevice* dev,
|
||||
gui::IGUIElement* parent, s32 id,
|
||||
|
@ -185,7 +153,6 @@ public:
|
|||
InventoryManager *invmgr,
|
||||
IGameDef *gamedef
|
||||
);
|
||||
|
||||
~GUIFormSpecMenu();
|
||||
|
||||
void setFormSpec(const std::string &formspec_string,
|
||||
|
@ -208,20 +175,6 @@ public:
|
|||
m_text_dst = text_dst;
|
||||
}
|
||||
|
||||
void allowClose(bool value)
|
||||
{
|
||||
m_allowclose = value;
|
||||
}
|
||||
|
||||
void useGettext(bool value) {
|
||||
m_use_gettext = true;
|
||||
}
|
||||
|
||||
void lockSize(bool lock,v2u32 basescreensize=v2u32(0,0)) {
|
||||
m_lock = lock;
|
||||
m_lockscreensize = basescreensize;
|
||||
}
|
||||
|
||||
void removeChildren();
|
||||
/*
|
||||
Remove and re-add (or reposition) stuff
|
||||
|
@ -235,21 +188,18 @@ public:
|
|||
void updateSelectedItem();
|
||||
ItemStack verifySelectedItem();
|
||||
|
||||
void acceptInput(int evttype=-1);
|
||||
void acceptInput();
|
||||
bool OnEvent(const SEvent& event);
|
||||
|
||||
int getListboxIndex(std::string listboxname);
|
||||
|
||||
protected:
|
||||
v2s32 getBasePos() const
|
||||
{
|
||||
return padding + offset + AbsoluteRect.UpperLeftCorner;
|
||||
return padding + AbsoluteRect.UpperLeftCorner;
|
||||
}
|
||||
|
||||
v2s32 padding;
|
||||
v2s32 spacing;
|
||||
v2s32 imgsize;
|
||||
v2s32 offset;
|
||||
|
||||
irr::IrrlichtDevice* m_device;
|
||||
InventoryManager *m_invmgr;
|
||||
|
@ -264,10 +214,7 @@ protected:
|
|||
std::vector<ImageDrawSpec> m_backgrounds;
|
||||
std::vector<ImageDrawSpec> m_images;
|
||||
std::vector<ImageDrawSpec> m_itemimages;
|
||||
std::vector<BoxDrawSpec> m_boxes;
|
||||
std::vector<FieldSpec> m_fields;
|
||||
std::vector<std::pair<FieldSpec,gui::IGUIListBox*> > m_listboxes;
|
||||
std::vector<std::pair<FieldSpec,gui::IGUICheckBox*> > m_checkboxes;
|
||||
|
||||
ItemSpec *m_selected_item;
|
||||
u32 m_selected_amount;
|
||||
|
@ -281,83 +228,6 @@ protected:
|
|||
|
||||
v2s32 m_pointer;
|
||||
gui::IGUIStaticText *m_tooltip_element;
|
||||
|
||||
bool m_allowclose;
|
||||
bool m_use_gettext;
|
||||
bool m_lock;
|
||||
v2u32 m_lockscreensize;
|
||||
private:
|
||||
typedef struct {
|
||||
v2s32 size;
|
||||
s32 helptext_h;
|
||||
core::rect<s32> rect;
|
||||
v2s32 basepos;
|
||||
int bp_set;
|
||||
v2u32 screensize;
|
||||
std::map<std::wstring,int> listbox_selections;
|
||||
} parserData;
|
||||
|
||||
typedef struct {
|
||||
bool key_up;
|
||||
bool key_down;
|
||||
bool key_enter;
|
||||
bool key_escape;
|
||||
} fs_key_pendig;
|
||||
|
||||
std::vector<video::ITexture *> m_Textures;
|
||||
|
||||
fs_key_pendig current_keys_pending;
|
||||
|
||||
void parseElement(parserData* data,std::string element);
|
||||
|
||||
void parseSize(parserData* data,std::string element);
|
||||
void parseList(parserData* data,std::string element);
|
||||
void parseCheckbox(parserData* data,std::string element);
|
||||
void parseImage(parserData* data,std::string element);
|
||||
void parseItemImage(parserData* data,std::string element);
|
||||
void parseButton(parserData* data,std::string element,std::string typ);
|
||||
void parseBackground(parserData* data,std::string element);
|
||||
void parseTextList(parserData* data,std::string element);
|
||||
void parseDropDown(parserData* data,std::string element);
|
||||
void parsePwdField(parserData* data,std::string element);
|
||||
void parseField(parserData* data,std::string element,std::string type);
|
||||
void parseSimpleField(parserData* data,std::vector<std::string> &parts);
|
||||
void parseTextArea(parserData* data,std::vector<std::string>& parts,std::string type);
|
||||
void parseLabel(parserData* data,std::string element);
|
||||
void parseVertLabel(parserData* data,std::string element);
|
||||
void parseImageButton(parserData* data,std::string element,std::string type);
|
||||
void parseItemImageButton(parserData* data,std::string element);
|
||||
void parseTabHeader(parserData* data,std::string element);
|
||||
void parseBox(parserData* data,std::string element);
|
||||
|
||||
bool parseColor(std::string color, irr::video::SColor& outcolor);
|
||||
};
|
||||
|
||||
class FormspecFormSource: public IFormSource
|
||||
{
|
||||
public:
|
||||
FormspecFormSource(std::string formspec,FormspecFormSource** game_formspec)
|
||||
{
|
||||
m_formspec = formspec;
|
||||
m_game_formspec = game_formspec;
|
||||
}
|
||||
|
||||
~FormspecFormSource()
|
||||
{
|
||||
*m_game_formspec = 0;
|
||||
}
|
||||
|
||||
void setForm(std::string formspec) {
|
||||
m_formspec = formspec;
|
||||
}
|
||||
|
||||
std::string getForm()
|
||||
{
|
||||
return m_formspec;
|
||||
}
|
||||
|
||||
std::string m_formspec;
|
||||
FormspecFormSource** m_game_formspec;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
1068
src/guiLuaApi.cpp
1068
src/guiLuaApi.cpp
File diff suppressed because it is too large
Load Diff
183
src/guiLuaApi.h
183
src/guiLuaApi.h
|
@ -1,183 +0,0 @@
|
|||
/*
|
||||
Minetest
|
||||
Copyright (C) 2013 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.
|
||||
*/
|
||||
|
||||
#ifndef GUILUAAPI_H_
|
||||
#define GUILUAAPI_H_
|
||||
|
||||
/******************************************************************************/
|
||||
/* Includes */
|
||||
/******************************************************************************/
|
||||
#include "serverlist.h"
|
||||
|
||||
/******************************************************************************/
|
||||
/* Typedefs and macros */
|
||||
/******************************************************************************/
|
||||
typedef int (*lua_CFunction) (lua_State *L);
|
||||
|
||||
/******************************************************************************/
|
||||
/* forward declarations */
|
||||
/******************************************************************************/
|
||||
class GUIEngine;
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* declarations */
|
||||
/******************************************************************************/
|
||||
|
||||
/** Implementation of lua api support for mainmenu */
|
||||
class guiLuaApi {
|
||||
|
||||
public:
|
||||
/**
|
||||
* initialize given Lua stack
|
||||
* @param L lua stack to initialize
|
||||
* @param engine pointer to GUIEngine element to use as reference
|
||||
*/
|
||||
static void initialize(lua_State* L,GUIEngine* engine);
|
||||
|
||||
/** default destructor */
|
||||
virtual ~guiLuaApi() {}
|
||||
|
||||
private:
|
||||
/**
|
||||
* read a text variable from gamedata table within lua stack
|
||||
* @param L stack to read variable from
|
||||
* @param name name of variable to read
|
||||
* @return string value of requested variable
|
||||
*/
|
||||
static std::string getTextData(lua_State *L, std::string name);
|
||||
|
||||
/**
|
||||
* read a integer variable from gamedata table within lua stack
|
||||
* @param L stack to read variable from
|
||||
* @param name name of variable to read
|
||||
* @return integer value of requested variable
|
||||
*/
|
||||
static int getIntegerData(lua_State *L, std::string name,bool& valid);
|
||||
|
||||
/**
|
||||
* read a bool variable from gamedata table within lua stack
|
||||
* @param L stack to read variable from
|
||||
* @param name name of variable to read
|
||||
* @return bool value of requested variable
|
||||
*/
|
||||
static int getBoolData(lua_State *L, std::string name,bool& valid);
|
||||
|
||||
/**
|
||||
* get the corresponding engine pointer from a lua stack
|
||||
* @param L stack to read pointer from
|
||||
* @return pointer to GUIEngine
|
||||
*/
|
||||
static GUIEngine* get_engine(lua_State *L);
|
||||
|
||||
|
||||
/**
|
||||
* register a static member function as lua api call at current position of stack
|
||||
* @param L stack to registe fct to
|
||||
* @param name of function within lua
|
||||
* @param fct C-Function to call on lua call of function
|
||||
* @param top current top of stack
|
||||
*/
|
||||
static bool registerFunction( lua_State* L,
|
||||
const char* name,
|
||||
lua_CFunction fct,
|
||||
int top
|
||||
);
|
||||
|
||||
/**
|
||||
* check if a path is within some of minetests folders
|
||||
* @param path path to check
|
||||
* @return true/false
|
||||
*/
|
||||
static bool isMinetestPath(std::string path);
|
||||
|
||||
//api calls
|
||||
|
||||
static int l_start(lua_State *L);
|
||||
|
||||
static int l_close(lua_State *L);
|
||||
|
||||
static int l_create_world(lua_State *L);
|
||||
|
||||
static int l_delete_world(lua_State *L);
|
||||
|
||||
static int l_get_worlds(lua_State *L);
|
||||
|
||||
static int l_get_games(lua_State *L);
|
||||
|
||||
static int l_get_favorites(lua_State *L);
|
||||
|
||||
static int l_delete_favorite(lua_State *L);
|
||||
|
||||
static int l_get_version(lua_State *L);
|
||||
|
||||
//gui
|
||||
|
||||
static int l_show_keys_menu(lua_State *L);
|
||||
|
||||
static int l_show_file_open_dialog(lua_State *L);
|
||||
|
||||
static int l_set_topleft_text(lua_State *L);
|
||||
|
||||
static int l_set_clouds(lua_State *L);
|
||||
|
||||
static int l_get_textlist_index(lua_State *L);
|
||||
|
||||
static int l_set_background(lua_State *L);
|
||||
|
||||
static int l_update_formspec(lua_State *L);
|
||||
|
||||
//settings
|
||||
|
||||
static int l_setting_set(lua_State *L);
|
||||
|
||||
static int l_setting_get(lua_State *L);
|
||||
|
||||
static int l_setting_getbool(lua_State *L);
|
||||
|
||||
static int l_setting_setbool(lua_State *L);
|
||||
|
||||
//filesystem
|
||||
|
||||
static int l_get_scriptdir(lua_State *L);
|
||||
|
||||
static int l_get_modpath(lua_State *L);
|
||||
|
||||
static int l_get_gamepath(lua_State *L);
|
||||
|
||||
static int l_get_dirlist(lua_State *L);
|
||||
|
||||
static int l_create_dir(lua_State *L);
|
||||
|
||||
static int l_delete_dir(lua_State *L);
|
||||
|
||||
static int l_copy_dir(lua_State *L);
|
||||
|
||||
static int l_extract_zip(lua_State *L);
|
||||
|
||||
static int l_get_modstore_details(lua_State *L);
|
||||
|
||||
static int l_get_modstore_list(lua_State *L);
|
||||
|
||||
static int l_download_file(lua_State *L);
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
|
@ -24,6 +24,15 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#include "modalMenu.h"
|
||||
#include <string>
|
||||
#include <list>
|
||||
#include "subgame.h"
|
||||
#include "serverlist.h"
|
||||
|
||||
class IGameCallback;
|
||||
|
||||
enum {
|
||||
SERVERLIST_FAVORITES,
|
||||
SERVERLIST_PUBLIC,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
|
@ -36,31 +45,113 @@ enum
|
|||
|
||||
struct MainMenuData
|
||||
{
|
||||
// These are in the native format of the gui elements
|
||||
// Generic
|
||||
int selected_tab;
|
||||
std::string selected_game;
|
||||
std::string selected_game_name;
|
||||
// Client options
|
||||
std::string servername;
|
||||
std::string serverdescription;
|
||||
std::string address;
|
||||
std::string port;
|
||||
std::string name;
|
||||
std::string password;
|
||||
|
||||
std::wstring address;
|
||||
std::wstring port;
|
||||
std::wstring name;
|
||||
std::wstring password;
|
||||
bool fancy_trees;
|
||||
bool smooth_lighting;
|
||||
bool clouds_3d;
|
||||
bool opaque_water;
|
||||
bool mip_map;
|
||||
bool anisotropic_filter;
|
||||
bool bilinear_filter;
|
||||
bool trilinear_filter;
|
||||
int enable_shaders;
|
||||
bool preload_item_visuals;
|
||||
bool enable_particles;
|
||||
bool liquid_finite;
|
||||
// Server options
|
||||
bool creative_mode;
|
||||
bool enable_damage;
|
||||
bool enable_public;
|
||||
int selected_world;
|
||||
bool simple_singleplayer_mode;
|
||||
|
||||
// Actions
|
||||
bool kill;
|
||||
std::wstring create_world_name;
|
||||
std::string create_world_gameid;
|
||||
bool only_refresh;
|
||||
|
||||
int selected_serverlist;
|
||||
|
||||
std::vector<WorldSpec> worlds;
|
||||
std::vector<SubgameSpec> games;
|
||||
std::vector<ServerListSpec> servers;
|
||||
|
||||
//error handling
|
||||
std::string errormessage;
|
||||
MainMenuData():
|
||||
// Generic
|
||||
selected_tab(0),
|
||||
selected_game("minetest"),
|
||||
selected_game_name("Minetest"),
|
||||
// Client opts
|
||||
fancy_trees(false),
|
||||
smooth_lighting(false),
|
||||
// Server opts
|
||||
creative_mode(false),
|
||||
enable_damage(false),
|
||||
enable_public(false),
|
||||
selected_world(0),
|
||||
simple_singleplayer_mode(false),
|
||||
errormessage("")
|
||||
// Actions
|
||||
only_refresh(false),
|
||||
|
||||
selected_serverlist(SERVERLIST_FAVORITES)
|
||||
{}
|
||||
};
|
||||
|
||||
class GUIMainMenu : public GUIModalMenu
|
||||
{
|
||||
public:
|
||||
GUIMainMenu(gui::IGUIEnvironment* env,
|
||||
gui::IGUIElement* parent, s32 id,
|
||||
IMenuManager *menumgr,
|
||||
MainMenuData *data,
|
||||
IGameCallback *gamecallback);
|
||||
~GUIMainMenu();
|
||||
|
||||
void removeChildren();
|
||||
// Remove and re-add (or reposition) stuff
|
||||
void regenerateGui(v2u32 screensize);
|
||||
void drawMenu();
|
||||
void readInput(MainMenuData *dst);
|
||||
void acceptInput();
|
||||
bool getStatus()
|
||||
{ return m_accepted; }
|
||||
bool OnEvent(const SEvent& event);
|
||||
void createNewWorld(std::wstring name, std::string gameid);
|
||||
void deleteWorld(const std::vector<std::string> &paths);
|
||||
int getTab();
|
||||
void displayMessageMenu(std::wstring msg);
|
||||
|
||||
private:
|
||||
MainMenuData *m_data;
|
||||
bool m_accepted;
|
||||
IGameCallback *m_gamecallback;
|
||||
|
||||
gui::IGUIEnvironment* env;
|
||||
gui::IGUIElement* parent;
|
||||
s32 id;
|
||||
IMenuManager *menumgr;
|
||||
|
||||
std::vector<int> m_world_indices;
|
||||
|
||||
bool m_is_regenerating;
|
||||
v2s32 m_topleft_client;
|
||||
v2s32 m_size_client;
|
||||
v2s32 m_topleft_server;
|
||||
v2s32 m_size_server;
|
||||
void updateGuiServerList();
|
||||
void serverListOnSelected();
|
||||
ServerListSpec getServerListSpec(std::string address, std::string port);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -178,7 +178,7 @@ void Hud::drawLuaElements() {
|
|||
v2s32 pos(e->pos.X * screensize.X, e->pos.Y * screensize.Y);
|
||||
switch (e->type) {
|
||||
case HUD_ELEM_IMAGE: {
|
||||
video::ITexture *texture = tsrc->getTexture(e->text);
|
||||
video::ITexture *texture = tsrc->getTextureRaw(e->text);
|
||||
if (!texture)
|
||||
continue;
|
||||
|
||||
|
@ -228,7 +228,7 @@ void Hud::drawStatbar(v2s32 pos, u16 corner, u16 drawdir, std::string texture, s
|
|||
const video::SColor color(255, 255, 255, 255);
|
||||
const video::SColor colors[] = {color, color, color, color};
|
||||
|
||||
video::ITexture *stat_texture = tsrc->getTexture(texture);
|
||||
video::ITexture *stat_texture = tsrc->getTextureRaw(texture);
|
||||
if (!stat_texture)
|
||||
return;
|
||||
|
||||
|
@ -306,7 +306,7 @@ void Hud::drawCrosshair() {
|
|||
return;
|
||||
|
||||
if (use_crosshair_image) {
|
||||
video::ITexture *crosshair = tsrc->getTexture("crosshair.png");
|
||||
video::ITexture *crosshair = tsrc->getTextureRaw("crosshair.png");
|
||||
v2u32 size = crosshair->getOriginalSize();
|
||||
v2s32 lsize = v2s32(displaycenter.X - (size.X / 2),
|
||||
displaycenter.Y - (size.Y / 2));
|
||||
|
|
|
@ -229,6 +229,7 @@ public:
|
|||
|
||||
#ifndef SERVER
|
||||
m_main_thread = get_current_thread_id();
|
||||
m_driver = NULL;
|
||||
#endif
|
||||
clear();
|
||||
}
|
||||
|
@ -245,6 +246,13 @@ public:
|
|||
delete cc;
|
||||
}
|
||||
|
||||
if (m_driver != NULL) {
|
||||
for (unsigned int i = 0; i < m_extruded_textures.size(); i++) {
|
||||
m_driver->removeTexture(m_extruded_textures[i]);
|
||||
}
|
||||
m_extruded_textures.clear();
|
||||
}
|
||||
m_driver = NULL;
|
||||
#endif
|
||||
for (std::map<std::string, ItemDefinition*>::iterator iter =
|
||||
m_item_definitions.begin(); iter != m_item_definitions.end();
|
||||
|
@ -299,6 +307,9 @@ public:
|
|||
return m_item_definitions.find(name) != m_item_definitions.end();
|
||||
}
|
||||
#ifndef SERVER
|
||||
private:
|
||||
static video::IVideoDriver * m_driver;
|
||||
static std::vector<video::ITexture*> m_extruded_textures;
|
||||
public:
|
||||
ClientCached* createClientCachedDirect(const std::string &name,
|
||||
IGameDef *gamedef) const
|
||||
|
@ -330,7 +341,7 @@ public:
|
|||
cc->inventory_texture = NULL;
|
||||
if(def->inventory_image != "")
|
||||
{
|
||||
cc->inventory_texture = tsrc->getTexture(def->inventory_image);
|
||||
cc->inventory_texture = tsrc->getTextureRaw(def->inventory_image);
|
||||
}
|
||||
else if(def->type == ITEM_NODE)
|
||||
{
|
||||
|
@ -354,7 +365,7 @@ public:
|
|||
imagename = def->inventory_image;
|
||||
|
||||
cc->wield_mesh = createExtrudedMesh(
|
||||
tsrc->getTexture(imagename),
|
||||
tsrc->getTextureRaw(imagename),
|
||||
driver,
|
||||
def->wield_scale * v3f(40.0, 40.0, 4.0));
|
||||
if(cc->wield_mesh == NULL)
|
||||
|
@ -389,7 +400,7 @@ public:
|
|||
scene::IMesh *node_mesh = mapblock_mesh.getMesh();
|
||||
assert(node_mesh);
|
||||
video::SColor c(255, 255, 255, 255);
|
||||
if(g_settings->getBool("enable_shaders"))
|
||||
if(g_settings->getS32("enable_shaders") != 0)
|
||||
c = MapBlock_LightColor(255, 0xffff, decode_light(f.light_source));
|
||||
setMeshColor(node_mesh, c);
|
||||
|
||||
|
@ -405,33 +416,46 @@ public:
|
|||
*/
|
||||
if(cc->inventory_texture == NULL)
|
||||
{
|
||||
TextureFromMeshParams params;
|
||||
params.mesh = node_mesh;
|
||||
params.dim.set(64, 64);
|
||||
params.rtt_texture_name = "INVENTORY_"
|
||||
core::dimension2d<u32> dim(64,64);
|
||||
std::string rtt_texture_name = "INVENTORY_"
|
||||
+ def->name + "_RTT";
|
||||
params.delete_texture_on_shutdown = true;
|
||||
params.camera_position.set(0, 1.0, -1.5);
|
||||
params.camera_position.rotateXZBy(45);
|
||||
params.camera_lookat.set(0, 0, 0);
|
||||
v3f camera_position(0, 1.0, -1.5);
|
||||
camera_position.rotateXZBy(45);
|
||||
v3f camera_lookat(0, 0, 0);
|
||||
core::CMatrix4<f32> camera_projection_matrix;
|
||||
// Set orthogonal projection
|
||||
params.camera_projection_matrix.buildProjectionMatrixOrthoLH(
|
||||
camera_projection_matrix.buildProjectionMatrixOrthoLH(
|
||||
1.65, 1.65, 0, 100);
|
||||
params.ambient_light.set(1.0, 0.2, 0.2, 0.2);
|
||||
params.light_position.set(10, 100, -50);
|
||||
params.light_color.set(1.0, 0.5, 0.5, 0.5);
|
||||
params.light_radius = 1000;
|
||||
|
||||
cc->inventory_texture =
|
||||
tsrc->generateTextureFromMesh(params);
|
||||
video::SColorf ambient_light(0.2,0.2,0.2);
|
||||
v3f light_position(10, 100, -50);
|
||||
video::SColorf light_color(0.5,0.5,0.5);
|
||||
f32 light_radius = 1000;
|
||||
|
||||
cc->inventory_texture = generateTextureFromMesh(
|
||||
node_mesh, device, dim, rtt_texture_name,
|
||||
camera_position,
|
||||
camera_lookat,
|
||||
camera_projection_matrix,
|
||||
ambient_light,
|
||||
light_position,
|
||||
light_color,
|
||||
light_radius);
|
||||
|
||||
// render-to-target didn't work
|
||||
if(cc->inventory_texture == NULL)
|
||||
{
|
||||
cc->inventory_texture =
|
||||
tsrc->getTexture(f.tiledef[0].name);
|
||||
tsrc->getTextureRaw(f.tiledef[0].name);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_driver == 0)
|
||||
m_driver = driver;
|
||||
|
||||
m_extruded_textures.push_back(cc->inventory_texture);
|
||||
}
|
||||
|
||||
/*
|
||||
Use the node mesh as the wield mesh
|
||||
|
@ -657,3 +681,9 @@ IWritableItemDefManager* createItemDefManager()
|
|||
{
|
||||
return new CItemDefManager();
|
||||
}
|
||||
|
||||
#ifndef SERVER
|
||||
//TODO very very very dirty hack!
|
||||
video::IVideoDriver * CItemDefManager::m_driver = 0;
|
||||
std::vector<video::ITexture*> CItemDefManager::m_extruded_textures;
|
||||
#endif
|
||||
|
|
466
src/main.cpp
466
src/main.cpp
|
@ -78,7 +78,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#include "serverlist.h"
|
||||
#include "sound.h"
|
||||
#include "sound_openal.h"
|
||||
#include "guiEngine.h"
|
||||
|
||||
/*
|
||||
Settings.
|
||||
|
@ -661,6 +660,180 @@ private:
|
|||
bool rightreleased;
|
||||
};
|
||||
|
||||
struct MenuTextures
|
||||
{
|
||||
std::string current_gameid;
|
||||
bool global_textures;
|
||||
video::ITexture *background;
|
||||
video::ITexture *overlay;
|
||||
video::ITexture *header;
|
||||
video::ITexture *footer;
|
||||
|
||||
MenuTextures():
|
||||
global_textures(false),
|
||||
background(NULL),
|
||||
overlay(NULL),
|
||||
header(NULL),
|
||||
footer(NULL)
|
||||
{}
|
||||
|
||||
static video::ITexture* getMenuTexture(const std::string &tname,
|
||||
video::IVideoDriver* driver, const SubgameSpec *spec)
|
||||
{
|
||||
if(spec){
|
||||
std::string path;
|
||||
// eg. minetest_menu_background.png (for texture packs)
|
||||
std::string pack_tname = spec->id + "_menu_" + tname + ".png";
|
||||
path = getTexturePath(pack_tname);
|
||||
if(path != "")
|
||||
return driver->getTexture(path.c_str());
|
||||
// eg. games/minetest_game/menu/background.png
|
||||
path = getImagePath(spec->path + DIR_DELIM + "menu" + DIR_DELIM + tname + ".png");
|
||||
if(path != "")
|
||||
return driver->getTexture(path.c_str());
|
||||
} else {
|
||||
std::string path;
|
||||
// eg. menu_background.png
|
||||
std::string pack_tname = "menu_" + tname + ".png";
|
||||
path = getTexturePath(pack_tname);
|
||||
if(path != "")
|
||||
return driver->getTexture(path.c_str());
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void update(video::IVideoDriver* driver, const SubgameSpec *spec, int tab)
|
||||
{
|
||||
if(tab == TAB_SINGLEPLAYER){
|
||||
if(spec->id == current_gameid)
|
||||
return;
|
||||
current_gameid = spec->id;
|
||||
global_textures = false;
|
||||
background = getMenuTexture("background", driver, spec);
|
||||
overlay = getMenuTexture("overlay", driver, spec);
|
||||
header = getMenuTexture("header", driver, spec);
|
||||
footer = getMenuTexture("footer", driver, spec);
|
||||
} else {
|
||||
if(global_textures)
|
||||
return;
|
||||
current_gameid = "";
|
||||
global_textures = true;
|
||||
background = getMenuTexture("background", driver, NULL);
|
||||
overlay = getMenuTexture("overlay", driver, NULL);
|
||||
header = getMenuTexture("header", driver, NULL);
|
||||
footer = getMenuTexture("footer", driver, NULL);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
void drawMenuBackground(video::IVideoDriver* driver, const MenuTextures &menutextures)
|
||||
{
|
||||
v2u32 screensize = driver->getScreenSize();
|
||||
video::ITexture *texture = menutextures.background;
|
||||
|
||||
/* If no texture, draw background of solid color */
|
||||
if(!texture){
|
||||
video::SColor color(255,80,58,37);
|
||||
core::rect<s32> rect(0, 0, screensize.X, screensize.Y);
|
||||
driver->draw2DRectangle(color, rect, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Draw background texture */
|
||||
v2u32 sourcesize = texture->getSize();
|
||||
driver->draw2DImage(texture,
|
||||
core::rect<s32>(0, 0, screensize.X, screensize.Y),
|
||||
core::rect<s32>(0, 0, sourcesize.X, sourcesize.Y),
|
||||
NULL, NULL, true);
|
||||
}
|
||||
|
||||
void drawMenuOverlay(video::IVideoDriver* driver, const MenuTextures &menutextures)
|
||||
{
|
||||
v2u32 screensize = driver->getScreenSize();
|
||||
video::ITexture *texture = menutextures.overlay;
|
||||
|
||||
/* If no texture, draw nothing */
|
||||
if(!texture)
|
||||
return;
|
||||
|
||||
/* Draw overlay texture */
|
||||
v2u32 sourcesize = texture->getSize();
|
||||
driver->draw2DImage(texture,
|
||||
core::rect<s32>(0, 0, screensize.X, screensize.Y),
|
||||
core::rect<s32>(0, 0, sourcesize.X, sourcesize.Y),
|
||||
NULL, NULL, true);
|
||||
}
|
||||
|
||||
void drawMenuHeader(video::IVideoDriver* driver, const MenuTextures &menutextures)
|
||||
{
|
||||
core::dimension2d<u32> screensize = driver->getScreenSize();
|
||||
video::ITexture *texture = menutextures.header;
|
||||
|
||||
/* If no texture, draw nothing */
|
||||
if(!texture)
|
||||
return;
|
||||
|
||||
f32 mult = (((f32)screensize.Width / 2)) /
|
||||
((f32)texture->getOriginalSize().Width);
|
||||
|
||||
v2s32 splashsize(((f32)texture->getOriginalSize().Width) * mult,
|
||||
((f32)texture->getOriginalSize().Height) * mult);
|
||||
|
||||
// Don't draw the header is there isn't enough room
|
||||
s32 free_space = (((s32)screensize.Height)-320)/2;
|
||||
if (free_space > splashsize.Y) {
|
||||
core::rect<s32> splashrect(0, 0, splashsize.X, splashsize.Y);
|
||||
splashrect += v2s32((screensize.Width/2)-(splashsize.X/2),
|
||||
((free_space/2)-splashsize.Y/2)+10);
|
||||
|
||||
video::SColor bgcolor(255,50,50,50);
|
||||
|
||||
driver->draw2DImage(texture, splashrect,
|
||||
core::rect<s32>(core::position2d<s32>(0,0),
|
||||
core::dimension2di(texture->getSize())),
|
||||
NULL, NULL, true);
|
||||
}
|
||||
}
|
||||
|
||||
void drawMenuFooter(video::IVideoDriver* driver, const MenuTextures &menutextures)
|
||||
{
|
||||
core::dimension2d<u32> screensize = driver->getScreenSize();
|
||||
video::ITexture *texture = menutextures.footer;
|
||||
|
||||
/* If no texture, draw nothing */
|
||||
if(!texture)
|
||||
return;
|
||||
|
||||
f32 mult = (((f32)screensize.Width)) /
|
||||
((f32)texture->getOriginalSize().Width);
|
||||
|
||||
v2s32 footersize(((f32)texture->getOriginalSize().Width) * mult,
|
||||
((f32)texture->getOriginalSize().Height) * mult);
|
||||
|
||||
// Don't draw the footer if there isn't enough room
|
||||
s32 free_space = (((s32)screensize.Height)-320)/2;
|
||||
if (free_space > footersize.Y) {
|
||||
core::rect<s32> rect(0,0,footersize.X,footersize.Y);
|
||||
rect += v2s32(screensize.Width/2,screensize.Height-footersize.Y);
|
||||
rect -= v2s32(footersize.X/2, 0);
|
||||
|
||||
driver->draw2DImage(texture, rect,
|
||||
core::rect<s32>(core::position2d<s32>(0,0),
|
||||
core::dimension2di(texture->getSize())),
|
||||
NULL, NULL, true);
|
||||
}
|
||||
}
|
||||
|
||||
static const SubgameSpec* getMenuGame(const MainMenuData &menudata)
|
||||
{
|
||||
for(size_t i=0; i<menudata.games.size(); i++){
|
||||
if(menudata.games[i].id == menudata.selected_game){
|
||||
return &menudata.games[i];
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif // !SERVER
|
||||
|
||||
// These are defined global so that they're not optimized too much.
|
||||
|
@ -1557,37 +1730,83 @@ int main(int argc, char *argv[])
|
|||
|
||||
// Initialize menu data
|
||||
MainMenuData menudata;
|
||||
menudata.kill = kill;
|
||||
menudata.address = address;
|
||||
menudata.name = playername;
|
||||
menudata.port = itos(port);
|
||||
menudata.errormessage = wide_to_narrow(error_message);
|
||||
error_message = L"";
|
||||
if(g_settings->exists("selected_mainmenu_tab"))
|
||||
menudata.selected_tab = g_settings->getS32("selected_mainmenu_tab");
|
||||
if(g_settings->exists("selected_serverlist"))
|
||||
menudata.selected_serverlist = g_settings->getS32("selected_serverlist");
|
||||
if(g_settings->exists("selected_mainmenu_game")){
|
||||
menudata.selected_game = g_settings->get("selected_mainmenu_game");
|
||||
menudata.selected_game_name = findSubgame(menudata.selected_game).name;
|
||||
}
|
||||
menudata.address = narrow_to_wide(address);
|
||||
menudata.name = narrow_to_wide(playername);
|
||||
menudata.port = narrow_to_wide(itos(port));
|
||||
if(cmd_args.exists("password"))
|
||||
menudata.password = cmd_args.get("password");
|
||||
|
||||
driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, g_settings->getBool("mip_map"));
|
||||
|
||||
menudata.password = narrow_to_wide(cmd_args.get("password"));
|
||||
menudata.fancy_trees = g_settings->getBool("new_style_leaves");
|
||||
menudata.smooth_lighting = g_settings->getBool("smooth_lighting");
|
||||
menudata.clouds_3d = g_settings->getBool("enable_3d_clouds");
|
||||
menudata.opaque_water = g_settings->getBool("opaque_water");
|
||||
menudata.mip_map = g_settings->getBool("mip_map");
|
||||
menudata.anisotropic_filter = g_settings->getBool("anisotropic_filter");
|
||||
menudata.bilinear_filter = g_settings->getBool("bilinear_filter");
|
||||
menudata.trilinear_filter = g_settings->getBool("trilinear_filter");
|
||||
menudata.enable_shaders = g_settings->getS32("enable_shaders");
|
||||
menudata.preload_item_visuals = g_settings->getBool("preload_item_visuals");
|
||||
menudata.enable_particles = g_settings->getBool("enable_particles");
|
||||
menudata.liquid_finite = g_settings->getBool("liquid_finite");
|
||||
driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, menudata.mip_map);
|
||||
menudata.creative_mode = g_settings->getBool("creative_mode");
|
||||
menudata.enable_damage = g_settings->getBool("enable_damage");
|
||||
menudata.enable_public = g_settings->getBool("server_announce");
|
||||
|
||||
// Default to selecting nothing
|
||||
menudata.selected_world = -1;
|
||||
// Get world listing for the menu
|
||||
std::vector<WorldSpec> worldspecs = getAvailableWorlds();
|
||||
|
||||
// If there is only one world, select it
|
||||
if(worldspecs.size() == 1){
|
||||
menudata.selected_world = 0;
|
||||
}
|
||||
// Otherwise try to select according to selected_world_path
|
||||
else if(g_settings->exists("selected_world_path")){
|
||||
std::string trypath = g_settings->get("selected_world_path");
|
||||
for(u32 i=0; i<worldspecs.size(); i++){
|
||||
if(worldspecs[i].path == trypath){
|
||||
menudata.selected_world = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
// If a world was commanded, append and select it
|
||||
if(commanded_world != ""){
|
||||
|
||||
std::string gameid = getWorldGameId(commanded_world, true);
|
||||
std::string name = _("[--world parameter]");
|
||||
if(gameid == ""){
|
||||
gameid = g_settings->get("default_game");
|
||||
name += " [new]";
|
||||
}
|
||||
//TODO find within worldspecs and set config
|
||||
WorldSpec spec(commanded_world, name, gameid);
|
||||
worldspecs.push_back(spec);
|
||||
menudata.selected_world = worldspecs.size()-1;
|
||||
}
|
||||
// Copy worldspecs to menu
|
||||
menudata.worlds = worldspecs;
|
||||
// Get game listing
|
||||
menudata.games = getAvailableGames();
|
||||
// If selected game doesn't exist, take first from list
|
||||
if(findSubgame(menudata.selected_game).id == "" &&
|
||||
!menudata.games.empty()){
|
||||
menudata.selected_game = menudata.games[0].id;
|
||||
}
|
||||
const SubgameSpec *menugame = getMenuGame(menudata);
|
||||
|
||||
MenuTextures menutextures;
|
||||
menutextures.update(driver, menugame, menudata.selected_tab);
|
||||
|
||||
if(skip_main_menu == false)
|
||||
{
|
||||
video::IVideoDriver* driver = device->getVideoDriver();
|
||||
|
||||
float fps_max = g_settings->getFloat("fps_max");
|
||||
infostream<<"Waiting for other menus"<<std::endl;
|
||||
while(device->run() && kill == false)
|
||||
{
|
||||
|
@ -1595,6 +1814,7 @@ int main(int argc, char *argv[])
|
|||
break;
|
||||
driver->beginScene(true, true,
|
||||
video::SColor(255,128,128,128));
|
||||
drawMenuBackground(driver, menutextures);
|
||||
guienv->drawAll();
|
||||
driver->endScene();
|
||||
// On some computers framerate doesn't seem to be
|
||||
|
@ -1603,40 +1823,170 @@ int main(int argc, char *argv[])
|
|||
}
|
||||
infostream<<"Waited for other menus"<<std::endl;
|
||||
|
||||
GUIEngine* temp = new GUIEngine(device, guiroot, &g_menumgr,smgr,&menudata);
|
||||
|
||||
delete temp;
|
||||
//once finished you'll never end up here
|
||||
smgr->clear();
|
||||
kill = menudata.kill;
|
||||
GUIMainMenu *menu =
|
||||
new GUIMainMenu(guienv, guiroot, -1,
|
||||
&g_menumgr, &menudata, g_gamecallback);
|
||||
menu->allowFocusRemoval(true);
|
||||
|
||||
if(error_message != L"")
|
||||
{
|
||||
verbosestream<<"error_message = "
|
||||
<<wide_to_narrow(error_message)<<std::endl;
|
||||
|
||||
GUIMessageMenu *menu2 =
|
||||
new GUIMessageMenu(guienv, guiroot, -1,
|
||||
&g_menumgr, error_message.c_str());
|
||||
menu2->drop();
|
||||
error_message = L"";
|
||||
}
|
||||
|
||||
// Time is in milliseconds, for clouds
|
||||
u32 lasttime = device->getTimer()->getTime();
|
||||
|
||||
MenuMusicFetcher soundfetcher;
|
||||
ISoundManager *sound = NULL;
|
||||
#if USE_SOUND
|
||||
sound = createOpenALSoundManager(&soundfetcher);
|
||||
#endif
|
||||
if(!sound)
|
||||
sound = &dummySoundManager;
|
||||
SimpleSoundSpec spec;
|
||||
spec.name = "main_menu";
|
||||
spec.gain = 1;
|
||||
s32 handle = sound->playSound(spec, true);
|
||||
|
||||
infostream<<"Created main menu"<<std::endl;
|
||||
|
||||
while(device->run() && kill == false)
|
||||
{
|
||||
if(menu->getStatus() == true)
|
||||
break;
|
||||
|
||||
// Game can be selected in the menu
|
||||
menugame = getMenuGame(menudata);
|
||||
menutextures.update(driver, menugame, menu->getTab());
|
||||
// Clouds for the main menu
|
||||
bool cloud_menu_background = g_settings->getBool("menu_clouds");
|
||||
if(menugame){
|
||||
// If game has regular background and no overlay, don't use clouds
|
||||
if(cloud_menu_background && menutextures.background &&
|
||||
!menutextures.overlay){
|
||||
cloud_menu_background = false;
|
||||
}
|
||||
// If game game has overlay and no regular background, always draw clouds
|
||||
else if(menutextures.overlay && !menutextures.background){
|
||||
cloud_menu_background = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Time calc for the clouds
|
||||
f32 dtime=0; // in seconds
|
||||
if (cloud_menu_background) {
|
||||
u32 time = device->getTimer()->getTime();
|
||||
if(time > lasttime)
|
||||
dtime = (time - lasttime) / 1000.0;
|
||||
else
|
||||
dtime = 0;
|
||||
lasttime = time;
|
||||
}
|
||||
|
||||
//driver->beginScene(true, true, video::SColor(255,0,0,0));
|
||||
driver->beginScene(true, true, video::SColor(255,140,186,250));
|
||||
|
||||
if (cloud_menu_background) {
|
||||
// *3 otherwise the clouds would move very slowly
|
||||
g_menuclouds->step(dtime*3);
|
||||
g_menuclouds->render();
|
||||
g_menucloudsmgr->drawAll();
|
||||
drawMenuOverlay(driver, menutextures);
|
||||
drawMenuHeader(driver, menutextures);
|
||||
drawMenuFooter(driver, menutextures);
|
||||
} else {
|
||||
drawMenuBackground(driver, menutextures);
|
||||
drawMenuHeader(driver, menutextures);
|
||||
drawMenuFooter(driver, menutextures);
|
||||
}
|
||||
|
||||
guienv->drawAll();
|
||||
|
||||
driver->endScene();
|
||||
|
||||
// On some computers framerate doesn't seem to be
|
||||
// automatically limited
|
||||
if (cloud_menu_background) {
|
||||
// Time of frame without fps limit
|
||||
float busytime;
|
||||
u32 busytime_u32;
|
||||
// not using getRealTime is necessary for wine
|
||||
u32 time = device->getTimer()->getTime();
|
||||
if(time > lasttime)
|
||||
busytime_u32 = time - lasttime;
|
||||
else
|
||||
busytime_u32 = 0;
|
||||
busytime = busytime_u32 / 1000.0;
|
||||
|
||||
// FPS limiter
|
||||
u32 frametime_min = 1000./fps_max;
|
||||
|
||||
if(busytime_u32 < frametime_min) {
|
||||
u32 sleeptime = frametime_min - busytime_u32;
|
||||
device->sleep(sleeptime);
|
||||
}
|
||||
} else {
|
||||
sleep_ms(25);
|
||||
}
|
||||
}
|
||||
sound->stopSound(handle);
|
||||
if(sound != &dummySoundManager){
|
||||
delete sound;
|
||||
sound = NULL;
|
||||
}
|
||||
|
||||
// Save controls status
|
||||
menu->readInput(&menudata);
|
||||
|
||||
infostream<<"Dropping main menu"<<std::endl;
|
||||
|
||||
menu->drop();
|
||||
}
|
||||
|
||||
//update worldspecs (necessary as new world may have been created)
|
||||
worldspecs = getAvailableWorlds();
|
||||
|
||||
if (menudata.name == "")
|
||||
menudata.name = std::string("Guest") + itos(myrand_range(1000,9999));
|
||||
else
|
||||
playername = menudata.name;
|
||||
|
||||
password = translatePassword(playername, narrow_to_wide(menudata.password));
|
||||
playername = wide_to_narrow(menudata.name);
|
||||
if (playername == "")
|
||||
playername = std::string("Guest") + itos(myrand_range(1000,9999));
|
||||
password = translatePassword(playername, menudata.password);
|
||||
//infostream<<"Main: password hash: '"<<password<<"'"<<std::endl;
|
||||
|
||||
address = menudata.address;
|
||||
int newport = stoi(menudata.port);
|
||||
address = wide_to_narrow(menudata.address);
|
||||
int newport = stoi(wide_to_narrow(menudata.port));
|
||||
if(newport != 0)
|
||||
port = newport;
|
||||
|
||||
simple_singleplayer_mode = menudata.simple_singleplayer_mode;
|
||||
|
||||
// Save settings
|
||||
g_settings->setS32("selected_mainmenu_tab", menudata.selected_tab);
|
||||
g_settings->setS32("selected_serverlist", menudata.selected_serverlist);
|
||||
g_settings->set("selected_mainmenu_game", menudata.selected_game);
|
||||
g_settings->set("new_style_leaves", itos(menudata.fancy_trees));
|
||||
g_settings->set("smooth_lighting", itos(menudata.smooth_lighting));
|
||||
g_settings->set("enable_3d_clouds", itos(menudata.clouds_3d));
|
||||
g_settings->set("opaque_water", itos(menudata.opaque_water));
|
||||
|
||||
g_settings->set("mip_map", itos(menudata.mip_map));
|
||||
g_settings->set("anisotropic_filter", itos(menudata.anisotropic_filter));
|
||||
g_settings->set("bilinear_filter", itos(menudata.bilinear_filter));
|
||||
g_settings->set("trilinear_filter", itos(menudata.trilinear_filter));
|
||||
|
||||
g_settings->setS32("enable_shaders", menudata.enable_shaders);
|
||||
g_settings->set("preload_item_visuals", itos(menudata.preload_item_visuals));
|
||||
g_settings->set("enable_particles", itos(menudata.enable_particles));
|
||||
g_settings->set("liquid_finite", itos(menudata.liquid_finite));
|
||||
|
||||
g_settings->set("creative_mode", itos(menudata.creative_mode));
|
||||
g_settings->set("enable_damage", itos(menudata.enable_damage));
|
||||
g_settings->set("server_announce", itos(menudata.enable_public));
|
||||
g_settings->set("name", playername);
|
||||
g_settings->set("address", address);
|
||||
g_settings->set("port", itos(port));
|
||||
|
||||
if((menudata.selected_world >= 0) &&
|
||||
(menudata.selected_world < worldspecs.size()))
|
||||
if(menudata.selected_world != -1)
|
||||
g_settings->set("selected_world_path",
|
||||
worldspecs[menudata.selected_world].path);
|
||||
|
||||
|
@ -1660,20 +2010,42 @@ int main(int argc, char *argv[])
|
|||
{
|
||||
ServerListSpec server;
|
||||
server["name"] = menudata.servername;
|
||||
server["address"] = menudata.address;
|
||||
server["port"] = menudata.port;
|
||||
server["address"] = wide_to_narrow(menudata.address);
|
||||
server["port"] = wide_to_narrow(menudata.port);
|
||||
server["description"] = menudata.serverdescription;
|
||||
ServerList::insert(server);
|
||||
}
|
||||
|
||||
// Set world path to selected one
|
||||
if ((menudata.selected_world >= 0) &&
|
||||
(menudata.selected_world < worldspecs.size())) {
|
||||
if(menudata.selected_world != -1){
|
||||
worldspec = worldspecs[menudata.selected_world];
|
||||
infostream<<"Selected world: "<<worldspec.name
|
||||
<<" ["<<worldspec.path<<"]"<<std::endl;
|
||||
}
|
||||
|
||||
// Only refresh if so requested
|
||||
if(menudata.only_refresh){
|
||||
infostream<<"Refreshing menu"<<std::endl;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Create new world if requested
|
||||
if(menudata.create_world_name != L"")
|
||||
{
|
||||
std::string path = porting::path_user + DIR_DELIM
|
||||
"worlds" + DIR_DELIM
|
||||
+ wide_to_narrow(menudata.create_world_name);
|
||||
// Create world if it doesn't exist
|
||||
if(!initializeWorld(path, menudata.create_world_gameid)){
|
||||
error_message = wgettext("Failed to initialize world");
|
||||
errorstream<<wide_to_narrow(error_message)<<std::endl;
|
||||
continue;
|
||||
}
|
||||
g_settings->set("selected_world_path", path);
|
||||
g_settings->set("selected_mainmenu_game", menudata.create_world_gameid);
|
||||
continue;
|
||||
}
|
||||
|
||||
// If local game
|
||||
if(current_address == "")
|
||||
{
|
||||
|
@ -1713,10 +2085,8 @@ int main(int argc, char *argv[])
|
|||
}
|
||||
|
||||
// Break out of menu-game loop to shut down cleanly
|
||||
if(device->run() == false || kill == true) {
|
||||
g_settings->updateConfigFile(configpath.c_str());
|
||||
if(device->run() == false || kill == true)
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
Run game
|
||||
|
@ -1768,11 +2138,11 @@ int main(int argc, char *argv[])
|
|||
break;
|
||||
}
|
||||
} // Menu-game loop
|
||||
|
||||
|
||||
|
||||
|
||||
g_menuclouds->drop();
|
||||
g_menucloudsmgr->drop();
|
||||
|
||||
|
||||
delete input;
|
||||
|
||||
/*
|
||||
|
|
32
src/map.cpp
32
src/map.cpp
|
@ -1653,8 +1653,6 @@ void Map::transformLiquidsFinite(std::map<v3s16, MapBlock*> & modified_blocks)
|
|||
|
||||
u16 loop_max = g_settings->getU16("liquid_loop_max");
|
||||
|
||||
//if (m_transforming_liquid.size() > 0) errorstream << "Liquid queue size="<<m_transforming_liquid.size()<<std::endl;
|
||||
|
||||
while (m_transforming_liquid.size() > 0)
|
||||
{
|
||||
// This should be done here so that it is done when continue is used
|
||||
|
@ -1773,7 +1771,7 @@ void Map::transformLiquidsFinite(std::map<v3s16, MapBlock*> & modified_blocks)
|
|||
}
|
||||
|
||||
// prevent lakes in air above unloaded blocks
|
||||
if (liquid_levels[D_TOP] == 0 && (p0.Y > water_level) && neighbors[D_BOTTOM].n.getContent() == CONTENT_IGNORE && !(loopcount % 3)) {
|
||||
if (liquid_levels[D_TOP] == 0 && (p0.Y > water_level || !fast_flood) && neighbors[D_BOTTOM].n.getContent() == CONTENT_IGNORE) {
|
||||
--total_level;
|
||||
}
|
||||
|
||||
|
@ -1796,16 +1794,11 @@ void Map::transformLiquidsFinite(std::map<v3s16, MapBlock*> & modified_blocks)
|
|||
if (!neighbors[ii].l)
|
||||
continue;
|
||||
liquid_levels_want[ii] = want_level;
|
||||
if (liquid_levels_want[ii] < LIQUID_LEVEL_SOURCE && total_level > 0) {
|
||||
if (loopcount % 3 || liquid_levels[ii] <= 0){
|
||||
if (liquid_levels[ii] > liquid_levels_want[ii]) {
|
||||
++liquid_levels_want[ii];
|
||||
--total_level;
|
||||
}
|
||||
} else if (neighbors[ii].l > 0){
|
||||
++liquid_levels_want[ii];
|
||||
--total_level;
|
||||
}
|
||||
if (liquid_levels_want[ii] < LIQUID_LEVEL_SOURCE && total_level > 0
|
||||
&& liquid_levels[ii] > liquid_levels_want[ii]
|
||||
) {
|
||||
++liquid_levels_want[ii];
|
||||
--total_level;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3244,18 +3237,17 @@ v2s16 ServerMap::getSectorPos(std::string dirname)
|
|||
{
|
||||
unsigned int x, y;
|
||||
int r;
|
||||
std::string component;
|
||||
fs::RemoveLastPathComponent(dirname, &component, 1);
|
||||
if(component.size() == 8)
|
||||
size_t spos = dirname.rfind(DIR_DELIM_C) + 1;
|
||||
assert(spos != std::string::npos);
|
||||
if(dirname.size() - spos == 8)
|
||||
{
|
||||
// Old layout
|
||||
r = sscanf(component.c_str(), "%4x%4x", &x, &y);
|
||||
r = sscanf(dirname.substr(spos).c_str(), "%4x%4x", &x, &y);
|
||||
}
|
||||
else if(component.size() == 3)
|
||||
else if(dirname.size() - spos == 3)
|
||||
{
|
||||
// New layout
|
||||
fs::RemoveLastPathComponent(dirname, &component, 2);
|
||||
r = sscanf(component.c_str(), "%3x" DIR_DELIM "%3x", &x, &y);
|
||||
r = sscanf(dirname.substr(spos-4).c_str(), "%3x" DIR_DELIM "%3x", &x, &y);
|
||||
// Sign-extend the 12 bit values up to 16 bits...
|
||||
if(x&0x800) x|=0xF000;
|
||||
if(y&0x800) y|=0xF000;
|
||||
|
|
|
@ -452,11 +452,6 @@ static void makeFastFace(TileSpec tile, u16 li0, u16 li1, u16 li2, u16 li3,
|
|||
// Position is at the center of the cube.
|
||||
v3f pos = p * BS;
|
||||
|
||||
float x0 = 0.0;
|
||||
float y0 = 0.0;
|
||||
float w = 1.0;
|
||||
float h = 1.0;
|
||||
|
||||
v3f vertex_pos[4];
|
||||
v3s16 vertex_dirs[4];
|
||||
getNodeVertexDirs(dir, vertex_dirs);
|
||||
|
@ -493,8 +488,8 @@ static void makeFastFace(TileSpec tile, u16 li0, u16 li1, u16 li2, u16 li3,
|
|||
vertex_dirs[3] = vertex_dirs[2];
|
||||
vertex_dirs[2] = vertex_dirs[1];
|
||||
vertex_dirs[1] = t;
|
||||
y0 += h;
|
||||
h *= -1;
|
||||
tile.texture.pos.Y += tile.texture.size.Y;
|
||||
tile.texture.size.Y *= -1;
|
||||
break;
|
||||
case 5: //FXR270
|
||||
t = vertex_dirs[0];
|
||||
|
@ -502,8 +497,8 @@ static void makeFastFace(TileSpec tile, u16 li0, u16 li1, u16 li2, u16 li3,
|
|||
vertex_dirs[1] = vertex_dirs[2];
|
||||
vertex_dirs[2] = vertex_dirs[3];
|
||||
vertex_dirs[3] = t;
|
||||
y0 += h;
|
||||
h *= -1;
|
||||
tile.texture.pos.Y += tile.texture.size.Y;
|
||||
tile.texture.size.Y *= -1;
|
||||
break;
|
||||
case 6: //FYR90
|
||||
t = vertex_dirs[0];
|
||||
|
@ -511,8 +506,8 @@ static void makeFastFace(TileSpec tile, u16 li0, u16 li1, u16 li2, u16 li3,
|
|||
vertex_dirs[3] = vertex_dirs[2];
|
||||
vertex_dirs[2] = vertex_dirs[1];
|
||||
vertex_dirs[1] = t;
|
||||
x0 += w;
|
||||
w *= -1;
|
||||
tile.texture.pos.X += tile.texture.size.X;
|
||||
tile.texture.size.X *= -1;
|
||||
break;
|
||||
case 7: //FYR270
|
||||
t = vertex_dirs[0];
|
||||
|
@ -520,16 +515,16 @@ static void makeFastFace(TileSpec tile, u16 li0, u16 li1, u16 li2, u16 li3,
|
|||
vertex_dirs[1] = vertex_dirs[2];
|
||||
vertex_dirs[2] = vertex_dirs[3];
|
||||
vertex_dirs[3] = t;
|
||||
x0 += w;
|
||||
w *= -1;
|
||||
tile.texture.pos.X += tile.texture.size.X;
|
||||
tile.texture.size.X *= -1;
|
||||
break;
|
||||
case 8: //FX
|
||||
y0 += h;
|
||||
h *= -1;
|
||||
tile.texture.pos.Y += tile.texture.size.Y;
|
||||
tile.texture.size.Y *= -1;
|
||||
break;
|
||||
case 9: //FY
|
||||
x0 += w;
|
||||
w *= -1;
|
||||
tile.texture.pos.X += tile.texture.size.X;
|
||||
tile.texture.size.X *= -1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -560,6 +555,11 @@ static void makeFastFace(TileSpec tile, u16 li0, u16 li1, u16 li2, u16 li3,
|
|||
|
||||
u8 alpha = tile.alpha;
|
||||
|
||||
float x0 = tile.texture.pos.X;
|
||||
float y0 = tile.texture.pos.Y;
|
||||
float w = tile.texture.size.X;
|
||||
float h = tile.texture.size.Y;
|
||||
|
||||
face.vertices[0] = video::S3DVertex(vertex_pos[0], normal,
|
||||
MapBlock_LightColor(alpha, li0, light_source),
|
||||
core::vector2d<f32>(x0+w*abs_scale, y0+h));
|
||||
|
@ -645,6 +645,12 @@ TileSpec getNodeTileN(MapNode mn, v3s16 p, u8 tileindex, MeshMakeData *data)
|
|||
if(p == data->m_crack_pos_relative)
|
||||
{
|
||||
spec.material_flags |= MATERIAL_FLAG_CRACK;
|
||||
spec.texture = data->m_gamedef->tsrc()->getTextureRawAP(spec.texture);
|
||||
}
|
||||
// If animated, replace tile texture with one without texture atlas
|
||||
if(spec.material_flags & MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES)
|
||||
{
|
||||
spec.texture = data->m_gamedef->tsrc()->getTextureRawAP(spec.texture);
|
||||
}
|
||||
return spec;
|
||||
}
|
||||
|
@ -711,7 +717,7 @@ TileSpec getNodeTile(MapNode mn, v3s16 p, v3s16 dir, MeshMakeData *data)
|
|||
u16 tile_index=facedir*16 + dir_i;
|
||||
TileSpec spec = getNodeTileN(mn, p, dir_to_tile[tile_index], data);
|
||||
spec.rotation=dir_to_tile[tile_index + 1];
|
||||
spec.texture = data->m_gamedef->tsrc()->getTexture(spec.texture_id);
|
||||
spec.texture = data->m_gamedef->tsrc()->getTexture(spec.texture.id);
|
||||
return spec;
|
||||
}
|
||||
|
||||
|
@ -883,7 +889,23 @@ static void updateFastFaceRow(
|
|||
|
||||
continuous_tiles_count++;
|
||||
|
||||
if(next_is_different)
|
||||
// This is set to true if the texture doesn't allow more tiling
|
||||
bool end_of_texture = false;
|
||||
/*
|
||||
If there is no texture, it can be tiled infinitely.
|
||||
If tiled==0, it means the texture can be tiled infinitely.
|
||||
Otherwise check tiled agains continuous_tiles_count.
|
||||
*/
|
||||
if(tile.texture.atlas != NULL && tile.texture.tiled != 0)
|
||||
{
|
||||
if(tile.texture.tiled <= continuous_tiles_count)
|
||||
end_of_texture = true;
|
||||
}
|
||||
|
||||
// Do this to disable tiling textures
|
||||
//end_of_texture = true; //DEBUG
|
||||
|
||||
if(next_is_different || end_of_texture)
|
||||
{
|
||||
/*
|
||||
Create a face if there should be one
|
||||
|
@ -1038,7 +1060,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data):
|
|||
const u16 indices[] = {0,1,2,2,3,0};
|
||||
const u16 indices_alternate[] = {0,1,3,2,3,1};
|
||||
|
||||
if(f.tile.texture == NULL)
|
||||
if(f.tile.texture.atlas == NULL)
|
||||
continue;
|
||||
|
||||
const u16 *indices_p = indices;
|
||||
|
@ -1069,20 +1091,15 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data):
|
|||
|
||||
/*
|
||||
Convert MeshCollector to SMesh
|
||||
Also store animation info
|
||||
*/
|
||||
bool enable_bumpmapping = g_settings->getBool("enable_bumpmapping");
|
||||
bool enable_shaders = g_settings->getBool("enable_shaders");
|
||||
bool enable_shaders = (g_settings->getS32("enable_shaders") > 0);
|
||||
video::E_MATERIAL_TYPE shadermat1 = m_gamedef->getShaderSource()->
|
||||
getShader("test_shader_1").material;
|
||||
video::E_MATERIAL_TYPE shadermat2 = m_gamedef->getShaderSource()->
|
||||
getShader("test_shader_2").material;
|
||||
video::E_MATERIAL_TYPE shadermat3 = m_gamedef->getShaderSource()->
|
||||
getShader("test_shader_3").material;
|
||||
video::E_MATERIAL_TYPE bumpmaps1 = m_gamedef->getShaderSource()->
|
||||
getShader("bumpmaps_solids").material;
|
||||
video::E_MATERIAL_TYPE bumpmaps2 = m_gamedef->getShaderSource()->
|
||||
getShader("bumpmaps_liquids").material;
|
||||
|
||||
for(u32 i = 0; i < collector.prebuffers.size(); i++)
|
||||
{
|
||||
PreMeshBuffer &p = collector.prebuffers[i];
|
||||
|
@ -1095,7 +1112,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data):
|
|||
if(p.tile.material_flags & MATERIAL_FLAG_CRACK)
|
||||
{
|
||||
ITextureSource *tsrc = data->m_gamedef->tsrc();
|
||||
std::string crack_basename = tsrc->getTextureName(p.tile.texture_id);
|
||||
std::string crack_basename = tsrc->getTextureName(p.tile.texture.id);
|
||||
if(p.tile.material_flags & MATERIAL_FLAG_CRACK_OVERLAY)
|
||||
crack_basename += "^[cracko";
|
||||
else
|
||||
|
@ -1120,11 +1137,9 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data):
|
|||
}
|
||||
// Replace tile texture with the first animation frame
|
||||
std::ostringstream os(std::ios::binary);
|
||||
os<<tsrc->getTextureName(p.tile.texture_id);
|
||||
os<<tsrc->getTextureName(p.tile.texture.id);
|
||||
os<<"^[verticalframe:"<<(int)p.tile.animation_frame_count<<":0";
|
||||
p.tile.texture = tsrc->getTexture(
|
||||
os.str(),
|
||||
&p.tile.texture_id);
|
||||
p.tile.texture = tsrc->getTexture(os.str());
|
||||
}
|
||||
// - Classic lighting (shaders handle this by themselves)
|
||||
if(!enable_shaders)
|
||||
|
@ -1156,41 +1171,13 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data):
|
|||
material.setFlag(video::EMF_FOG_ENABLE, true);
|
||||
//material.setFlag(video::EMF_ANTI_ALIASING, video::EAAM_OFF);
|
||||
//material.setFlag(video::EMF_ANTI_ALIASING, video::EAAM_SIMPLE);
|
||||
material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
|
||||
material.setTexture(0, p.tile.texture);
|
||||
|
||||
if (enable_shaders) {
|
||||
video::E_MATERIAL_TYPE smat1 = shadermat1;
|
||||
video::E_MATERIAL_TYPE smat2 = shadermat2;
|
||||
video::E_MATERIAL_TYPE smat3 = shadermat3;
|
||||
|
||||
if (enable_bumpmapping) {
|
||||
ITextureSource *tsrc = data->m_gamedef->tsrc();
|
||||
std::string fname_base = tsrc->getTextureName(p.tile.texture_id);
|
||||
|
||||
std::string normal_ext = "_normal.png";
|
||||
size_t pos = fname_base.find(".");
|
||||
std::string fname_normal = fname_base.substr(0, pos) + normal_ext;
|
||||
|
||||
if (tsrc->isKnownSourceImage(fname_normal)) {
|
||||
// look for image extension and replace it
|
||||
size_t i = 0;
|
||||
while ((i = fname_base.find(".", i)) != std::string::npos) {
|
||||
fname_base.replace(i, 4, normal_ext);
|
||||
i += normal_ext.length();
|
||||
}
|
||||
|
||||
material.setTexture(1, tsrc->getTexture(fname_base));
|
||||
|
||||
smat1 = bumpmaps1;
|
||||
smat2 = bumpmaps2;
|
||||
}
|
||||
}
|
||||
|
||||
p.tile.applyMaterialOptionsWithShaders(material, smat1, smat2, smat3);
|
||||
} else {
|
||||
material.MaterialType
|
||||
= video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
|
||||
material.setTexture(0, p.tile.texture.atlas);
|
||||
if(enable_shaders)
|
||||
p.tile.applyMaterialOptionsWithShaders(material, shadermat1, shadermat2, shadermat3);
|
||||
else
|
||||
p.tile.applyMaterialOptions(material);
|
||||
}
|
||||
|
||||
// Create meshbuffer
|
||||
|
||||
|
@ -1250,9 +1237,6 @@ MapBlockMesh::~MapBlockMesh()
|
|||
|
||||
bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_ratio)
|
||||
{
|
||||
bool enable_shaders = (g_settings->getS32("enable_shaders") > 0);
|
||||
bool enable_bumpmapping = g_settings->getBool("enable_bumpmapping");
|
||||
|
||||
if(!m_has_animation)
|
||||
{
|
||||
m_animation_force_timer = 100000;
|
||||
|
@ -1275,8 +1259,8 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat
|
|||
ITextureSource *tsrc = m_gamedef->getTextureSource();
|
||||
std::ostringstream os;
|
||||
os<<basename<<crack;
|
||||
buf->getMaterial().setTexture(0,
|
||||
tsrc->getTexture(os.str()));
|
||||
AtlasPointer ap = tsrc->getTexture(os.str());
|
||||
buf->getMaterial().setTexture(0, ap.atlas);
|
||||
}
|
||||
|
||||
m_last_crack = crack;
|
||||
|
@ -1303,23 +1287,11 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat
|
|||
|
||||
// Create new texture name from original
|
||||
std::ostringstream os(std::ios::binary);
|
||||
os<<tsrc->getTextureName(tile.texture_id);
|
||||
os<<tsrc->getTextureName(tile.texture.id);
|
||||
os<<"^[verticalframe:"<<(int)tile.animation_frame_count<<":"<<frame;
|
||||
// Set the texture
|
||||
buf->getMaterial().setTexture(0, tsrc->getTexture(os.str()));
|
||||
if (enable_shaders && enable_bumpmapping)
|
||||
{
|
||||
std::string basename,normal;
|
||||
basename = tsrc->getTextureName(tile.texture_id);
|
||||
unsigned pos;
|
||||
pos = basename.find(".");
|
||||
normal = basename.substr (0, pos);
|
||||
normal += "_normal.png";
|
||||
os.str("");
|
||||
os<<normal<<"^[verticalframe:"<<(int)tile.animation_frame_count<<":"<<frame;
|
||||
if (tsrc->isKnownSourceImage(normal))
|
||||
buf->getMaterial().setTexture(1, tsrc->getTexture(os.str()));
|
||||
}
|
||||
AtlasPointer ap = tsrc->getTexture(os.str());
|
||||
buf->getMaterial().setTexture(0, ap.atlas);
|
||||
}
|
||||
|
||||
// Day-night transition
|
||||
|
|
157
src/mapgen.cpp
157
src/mapgen.cpp
|
@ -237,8 +237,6 @@ Decoration::~Decoration() {
|
|||
|
||||
|
||||
void Decoration::resolveNodeNames(INodeDefManager *ndef) {
|
||||
this->ndef = ndef;
|
||||
|
||||
if (c_place_on == CONTENT_IGNORE)
|
||||
c_place_on = ndef->getId(place_on_name);
|
||||
}
|
||||
|
@ -293,7 +291,7 @@ void Decoration::placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) {
|
|||
continue;
|
||||
|
||||
int height = getHeight();
|
||||
int max_y = nmax.Y;// + MAP_BLOCKSIZE - 1;
|
||||
int max_y = nmax.Y + MAP_BLOCKSIZE;
|
||||
if (y + 1 + height > max_y) {
|
||||
continue;
|
||||
#if 0
|
||||
|
@ -537,10 +535,28 @@ void DecoSchematic::generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p) {
|
|||
c_place_on != CONTENT_IGNORE)
|
||||
return;
|
||||
|
||||
Rotation rot = (rotation == ROTATE_RAND) ?
|
||||
(Rotation)pr->range(ROTATE_0, ROTATE_270) : rotation;
|
||||
|
||||
blitToVManip(p, vm, rot, false);
|
||||
u32 i = 0;
|
||||
for (s16 z = 0; z != size.Z; z++)
|
||||
for (s16 y = 0; y != size.Y; y++) {
|
||||
vi = vm->m_area.index(p.X, p.Y + y, p.Z + z);
|
||||
for (s16 x = 0; x != size.X; x++, i++, vi++) {
|
||||
if (!vm->m_area.contains(vi))
|
||||
continue;
|
||||
|
||||
if (schematic[i].getContent() == CONTENT_IGNORE)
|
||||
continue;
|
||||
|
||||
content_t c = vm->m_data[vi].getContent();
|
||||
if (c != CONTENT_AIR && c != CONTENT_IGNORE)
|
||||
continue;
|
||||
|
||||
if (schematic[i].param1 && myrand_range(1, 256) > schematic[i].param1)
|
||||
continue;
|
||||
|
||||
vm->m_data[vi] = schematic[i];
|
||||
vm->m_data[vi].param1 = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -554,93 +570,39 @@ std::string DecoSchematic::getName() {
|
|||
}
|
||||
|
||||
|
||||
void DecoSchematic::blitToVManip(v3s16 p, ManualMapVoxelManipulator *vm,
|
||||
Rotation rot, bool force_placement) {
|
||||
int xstride = 1;
|
||||
int ystride = size.X;
|
||||
int zstride = size.X * size.Y;
|
||||
void DecoSchematic::placeStructure(Map *map, v3s16 p) {
|
||||
assert(schematic != NULL);
|
||||
ManualMapVoxelManipulator *vm = new ManualMapVoxelManipulator(map);
|
||||
|
||||
s16 sx = size.X;
|
||||
s16 sy = size.Y;
|
||||
s16 sz = size.Z;
|
||||
if (flags & DECO_PLACE_CENTER_X)
|
||||
p.X -= (size.X + 1) / 2;
|
||||
if (flags & DECO_PLACE_CENTER_Y)
|
||||
p.Y -= (size.Y + 1) / 2;
|
||||
if (flags & DECO_PLACE_CENTER_Z)
|
||||
p.Z -= (size.Z + 1) / 2;
|
||||
|
||||
v3s16 bp1 = getNodeBlockPos(p);
|
||||
v3s16 bp2 = getNodeBlockPos(p + size - v3s16(1,1,1));
|
||||
vm->initialEmerge(bp1, bp2);
|
||||
|
||||
int i_start, i_step_x, i_step_z;
|
||||
switch (rot) {
|
||||
case ROTATE_90:
|
||||
i_start = sx - 1;
|
||||
i_step_x = zstride;
|
||||
i_step_z = -xstride;
|
||||
SWAP(s16, sx, sz);
|
||||
break;
|
||||
case ROTATE_180:
|
||||
i_start = zstride * (sz - 1) + sx - 1;
|
||||
i_step_x = -xstride;
|
||||
i_step_z = -zstride;
|
||||
break;
|
||||
case ROTATE_270:
|
||||
i_start = zstride * (sz - 1);
|
||||
i_step_x = -zstride;
|
||||
i_step_z = xstride;
|
||||
SWAP(s16, sx, sz);
|
||||
break;
|
||||
default:
|
||||
i_start = 0;
|
||||
i_step_x = xstride;
|
||||
i_step_z = zstride;
|
||||
}
|
||||
|
||||
for (s16 z = 0; z != sz; z++)
|
||||
for (s16 y = 0; y != sy; y++) {
|
||||
u32 i = z * i_step_z + y * ystride + i_start;
|
||||
for (s16 x = 0; x != sx; x++, i += i_step_x) {
|
||||
u32 vi = vm->m_area.index(p.X + x, p.Y + y, p.Z + z);
|
||||
u32 i = 0;
|
||||
for (s16 z = 0; z != size.Z; z++)
|
||||
for (s16 y = 0; y != size.Y; y++) {
|
||||
u32 vi = vm->m_area.index(p.X, p.Y + y, p.Z + z);
|
||||
for (s16 x = 0; x != size.X; x++, i++, vi++) {
|
||||
if (!vm->m_area.contains(vi))
|
||||
continue;
|
||||
|
||||
|
||||
if (schematic[i].getContent() == CONTENT_IGNORE)
|
||||
continue;
|
||||
|
||||
if (!force_placement) {
|
||||
content_t c = vm->m_data[vi].getContent();
|
||||
if (c != CONTENT_AIR && c != CONTENT_IGNORE)
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (schematic[i].param1 && myrand_range(1, 256) > schematic[i].param1)
|
||||
continue;
|
||||
|
||||
vm->m_data[vi] = schematic[i];
|
||||
vm->m_data[vi].param1 = 0;
|
||||
|
||||
if (rot)
|
||||
vm->m_data[vi].rotateAlongYAxis(ndef, rot);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void DecoSchematic::placeStructure(Map *map, v3s16 p) {
|
||||
assert(schematic != NULL);
|
||||
ManualMapVoxelManipulator *vm = new ManualMapVoxelManipulator(map);
|
||||
|
||||
Rotation rot = (rotation == ROTATE_RAND) ?
|
||||
(Rotation)myrand_range(ROTATE_0, ROTATE_270) : rotation;
|
||||
|
||||
v3s16 s = (rot == ROTATE_90 || rot == ROTATE_270) ?
|
||||
v3s16(size.Z, size.Y, size.X) : size;
|
||||
|
||||
if (flags & DECO_PLACE_CENTER_X)
|
||||
p.X -= (s.X + 1) / 2;
|
||||
if (flags & DECO_PLACE_CENTER_Y)
|
||||
p.Y -= (s.Y + 1) / 2;
|
||||
if (flags & DECO_PLACE_CENTER_Z)
|
||||
p.Z -= (s.Z + 1) / 2;
|
||||
|
||||
v3s16 bp1 = getNodeBlockPos(p);
|
||||
v3s16 bp2 = getNodeBlockPos(p + s - v3s16(1,1,1));
|
||||
vm->initialEmerge(bp1, bp2);
|
||||
|
||||
blitToVManip(p, vm, rot, true);
|
||||
|
||||
std::map<v3s16, MapBlock *> lighting_modified_blocks;
|
||||
std::map<v3s16, MapBlock *> modified_blocks;
|
||||
|
@ -665,7 +627,7 @@ bool DecoSchematic::loadSchematicFile() {
|
|||
std::ifstream is(filename.c_str(), std::ios_base::binary);
|
||||
|
||||
u32 signature = readU32(is);
|
||||
if (signature != MTSCHEM_FILE_SIGNATURE) {
|
||||
if (signature != 'MTSM') {
|
||||
errorstream << "loadSchematicFile: invalid schematic "
|
||||
"file" << std::endl;
|
||||
return false;
|
||||
|
@ -724,7 +686,7 @@ bool DecoSchematic::loadSchematicFile() {
|
|||
void DecoSchematic::saveSchematicFile(INodeDefManager *ndef) {
|
||||
std::ofstream os(filename.c_str(), std::ios_base::binary);
|
||||
|
||||
writeU32(os, MTSCHEM_FILE_SIGNATURE); // signature
|
||||
writeU32(os, 'MTSM'); // signature
|
||||
writeU16(os, 1); // version
|
||||
writeV3S16(os, size); // schematic size
|
||||
|
||||
|
@ -864,16 +826,9 @@ void Mapgen::updateHeightmap(v3s16 nmin, v3s16 nmax) {
|
|||
//TimeTaker t("Mapgen::updateHeightmap", NULL, PRECISION_MICRO);
|
||||
int index = 0;
|
||||
for (s16 z = nmin.Z; z <= nmax.Z; z++) {
|
||||
for (s16 x = nmin.X; x <= nmax.X; x++, index++) {
|
||||
for (s16 x = nmin.X; x <= nmax.X; x++) {
|
||||
s16 y = findGroundLevel(v2s16(x, z), nmin.Y, nmax.Y);
|
||||
|
||||
// if the values found are out of range, trust the old heightmap
|
||||
if (y == nmax.Y && heightmap[index] > nmax.Y)
|
||||
continue;
|
||||
if (y == nmin.Y - 1 && heightmap[index] < nmin.Y)
|
||||
continue;
|
||||
|
||||
heightmap[index] = y;
|
||||
heightmap[index++] = y;
|
||||
}
|
||||
}
|
||||
//printf("updateHeightmap: %dus\n", t.stop());
|
||||
|
@ -881,10 +836,8 @@ void Mapgen::updateHeightmap(v3s16 nmin, v3s16 nmax) {
|
|||
|
||||
|
||||
void Mapgen::updateLiquid(UniqueQueue<v3s16> *trans_liquid, v3s16 nmin, v3s16 nmax) {
|
||||
bool isliquid, wasliquid, rare;
|
||||
bool isliquid, wasliquid;
|
||||
v3s16 em = vm->m_area.getExtent();
|
||||
rare = g_settings->getBool("liquid_finite");
|
||||
int rarecnt = 0;
|
||||
|
||||
for (s16 z = nmin.Z; z <= nmax.Z; z++) {
|
||||
for (s16 x = nmin.X; x <= nmax.X; x++) {
|
||||
|
@ -894,8 +847,8 @@ void Mapgen::updateLiquid(UniqueQueue<v3s16> *trans_liquid, v3s16 nmin, v3s16 nm
|
|||
for (s16 y = nmax.Y; y >= nmin.Y; y--) {
|
||||
isliquid = ndef->get(vm->m_data[i]).isLiquid();
|
||||
|
||||
// there was a change between liquid and nonliquid, add to queue. no need to add every with liquid_finite
|
||||
if (isliquid != wasliquid && (!rare || !(rarecnt++ % 36)))
|
||||
// there was a change between liquid and nonliquid, add to queue
|
||||
if (isliquid != wasliquid)
|
||||
trans_liquid->push_back(v3s16(x, y, z));
|
||||
|
||||
wasliquid = isliquid;
|
||||
|
@ -1072,12 +1025,9 @@ bool MapgenV7Params::readParams(Settings *settings) {
|
|||
bool success =
|
||||
settings->getNoiseParams("mgv7_np_terrain_base", np_terrain_base) &&
|
||||
settings->getNoiseParams("mgv7_np_terrain_alt", np_terrain_alt) &&
|
||||
settings->getNoiseParams("mgv7_np_terrain_mod", np_terrain_mod) &&
|
||||
settings->getNoiseParams("mgv7_np_terrain_persist", np_terrain_persist) &&
|
||||
settings->getNoiseParams("mgv7_np_height_select", np_height_select) &&
|
||||
settings->getNoiseParams("mgv7_np_filler_depth", np_filler_depth) &&
|
||||
settings->getNoiseParams("mgv7_np_mount_height", np_mount_height) &&
|
||||
settings->getNoiseParams("mgv7_np_ridge_uwater", np_ridge_uwater) &&
|
||||
settings->getNoiseParams("mgv7_np_mountain", np_mountain) &&
|
||||
settings->getNoiseParams("mgv7_np_ridge", np_ridge);
|
||||
return success;
|
||||
}
|
||||
|
@ -1086,12 +1036,9 @@ bool MapgenV7Params::readParams(Settings *settings) {
|
|||
void MapgenV7Params::writeParams(Settings *settings) {
|
||||
settings->setNoiseParams("mgv7_np_terrain_base", np_terrain_base);
|
||||
settings->setNoiseParams("mgv7_np_terrain_alt", np_terrain_alt);
|
||||
settings->setNoiseParams("mgv7_np_terrain_mod", np_terrain_mod);
|
||||
settings->setNoiseParams("mgv7_np_terrain_persist", np_terrain_persist);
|
||||
settings->setNoiseParams("mgv7_np_height_select", np_height_select);
|
||||
settings->setNoiseParams("mgv7_np_filler_depth", np_filler_depth);
|
||||
settings->setNoiseParams("mgv7_np_mount_height", np_mount_height);
|
||||
settings->setNoiseParams("mgv7_np_ridge_uwater", np_ridge_uwater);
|
||||
settings->setNoiseParams("mgv7_np_mountain", np_mountain);
|
||||
settings->setNoiseParams("mgv7_np_ridge", np_ridge);
|
||||
}
|
||||
|
||||
|
|
12
src/mapgen.h
12
src/mapgen.h
|
@ -23,7 +23,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#include "irrlichttypes_extrabloated.h"
|
||||
#include "util/container.h" // UniqueQueue
|
||||
#include "gamedef.h"
|
||||
#include "nodedef.h"
|
||||
#include "mapnode.h"
|
||||
#include "noise.h"
|
||||
#include "settings.h"
|
||||
|
@ -37,8 +36,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#define MGV6_BIOME_BLEND 0x10
|
||||
#define MG_FLAT 0x20
|
||||
#define MG_NOLIGHT 0x40
|
||||
#define MGV7_MOUNTAINS 0x80
|
||||
#define MGV7_RIDGES 0x100
|
||||
|
||||
/////////////////// Ore generation flags
|
||||
// Use absolute value of height to determine ore placement
|
||||
|
@ -64,6 +61,7 @@ class EmergeManager;
|
|||
class MapBlock;
|
||||
class ManualMapVoxelManipulator;
|
||||
class VoxelManipulator;
|
||||
class INodeDefManager;
|
||||
struct BlockMakeData;
|
||||
class VoxelArea;
|
||||
class Map;
|
||||
|
@ -216,8 +214,6 @@ struct CutoffData {
|
|||
|
||||
class Decoration {
|
||||
public:
|
||||
INodeDefManager *ndef;
|
||||
|
||||
int mapseed;
|
||||
std::string place_on_name;
|
||||
content_t c_place_on;
|
||||
|
@ -262,8 +258,6 @@ public:
|
|||
virtual std::string getName();
|
||||
};
|
||||
|
||||
#define MTSCHEM_FILE_SIGNATURE 0x4d54534d // 'MTSM'
|
||||
|
||||
class DecoSchematic : public Decoration {
|
||||
public:
|
||||
std::string filename;
|
||||
|
@ -272,7 +266,6 @@ public:
|
|||
std::vector<content_t> c_nodes;
|
||||
|
||||
u32 flags;
|
||||
Rotation rotation;
|
||||
v3s16 size;
|
||||
MapNode *schematic;
|
||||
|
||||
|
@ -284,9 +277,6 @@ public:
|
|||
virtual int getHeight();
|
||||
virtual std::string getName();
|
||||
|
||||
void blitToVManip(v3s16 p, ManualMapVoxelManipulator *vm,
|
||||
Rotation rot, bool force_placement);
|
||||
|
||||
bool loadSchematicFile();
|
||||
void saveSchematicFile(INodeDefManager *ndef);
|
||||
|
||||
|
|
|
@ -172,6 +172,7 @@ void MapgenMathParams::writeParams(Settings *settings) {
|
|||
MapgenMath::MapgenMath(int mapgenid, MapgenMathParams *params_, EmergeManager *emerge) : MapgenV7(mapgenid, params_, emerge) {
|
||||
mg_params = params_;
|
||||
this->flags |= MG_NOLIGHT;
|
||||
this->ridges = 0;
|
||||
|
||||
Json::Value & params = mg_params->params;
|
||||
invert = params["invert"].empty() ? 1 : params["invert"].asBool(); //params["invert"].empty()?1:params["invert"].asBool();
|
||||
|
@ -237,7 +238,7 @@ MapgenMath::~MapgenMath() {
|
|||
|
||||
//////////////////////// Map generator
|
||||
|
||||
int MapgenMath::generateTerrain() {
|
||||
void MapgenMath::generateTerrain() {
|
||||
|
||||
MapNode n_air(CONTENT_AIR, LIGHT_SUN), n_water_source(c_water_source, LIGHT_SUN);
|
||||
MapNode n_stone(c_stone, LIGHT_SUN);
|
||||
|
@ -262,9 +263,9 @@ int MapgenMath::generateTerrain() {
|
|||
double d = (*func)(vec.X, vec.Y, vec.Z, distance, iterations);
|
||||
if ((!invert && d > 0) || (invert && d == 0) ) {
|
||||
if (vm->m_data[i].getContent() == CONTENT_IGNORE)
|
||||
// vm->m_data[i] = (y > water_level + biome->filler) ?
|
||||
// MapNode(biome->c_filler) : n_stone;
|
||||
vm->m_data[i] = n_stone;
|
||||
vm->m_data[i] = (y > water_level + biome->filler_height) ?
|
||||
MapNode(biome->c_filler) : n_stone;
|
||||
// vm->m_data[i] = n_stone;
|
||||
} else if (y <= water_level) {
|
||||
vm->m_data[i] = n_water_source;
|
||||
} else {
|
||||
|
@ -360,7 +361,7 @@ int MapgenMath::generateTerrain() {
|
|||
|
||||
|
||||
#endif
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
int MapgenMath::getGroundLevelAtPoint(v2s16 p) {
|
||||
|
|
|
@ -42,7 +42,7 @@ class MapgenMath : public MapgenV7 {
|
|||
MapgenMath(int mapgenid, MapgenMathParams *mg_params, EmergeManager *emerge);
|
||||
~MapgenMath();
|
||||
|
||||
int generateTerrain();
|
||||
void generateTerrain();
|
||||
int getGroundLevelAtPoint(v2s16 p);
|
||||
|
||||
bool invert;
|
||||
|
|
|
@ -24,8 +24,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#include "mapblock.h"
|
||||
#include "mapnode.h"
|
||||
#include "map.h"
|
||||
//#include "serverobject.h"
|
||||
#include "content_sao.h"
|
||||
#include "nodedef.h"
|
||||
#include "content_mapnode.h" // For content_mapnode_get_new_name
|
||||
#include "voxelalgorithms.h"
|
||||
#include "profiler.h"
|
||||
#include "settings.h" // For g_settings
|
||||
|
@ -40,27 +42,29 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
|
||||
/////////////////// Mapgen V7 perlin noise default values
|
||||
NoiseParams nparams_v7_def_terrain_base =
|
||||
{4, 70, v3f(300, 300, 300), 82341, 6, 0.7};
|
||||
{0, 80.0, v3f(250.0, 250.0, 250.0), 82341, 5, 0.6};
|
||||
NoiseParams nparams_v7_def_terrain_alt =
|
||||
{4, 25, v3f(600, 600, 600), 5934, 5, 0.6};
|
||||
{0, 20.0, v3f(250.0, 250.0, 250.0), 5934, 5, 0.6};
|
||||
NoiseParams nparams_v7_def_terrain_mod =
|
||||
{0, 1.0, v3f(350.0, 350.0, 350.0), 85039, 5, 0.6};
|
||||
NoiseParams nparams_v7_def_terrain_persist =
|
||||
{0.6, 0.1, v3f(500, 500, 500), 539, 3, 0.6};
|
||||
{0, 1.0, v3f(500.0, 500.0, 500.0), 539, 3, 0.6};
|
||||
NoiseParams nparams_v7_def_height_select =
|
||||
{-0.5, 1, v3f(250, 250, 250), 4213, 5, 0.69};
|
||||
|
||||
NoiseParams nparams_v7_def_filler_depth =
|
||||
{0, 1.2, v3f(150, 150, 150), 261, 4, 0.7};
|
||||
|
||||
NoiseParams nparams_v7_def_mount_height =
|
||||
{100, 30, v3f(500, 500, 500), 72449, 4, 0.6};
|
||||
NoiseParams nparams_v7_def_ridge_uwater =
|
||||
{0, 1, v3f(500, 500, 500), 85039, 4, 0.6};
|
||||
NoiseParams nparams_v7_def_mountain =
|
||||
{0, 1, v3f(250, 350, 250), 5333, 5, 0.68};
|
||||
{0.5, 0.5, v3f(250.0, 250.0, 250.0), 4213, 5, 0.69};
|
||||
NoiseParams nparams_v7_def_ridge =
|
||||
{0, 1, v3f(100, 100, 100), 6467, 4, 0.75};
|
||||
|
||||
|
||||
{0, 1.0, v3f(100.0, 100.0, 100.0), 6467, 4, 0.75};
|
||||
/*
|
||||
NoiseParams nparams_v6_def_beach =
|
||||
{0.0, 1.0, v3f(250.0, 250.0, 250.0), 59420, 3, 0.50};
|
||||
NoiseParams nparams_v6_def_cave =
|
||||
{6.0, 6.0, v3f(250.0, 250.0, 250.0), 34329, 3, 0.50};
|
||||
NoiseParams nparams_v6_def_humidity =
|
||||
{0.5, 0.5, v3f(500.0, 500.0, 500.0), 72384, 4, 0.66};
|
||||
NoiseParams nparams_v6_def_trees =
|
||||
{0.0, 1.0, v3f(125.0, 125.0, 125.0), 2, 4, 0.66};
|
||||
NoiseParams nparams_v6_def_apple_trees =
|
||||
{0.0, 1.0, v3f(100.0, 100.0, 100.0), 342902, 3, 0.45};
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
@ -72,14 +76,11 @@ MapgenV7::MapgenV7(int mapgenid, MapgenV7Params *params, EmergeManager *emerge)
|
|||
|
||||
this->seed = (int)params->seed;
|
||||
this->water_level = params->water_level;
|
||||
this->flags = params->flags | MGV7_MOUNTAINS | MGV7_RIDGES;
|
||||
this->flags = params->flags;
|
||||
this->ridges = 1;
|
||||
|
||||
this->csize = v3s16(1, 1, 1) * params->chunksize * MAP_BLOCKSIZE;
|
||||
|
||||
// amount of elements to skip for the next index
|
||||
// for noise/height/biome maps (not vmanip)
|
||||
this->ystride = csize.X;
|
||||
this->zstride = csize.X * csize.Y;
|
||||
this->ystride = csize.X; //////fix this
|
||||
|
||||
this->biomemap = new u8[csize.X * csize.Z];
|
||||
this->heightmap = new s16[csize.X * csize.Z];
|
||||
|
@ -88,15 +89,10 @@ MapgenV7::MapgenV7(int mapgenid, MapgenV7Params *params, EmergeManager *emerge)
|
|||
// Terrain noise
|
||||
noise_terrain_base = new Noise(¶ms->np_terrain_base, seed, csize.X, csize.Z);
|
||||
noise_terrain_alt = new Noise(¶ms->np_terrain_alt, seed, csize.X, csize.Z);
|
||||
noise_terrain_mod = new Noise(¶ms->np_terrain_mod, seed, csize.X, csize.Z);
|
||||
noise_terrain_persist = new Noise(¶ms->np_terrain_persist, seed, csize.X, csize.Z);
|
||||
noise_height_select = new Noise(¶ms->np_height_select, seed, csize.X, csize.Z);
|
||||
noise_filler_depth = new Noise(¶ms->np_filler_depth, seed, csize.X, csize.Z);
|
||||
noise_mount_height = new Noise(¶ms->np_mount_height, seed, csize.X, csize.Z);
|
||||
noise_ridge_uwater = new Noise(¶ms->np_ridge_uwater, seed, csize.X, csize.Z);
|
||||
|
||||
// 3d terrain noise
|
||||
noise_mountain = new Noise(¶ms->np_mountain, seed, csize.X, csize.Y, csize.Z);
|
||||
noise_ridge = new Noise(¶ms->np_ridge, seed, csize.X, csize.Y, csize.Z);
|
||||
noise_ridge = new Noise(¶ms->np_ridge, seed, csize.X, csize.Y, csize.Z);
|
||||
|
||||
// Biome noise
|
||||
noise_heat = new Noise(bmgr->np_heat, seed, csize.X, csize.Z);
|
||||
|
@ -106,15 +102,11 @@ MapgenV7::MapgenV7(int mapgenid, MapgenV7Params *params, EmergeManager *emerge)
|
|||
|
||||
MapgenV7::~MapgenV7() {
|
||||
delete noise_terrain_base;
|
||||
delete noise_terrain_mod;
|
||||
delete noise_terrain_persist;
|
||||
delete noise_height_select;
|
||||
delete noise_terrain_alt;
|
||||
delete noise_filler_depth;
|
||||
delete noise_mount_height;
|
||||
delete noise_ridge_uwater;
|
||||
delete noise_mountain;
|
||||
delete noise_ridge;
|
||||
|
||||
delete noise_heat;
|
||||
delete noise_humidity;
|
||||
|
||||
|
@ -125,28 +117,25 @@ MapgenV7::~MapgenV7() {
|
|||
|
||||
|
||||
int MapgenV7::getGroundLevelAtPoint(v2s16 p) {
|
||||
// Base terrain calculation
|
||||
s16 y = baseTerrainLevelAtPoint(p.X, p.Y);
|
||||
s16 groundlevel = baseTerrainLevelAtPoint(p.X, p.Y);
|
||||
float heat = NoisePerlin2D(bmgr->np_heat, p.X, p.Y, seed);
|
||||
float humidity = NoisePerlin2D(bmgr->np_humidity, p.X, p.Y, seed);
|
||||
Biome *b = bmgr->getBiome(heat, humidity, groundlevel);
|
||||
|
||||
// Ridge/river terrain calculation
|
||||
float width = 0.3;
|
||||
float uwatern = NoisePerlin2DNoTxfm(noise_ridge_uwater->np, p.X, p.Y, seed) * 2;
|
||||
// actually computing the depth of the ridge is much more expensive;
|
||||
// if inside a river, simply guess
|
||||
if (uwatern >= -width && uwatern <= width)
|
||||
return water_level - 10;
|
||||
|
||||
// Mountain terrain calculation
|
||||
int iters = 128; // don't even bother iterating more than 128 times..
|
||||
s16 y = groundlevel;
|
||||
int iters = 1024; // don't even bother iterating more than 64 times..
|
||||
while (iters--) {
|
||||
//current point would have been air
|
||||
if (!getMountainTerrainAtPoint(p.X, y, p.Y))
|
||||
return y;
|
||||
if (y <= water_level)
|
||||
break;
|
||||
|
||||
float ridgenoise = NoisePerlin3D(noise_ridge->np, p.X, y, p.Y, seed);
|
||||
if (ridgenoise * (float)(y * y) < 15.0)
|
||||
break;
|
||||
|
||||
y++;
|
||||
y--;
|
||||
}
|
||||
|
||||
return y;
|
||||
return y + b->top_depth;
|
||||
}
|
||||
|
||||
|
||||
|
@ -173,6 +162,20 @@ void MapgenV7::makeChunk(BlockMakeData *data) {
|
|||
full_node_max = (blockpos_max + 2) * MAP_BLOCKSIZE - v3s16(1, 1, 1);
|
||||
|
||||
blockseed = emerge->getBlockSeed(full_node_min); //////use getBlockSeed2()!
|
||||
|
||||
// Make some noise
|
||||
calculateNoise();
|
||||
|
||||
// Calculate height map
|
||||
s16 stone_surface_max_y = calcHeightMap();
|
||||
|
||||
// Calculate biomes
|
||||
BiomeNoiseInput binput;
|
||||
binput.mapsize = v2s16(csize.X, csize.Z);
|
||||
binput.heat_map = noise_heat->result;
|
||||
binput.humidity_map = noise_humidity->result;
|
||||
binput.height_map = heightmap;
|
||||
bmgr->calcBiomes(&binput, biomemap);
|
||||
|
||||
c_stone = ndef->getId("mapgen_stone");
|
||||
c_dirt = ndef->getId("mapgen_dirt");
|
||||
|
@ -180,31 +183,17 @@ void MapgenV7::makeChunk(BlockMakeData *data) {
|
|||
c_sand = ndef->getId("mapgen_sand");
|
||||
c_water_source = ndef->getId("mapgen_water_source");
|
||||
c_lava_source = ndef->getId("mapgen_lava_source");
|
||||
c_ice = ndef->getId("default:ice");
|
||||
if (c_ice == CONTENT_IGNORE)
|
||||
c_ice = CONTENT_AIR;
|
||||
|
||||
// Make some noise
|
||||
calculateNoise();
|
||||
|
||||
// Generate base terrain, mountains, and ridges with initial heightmaps
|
||||
s16 stone_surface_max_y = generateTerrain();
|
||||
|
||||
updateHeightmap(node_min, node_max);
|
||||
|
||||
// Calculate biomes
|
||||
BiomeNoiseInput binput;
|
||||
binput.mapsize = v2s16(csize.X, csize.Z);
|
||||
binput.heat_map = noise_heat->result;
|
||||
binput.humidity_map = noise_humidity->result;
|
||||
binput.height_map = heightmap;
|
||||
bmgr->calcBiomes(&binput, biomemap);
|
||||
|
||||
// Actually place the biome-specific nodes and what not
|
||||
generateBiomes();
|
||||
generateTerrain();
|
||||
if (this->ridges)
|
||||
carveRidges();
|
||||
|
||||
if (flags & MG_CAVES)
|
||||
generateCaves(stone_surface_max_y);
|
||||
|
||||
addTopNodes();
|
||||
|
||||
updateHeightmap(node_min, node_max);
|
||||
|
||||
if (flags & MG_DUNGEONS) {
|
||||
DungeonGen dgen(ndef, data->seed, water_level);
|
||||
|
@ -221,9 +210,6 @@ void MapgenV7::makeChunk(BlockMakeData *data) {
|
|||
ore->placeOre(this, blockseed + i, node_min, node_max);
|
||||
}
|
||||
|
||||
// Sprinkle some dust on top after everything else was generated
|
||||
dustTopNodes();
|
||||
|
||||
//printf("makeChunk: %dms\n", t.stop());
|
||||
|
||||
updateLiquid(&data->transforming_liquid, full_node_min, full_node_max);
|
||||
|
@ -233,7 +219,7 @@ void MapgenV7::makeChunk(BlockMakeData *data) {
|
|||
node_max + v3s16(1, 0, 1) * MAP_BLOCKSIZE);
|
||||
//setLighting(node_min - v3s16(1, 0, 1) * MAP_BLOCKSIZE,
|
||||
// node_max + v3s16(1, 0, 1) * MAP_BLOCKSIZE, 0xFF);
|
||||
|
||||
|
||||
this->generating = false;
|
||||
}
|
||||
|
||||
|
@ -244,14 +230,15 @@ void MapgenV7::calculateNoise() {
|
|||
int y = node_min.Y;
|
||||
int z = node_min.Z;
|
||||
|
||||
noise_terrain_mod->perlinMap2D(x, z);
|
||||
|
||||
noise_height_select->perlinMap2D(x, z);
|
||||
noise_height_select->transformNoiseMap();
|
||||
|
||||
noise_terrain_persist->perlinMap2D(x, z);
|
||||
noise_terrain_persist->transformNoiseMap();
|
||||
float *persistmap = noise_terrain_persist->result;
|
||||
for (int i = 0; i != csize.X * csize.Z; i++)
|
||||
persistmap[i] = rangelim(persistmap[i], 0.4, 0.9);
|
||||
persistmap[i] = abs(persistmap[i]);
|
||||
|
||||
noise_terrain_base->perlinMap2DModulated(x, z, persistmap);
|
||||
noise_terrain_base->transformNoiseMap();
|
||||
|
@ -259,20 +246,10 @@ void MapgenV7::calculateNoise() {
|
|||
noise_terrain_alt->perlinMap2DModulated(x, z, persistmap);
|
||||
noise_terrain_alt->transformNoiseMap();
|
||||
|
||||
noise_filler_depth->perlinMap2D(x, z);
|
||||
|
||||
if (flags & MGV7_MOUNTAINS) {
|
||||
noise_mountain->perlinMap3D(x, y, z);
|
||||
noise_mount_height->perlinMap2D(x, z);
|
||||
noise_mount_height->transformNoiseMap();
|
||||
}
|
||||
|
||||
if (flags & MGV7_RIDGES) {
|
||||
noise_ridge->perlinMap3D(x, y, z);
|
||||
noise_ridge_uwater->perlinMap2D(x, z);
|
||||
}
|
||||
noise_ridge->perlinMap3D(x, y, z);
|
||||
|
||||
noise_heat->perlinMap2D(x, z);
|
||||
|
||||
noise_humidity->perlinMap2D(x, z);
|
||||
|
||||
//printf("calculateNoise: %dus\n", t.stop());
|
||||
|
@ -287,56 +264,36 @@ Biome *MapgenV7::getBiomeAtPoint(v3s16 p) {
|
|||
return bmgr->getBiome(heat, humidity, groundlevel);
|
||||
}
|
||||
|
||||
//needs to be updated
|
||||
|
||||
float MapgenV7::baseTerrainLevelAtPoint(int x, int z) {
|
||||
float hselect = NoisePerlin2D(noise_height_select->np, x, z, seed);
|
||||
hselect = rangelim(hselect, 0.0, 1.0);
|
||||
|
||||
float persist = NoisePerlin2D(noise_terrain_persist->np, x, z, seed);
|
||||
persist = rangelim(persist, 0.4, 0.9);
|
||||
float terrain_mod = NoisePerlin2DNoTxfm(noise_terrain_mod->np, x, z, seed);
|
||||
float hselect = NoisePerlin2D(noise_height_select->np, x, z, seed);
|
||||
float persist = abs(NoisePerlin2DNoTxfm(noise_terrain_persist->np, x, z, seed));
|
||||
|
||||
noise_terrain_base->np->persist = persist;
|
||||
float height_base = NoisePerlin2D(noise_terrain_base->np, x, z, seed);
|
||||
float terrain_base = NoisePerlin2D(noise_terrain_base->np, x, z, seed);
|
||||
float height_base = terrain_base * terrain_mod;
|
||||
|
||||
noise_terrain_alt->np->persist = persist;
|
||||
float height_alt = NoisePerlin2D(noise_terrain_alt->np, x, z, seed);
|
||||
|
||||
if (height_alt > height_base)
|
||||
return height_alt;
|
||||
|
||||
return (height_base * hselect) + (height_alt * (1.0 - hselect));
|
||||
}
|
||||
|
||||
|
||||
float MapgenV7::baseTerrainLevelFromMap(int index) {
|
||||
float hselect = rangelim(noise_height_select->result[index], 0.0, 1.0);
|
||||
float height_base = noise_terrain_base->result[index];
|
||||
float height_alt = noise_terrain_alt->result[index];
|
||||
|
||||
if (height_alt > height_base)
|
||||
return height_alt;
|
||||
float terrain_mod = noise_terrain_mod->result[index];
|
||||
float hselect = noise_height_select->result[index];
|
||||
float terrain_base = noise_terrain_base->result[index];
|
||||
float height_base = terrain_base * terrain_mod;
|
||||
float height_alt = noise_terrain_alt->result[index];
|
||||
|
||||
return (height_base * hselect) + (height_alt * (1.0 - hselect));
|
||||
}
|
||||
|
||||
|
||||
bool MapgenV7::getMountainTerrainAtPoint(int x, int y, int z) {
|
||||
float mnt_h_n = NoisePerlin2D(noise_mount_height->np, x, z, seed);
|
||||
float height_modifier = -((float)y / rangelim(mnt_h_n, 80.0, 150.0));
|
||||
float mnt_n = NoisePerlin3D(noise_mountain->np, x, y, z, seed);
|
||||
|
||||
return mnt_n + height_modifier >= 0.6;
|
||||
}
|
||||
|
||||
|
||||
bool MapgenV7::getMountainTerrainFromMap(int idx_xyz, int idx_xz, int y) {
|
||||
float mounthn = noise_mount_height->result[idx_xz];
|
||||
float height_modifier = -((float)y / rangelim(mounthn, 80.0, 150.0));
|
||||
return (noise_mountain->result[idx_xyz] + height_modifier >= 0.6);
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
// Crap code to test log rivers as a proof-of-concept. Didn't work out too well.
|
||||
void MapgenV7::carveRivers() {
|
||||
MapNode n_air(CONTENT_AIR), n_water_source(c_water_source);
|
||||
MapNode n_stone(c_stone);
|
||||
|
@ -371,26 +328,8 @@ void MapgenV7::carveRivers() {
|
|||
#endif
|
||||
|
||||
|
||||
int MapgenV7::generateTerrain() {
|
||||
int ymax = generateBaseTerrain();
|
||||
|
||||
if (flags & MGV7_MOUNTAINS)
|
||||
generateMountainTerrain();
|
||||
|
||||
if (flags & MGV7_RIDGES)
|
||||
generateRidgeTerrain();
|
||||
|
||||
return ymax;
|
||||
}
|
||||
|
||||
|
||||
int MapgenV7::generateBaseTerrain() {
|
||||
MapNode n_air(CONTENT_AIR);
|
||||
MapNode n_stone(c_stone);
|
||||
MapNode n_water(c_water_source);
|
||||
|
||||
int MapgenV7::calcHeightMap() {
|
||||
int stone_surface_max_y = -MAP_GENERATION_LIMIT;
|
||||
v3s16 em = vm->m_area.getExtent();
|
||||
u32 index = 0;
|
||||
|
||||
for (s16 z = node_min.Z; z <= node_max.Z; z++)
|
||||
|
@ -403,50 +342,46 @@ int MapgenV7::generateBaseTerrain() {
|
|||
|
||||
if (surface_y > stone_surface_max_y)
|
||||
stone_surface_max_y = surface_y;
|
||||
|
||||
u32 i = vm->m_area.index(x, node_min.Y, z);
|
||||
for (s16 y = node_min.Y; y <= node_max.Y; y++) {
|
||||
if (vm->m_data[i].getContent() == CONTENT_IGNORE) {
|
||||
if (y <= surface_y)
|
||||
vm->m_data[i] = n_stone;
|
||||
else if (y <= water_level)
|
||||
vm->m_data[i] = n_water;
|
||||
else
|
||||
vm->m_data[i] = n_air;
|
||||
}
|
||||
vm->m_area.add_y(em, i, 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return stone_surface_max_y;
|
||||
}
|
||||
|
||||
|
||||
void MapgenV7::generateMountainTerrain() {
|
||||
if (node_max.Y <= water_level)
|
||||
return;
|
||||
|
||||
void MapgenV7::generateTerrain() {
|
||||
MapNode n_air(CONTENT_AIR), n_water_source(c_water_source);
|
||||
MapNode n_stone(c_stone);
|
||||
u32 j = 0;
|
||||
|
||||
v3s16 em = vm->m_area.getExtent();
|
||||
u32 index = 0;
|
||||
|
||||
for (s16 z = node_min.Z; z <= node_max.Z; z++)
|
||||
for (s16 y = node_min.Y; y <= node_max.Y; y++) {
|
||||
u32 vi = vm->m_area.index(node_min.X, y, z);
|
||||
for (s16 x = node_min.X; x <= node_max.X; x++) {
|
||||
int index = (z - node_min.Z) * csize.X + (x - node_min.X);
|
||||
|
||||
if (getMountainTerrainFromMap(j, index, y))
|
||||
vm->m_data[vi] = n_stone;
|
||||
|
||||
vi++;
|
||||
j++;
|
||||
for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
|
||||
s16 surface_y = heightmap[index];
|
||||
Biome *biome = bmgr->biomes[biomemap[index]];
|
||||
|
||||
u32 i = vm->m_area.index(x, node_min.Y, z);
|
||||
for (s16 y = node_min.Y; y <= node_max.Y; y++) {
|
||||
if (vm->m_data[i].getContent() == CONTENT_IGNORE) {
|
||||
if (y <= surface_y) {
|
||||
vm->m_data[i] = (y > water_level + biome->filler_height) ?
|
||||
MapNode(biome->c_filler) : n_stone;
|
||||
} else if (y <= water_level) {
|
||||
vm->m_data[i] = n_water_source;
|
||||
} else {
|
||||
vm->m_data[i] = n_air;
|
||||
}
|
||||
}
|
||||
vm->m_area.add_y(em, i, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void MapgenV7::generateRidgeTerrain() {
|
||||
MapNode n_water(c_water_source);
|
||||
void MapgenV7::carveRidges() {
|
||||
if (node_max.Y <= water_level)
|
||||
return;
|
||||
|
||||
MapNode n_air(CONTENT_AIR);
|
||||
u32 index = 0;
|
||||
|
||||
|
@ -454,152 +389,37 @@ void MapgenV7::generateRidgeTerrain() {
|
|||
for (s16 y = node_min.Y; y <= node_max.Y; y++) {
|
||||
u32 vi = vm->m_area.index(node_min.X, y, z);
|
||||
for (s16 x = node_min.X; x <= node_max.X; x++, index++, vi++) {
|
||||
int j = (z - node_min.Z) * csize.X + (x - node_min.X);
|
||||
|
||||
if (heightmap[j] < water_level - 4)
|
||||
// Removing this check will create huge underwater caverns,
|
||||
// which are interesting but not desirable for gameplay
|
||||
if (y <= water_level)
|
||||
continue;
|
||||
|
||||
float widthn = (noise_terrain_persist->result[j] - 0.6) / 0.1;
|
||||
//widthn = rangelim(widthn, -0.05, 0.5);
|
||||
|
||||
float width = 0.3; // TODO: figure out acceptable perlin noise values
|
||||
float uwatern = noise_ridge_uwater->result[j] * 2;
|
||||
if (uwatern < -width || uwatern > width)
|
||||
|
||||
if (noise_ridge->result[index] * (float)(y * y) < 15.0)
|
||||
continue;
|
||||
|
||||
float height_mod = (float)(y + 17) / 2.5;
|
||||
float width_mod = (width - fabs(uwatern));
|
||||
float nridge = noise_ridge->result[index] * (float)y / 7.0;
|
||||
|
||||
if (y < water_level)
|
||||
nridge = -fabs(nridge) * 3.0 * widthn * 0.3;
|
||||
|
||||
if (nridge + width_mod * height_mod < 0.6)
|
||||
continue;
|
||||
|
||||
int j = (z - node_min.Z) * csize.Z + (x - node_min.X); //////obviously just temporary
|
||||
if (y < ridge_heightmap[j])
|
||||
ridge_heightmap[j] = y - 1;
|
||||
|
||||
vm->m_data[vi] = (y > water_level) ? n_air : n_water;
|
||||
vm->m_data[vi] = n_air;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void MapgenV7::generateBiomes() {
|
||||
if (node_max.Y < water_level)
|
||||
return;
|
||||
|
||||
MapNode n_air(CONTENT_AIR);
|
||||
MapNode n_stone(c_stone);
|
||||
MapNode n_water(c_water_source);
|
||||
|
||||
v3s16 em = vm->m_area.getExtent();
|
||||
/*
|
||||
void MapgenV7::testBiomes() {
|
||||
u32 index = 0;
|
||||
|
||||
for (s16 z = node_min.Z; z <= node_max.Z; z++)
|
||||
for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
|
||||
Biome *biome = bmgr->biomes[biomemap[index]];
|
||||
s16 dfiller = biome->depth_filler + noise_filler_depth->result[index];
|
||||
s16 y0_top = biome->depth_top;
|
||||
s16 y0_filler = biome->depth_filler + biome->depth_top + dfiller;
|
||||
|
||||
s16 nplaced = 0;
|
||||
u32 i = vm->m_area.index(x, node_max.Y, z);
|
||||
|
||||
content_t c_above = vm->m_data[i + em.X].getContent();
|
||||
bool have_air = c_above == CONTENT_AIR;
|
||||
|
||||
for (s16 y = node_max.Y; y >= node_min.Y; y--) {
|
||||
content_t c = vm->m_data[i].getContent();
|
||||
|
||||
// It could be the case that the elevation is equal to the chunk
|
||||
// boundary, but the chunk above has not been generated yet
|
||||
if (y == node_max.Y && c_above == CONTENT_IGNORE &&
|
||||
y == heightmap[index] && c == c_stone) {
|
||||
int j = (z - node_min.Z) * zstride +
|
||||
(y - node_min.Y) * ystride +
|
||||
(x - node_min.X);
|
||||
have_air = !getMountainTerrainFromMap(j, index, y);
|
||||
}
|
||||
|
||||
if (c == c_stone && have_air) {
|
||||
content_t c_below = vm->m_data[i - em.X].getContent();
|
||||
|
||||
if (c_below != CONTENT_AIR) {
|
||||
if (nplaced < y0_top) {
|
||||
// A hack to prevent dirt_with_grass from being
|
||||
// placed below water. TODO: fix later
|
||||
content_t c_place = ((y < water_level) &&
|
||||
(biome->c_top == c_dirt_with_grass)) ?
|
||||
c_dirt : biome->c_top;
|
||||
|
||||
vm->m_data[i] = MapNode(c_place);
|
||||
nplaced++;
|
||||
} else if (nplaced < y0_filler && nplaced >= y0_top) {
|
||||
vm->m_data[i] = MapNode(biome->c_filler);
|
||||
nplaced++;
|
||||
} else {
|
||||
have_air = false;
|
||||
nplaced = 0;
|
||||
}
|
||||
}
|
||||
} else if (c == c_water_source) {
|
||||
have_air = true;
|
||||
nplaced = 0;
|
||||
vm->m_data[i] = MapNode(biome->c_water);
|
||||
} else if (c == CONTENT_AIR) {
|
||||
have_air = true;
|
||||
nplaced = 0;
|
||||
}
|
||||
|
||||
vm->m_area.add_y(em, i, -1);
|
||||
}
|
||||
for (s16 z = node_min.Z; z <= node_min.Z; z++)
|
||||
for (s16 x = node_min.X; x <= node_min.X; x++) {;
|
||||
Biome *b = bmgr->getBiome(heat, humidity, 0);
|
||||
}
|
||||
}
|
||||
// make an 80x80 grid with axes heat/humidity as a voroni diagram for biomes
|
||||
// clear out y space for it first with air
|
||||
// use absolute positioning, each chunk will be a +1 height
|
||||
}*/
|
||||
|
||||
|
||||
void MapgenV7::dustTopNodes() {
|
||||
v3s16 em = vm->m_area.getExtent();
|
||||
u32 index = 0;
|
||||
|
||||
if (water_level > node_max.Y)
|
||||
return;
|
||||
|
||||
for (s16 z = node_min.Z; z <= node_max.Z; z++)
|
||||
for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
|
||||
Biome *biome = bmgr->biomes[biomemap[index]];
|
||||
|
||||
if (biome->c_dust == CONTENT_IGNORE)
|
||||
continue;
|
||||
|
||||
s16 y = node_max.Y;
|
||||
u32 vi = vm->m_area.index(x, y, z);
|
||||
for (; y >= node_min.Y; y--) {
|
||||
if (vm->m_data[vi].getContent() != CONTENT_AIR)
|
||||
break;
|
||||
|
||||
vm->m_area.add_y(em, vi, -1);
|
||||
}
|
||||
|
||||
content_t c = vm->m_data[vi].getContent();
|
||||
if (c == biome->c_water && biome->c_dust_water != CONTENT_IGNORE) {
|
||||
if (y < node_min.Y)
|
||||
continue;
|
||||
|
||||
vm->m_data[vi] = MapNode(biome->c_dust_water);
|
||||
} else if (!ndef->get(c).buildable_to && c != CONTENT_IGNORE) {
|
||||
if (y == node_max.Y)
|
||||
continue;
|
||||
|
||||
vm->m_area.add_y(em, vi, 1);
|
||||
vm->m_data[vi] = MapNode(biome->c_dust);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
void MapgenV7::addTopNodes() {
|
||||
v3s16 em = vm->m_area.getExtent();
|
||||
s16 ntopnodes;
|
||||
|
@ -691,7 +511,6 @@ void MapgenV7::addTopNodes() {
|
|||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#include "mapgen_v6.h"
|
||||
|
|
|
@ -24,34 +24,25 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
|
||||
extern NoiseParams nparams_v7_def_terrain_base;
|
||||
extern NoiseParams nparams_v7_def_terrain_alt;
|
||||
extern NoiseParams nparams_v7_def_terrain_mod;
|
||||
extern NoiseParams nparams_v7_def_terrain_persist;
|
||||
extern NoiseParams nparams_v7_def_height_select;
|
||||
extern NoiseParams nparams_v7_def_filler_depth;
|
||||
extern NoiseParams nparams_v7_def_mount_height;
|
||||
extern NoiseParams nparams_v7_def_ridge_uwater;
|
||||
extern NoiseParams nparams_v7_def_mountain;
|
||||
extern NoiseParams nparams_v7_def_ridge;
|
||||
|
||||
struct MapgenV7Params : public MapgenParams {
|
||||
NoiseParams np_terrain_base;
|
||||
NoiseParams np_terrain_alt;
|
||||
NoiseParams np_terrain_mod;
|
||||
NoiseParams np_terrain_persist;
|
||||
NoiseParams np_height_select;
|
||||
NoiseParams np_filler_depth;
|
||||
NoiseParams np_mount_height;
|
||||
NoiseParams np_ridge_uwater;
|
||||
NoiseParams np_mountain;
|
||||
NoiseParams np_ridge;
|
||||
|
||||
MapgenV7Params() {
|
||||
np_terrain_base = nparams_v7_def_terrain_base;
|
||||
np_terrain_alt = nparams_v7_def_terrain_alt;
|
||||
np_terrain_mod = nparams_v7_def_terrain_mod;
|
||||
np_terrain_persist = nparams_v7_def_terrain_persist;
|
||||
np_height_select = nparams_v7_def_height_select;
|
||||
np_filler_depth = nparams_v7_def_filler_depth;
|
||||
np_mount_height = nparams_v7_def_mount_height;
|
||||
np_ridge_uwater = nparams_v7_def_ridge_uwater;
|
||||
np_mountain = nparams_v7_def_mountain;
|
||||
np_ridge = nparams_v7_def_ridge;
|
||||
}
|
||||
|
||||
|
@ -67,8 +58,8 @@ public:
|
|||
BiomeDefManager *bmgr;
|
||||
|
||||
int ystride;
|
||||
int zstride;
|
||||
u32 flags;
|
||||
bool ridges;
|
||||
|
||||
u32 blockseed;
|
||||
v3s16 node_min;
|
||||
|
@ -80,12 +71,10 @@ public:
|
|||
|
||||
Noise *noise_terrain_base;
|
||||
Noise *noise_terrain_alt;
|
||||
Noise *noise_terrain_mod;
|
||||
Noise *noise_terrain_persist;
|
||||
Noise *noise_height_select;
|
||||
Noise *noise_filler_depth;
|
||||
Noise *noise_mount_height;
|
||||
Noise *noise_ridge_uwater;
|
||||
Noise *noise_mountain;
|
||||
|
||||
Noise *noise_ridge;
|
||||
|
||||
Noise *noise_heat;
|
||||
|
@ -97,7 +86,6 @@ public:
|
|||
content_t c_sand;
|
||||
content_t c_water_source;
|
||||
content_t c_lava_source;
|
||||
content_t c_ice;
|
||||
content_t c_gravel;
|
||||
content_t c_cobble;
|
||||
content_t c_desert_sand;
|
||||
|
@ -112,20 +100,15 @@ public:
|
|||
|
||||
float baseTerrainLevelAtPoint(int x, int z);
|
||||
float baseTerrainLevelFromMap(int index);
|
||||
bool getMountainTerrainAtPoint(int x, int y, int z);
|
||||
bool getMountainTerrainFromMap(int idx_xyz, int idx_xz, int y);
|
||||
|
||||
void calculateNoise();
|
||||
int calcHeightMap();
|
||||
|
||||
virtual int generateTerrain();
|
||||
int generateBaseTerrain();
|
||||
void generateMountainTerrain();
|
||||
void generateRidgeTerrain();
|
||||
virtual void generateTerrain();
|
||||
void carveRidges();
|
||||
//void carveRivers(); //experimental
|
||||
|
||||
void generateBiomes();
|
||||
void dustTopNodes();
|
||||
|
||||
//void addTopNodes();
|
||||
void testBiomes();
|
||||
void addTopNodes();
|
||||
|
||||
void generateCaves(int max_stone_y);
|
||||
};
|
||||
|
|
|
@ -28,15 +28,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#include <string>
|
||||
#include <sstream>
|
||||
|
||||
static const Rotation wallmounted_to_rot[] = {
|
||||
ROTATE_0, ROTATE_180, ROTATE_90, ROTATE_270
|
||||
};
|
||||
|
||||
static const u8 rot_to_wallmounted[] = {
|
||||
2, 4, 3, 5
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
MapNode
|
||||
*/
|
||||
|
@ -141,24 +132,6 @@ v3s16 MapNode::getWallMountedDir(INodeDefManager *nodemgr) const
|
|||
}
|
||||
}
|
||||
|
||||
void MapNode::rotateAlongYAxis(INodeDefManager *nodemgr, Rotation rot) {
|
||||
ContentParamType2 cpt2 = nodemgr->get(*this).param_type_2;
|
||||
|
||||
if (cpt2 == CPT2_FACEDIR) {
|
||||
u8 newrot = param2 & 3;
|
||||
param2 &= ~3;
|
||||
param2 |= (newrot + rot) & 3;
|
||||
} else if (cpt2 == CPT2_WALLMOUNTED) {
|
||||
u8 wmountface = (param2 & 7);
|
||||
if (wmountface <= 1)
|
||||
return;
|
||||
|
||||
Rotation oldrot = wallmounted_to_rot[wmountface - 2];
|
||||
param2 &= ~7;
|
||||
param2 |= rot_to_wallmounted[(oldrot - rot) & 3];
|
||||
}
|
||||
}
|
||||
|
||||
static std::vector<aabb3f> transformNodeBox(const MapNode &n,
|
||||
const NodeBox &nodebox, INodeDefManager *nodemgr)
|
||||
{
|
||||
|
|
|
@ -61,17 +61,6 @@ enum LightBank
|
|||
LIGHTBANK_NIGHT
|
||||
};
|
||||
|
||||
/*
|
||||
Simple rotation enum.
|
||||
*/
|
||||
enum Rotation {
|
||||
ROTATE_0,
|
||||
ROTATE_90,
|
||||
ROTATE_180,
|
||||
ROTATE_270,
|
||||
ROTATE_RAND,
|
||||
};
|
||||
|
||||
/*
|
||||
Masks for MapNode.param2 of flowing liquids
|
||||
*/
|
||||
|
@ -192,8 +181,6 @@ struct MapNode
|
|||
u8 getFaceDir(INodeDefManager *nodemgr) const;
|
||||
u8 getWallMounted(INodeDefManager *nodemgr) const;
|
||||
v3s16 getWallMountedDir(INodeDefManager *nodemgr) const;
|
||||
|
||||
void rotateAlongYAxis(INodeDefManager *nodemgr, Rotation rot);
|
||||
|
||||
/*
|
||||
Gets list of node boxes (used for rendering (NDT_NODEBOX)
|
||||
|
|
91
src/mesh.cpp
91
src/mesh.cpp
|
@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#include <iostream>
|
||||
#include <IAnimatedMesh.h>
|
||||
#include <SAnimatedMesh.h>
|
||||
#include <ICameraSceneNode.h>
|
||||
|
||||
// In Irrlicht 1.8 the signature of ITexture::lock was changed from
|
||||
// (bool, u32) to (E_TEXTURE_LOCK_MODE, u32).
|
||||
|
@ -280,17 +281,15 @@ scene::IAnimatedMesh* createExtrudedMesh(video::ITexture *texture,
|
|||
|
||||
// img1 is in the texture's color format, convert to 8-bit ARGB
|
||||
video::IImage *img2 = driver->createImage(video::ECF_A8R8G8B8, size);
|
||||
if (img2 == NULL)
|
||||
if (img2 != NULL)
|
||||
{
|
||||
img1->drop();
|
||||
return NULL;
|
||||
}
|
||||
img1->copyTo(img2);
|
||||
|
||||
img1->copyTo(img2);
|
||||
mesh = extrudeARGB(size.Width, size.Height, (u8*) img2->lock());
|
||||
img2->unlock();
|
||||
img2->drop();
|
||||
}
|
||||
img1->drop();
|
||||
mesh = extrudeARGB(size.Width, size.Height, (u8*) img2->lock());
|
||||
img2->unlock();
|
||||
img2->drop();
|
||||
}
|
||||
|
||||
// Set default material
|
||||
|
@ -408,3 +407,79 @@ void setMeshColorByNormalXYZ(scene::IMesh *mesh,
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
video::ITexture *generateTextureFromMesh(scene::IMesh *mesh,
|
||||
IrrlichtDevice *device,
|
||||
core::dimension2d<u32> dim,
|
||||
std::string texture_name,
|
||||
v3f camera_position,
|
||||
v3f camera_lookat,
|
||||
core::CMatrix4<f32> camera_projection_matrix,
|
||||
video::SColorf ambient_light,
|
||||
v3f light_position,
|
||||
video::SColorf light_color,
|
||||
f32 light_radius)
|
||||
{
|
||||
video::IVideoDriver *driver = device->getVideoDriver();
|
||||
if(driver->queryFeature(video::EVDF_RENDER_TO_TARGET) == false)
|
||||
{
|
||||
static bool warned = false;
|
||||
if(!warned)
|
||||
{
|
||||
errorstream<<"generateTextureFromMesh(): EVDF_RENDER_TO_TARGET"
|
||||
" not supported."<<std::endl;
|
||||
warned = true;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Create render target texture
|
||||
video::ITexture *rtt = driver->addRenderTargetTexture(
|
||||
dim, texture_name.c_str(), video::ECF_A8R8G8B8);
|
||||
if(rtt == NULL)
|
||||
{
|
||||
errorstream<<"generateTextureFromMesh(): addRenderTargetTexture"
|
||||
" returned NULL."<<std::endl;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Set render target
|
||||
driver->setRenderTarget(rtt, false, true, video::SColor(0,0,0,0));
|
||||
|
||||
// Get a scene manager
|
||||
scene::ISceneManager *smgr_main = device->getSceneManager();
|
||||
assert(smgr_main);
|
||||
scene::ISceneManager *smgr = smgr_main->createNewSceneManager();
|
||||
assert(smgr);
|
||||
|
||||
scene::IMeshSceneNode* meshnode = smgr->addMeshSceneNode(mesh, NULL, -1, v3f(0,0,0), v3f(0,0,0), v3f(1,1,1), true);
|
||||
meshnode->setMaterialFlag(video::EMF_LIGHTING, true);
|
||||
meshnode->setMaterialFlag(video::EMF_ANTI_ALIASING, true);
|
||||
meshnode->setMaterialFlag(video::EMF_BILINEAR_FILTER, true);
|
||||
|
||||
scene::ICameraSceneNode* camera = smgr->addCameraSceneNode(0,
|
||||
camera_position, camera_lookat);
|
||||
// second parameter of setProjectionMatrix (isOrthogonal) is ignored
|
||||
camera->setProjectionMatrix(camera_projection_matrix, false);
|
||||
|
||||
smgr->setAmbientLight(ambient_light);
|
||||
smgr->addLightSceneNode(0, light_position, light_color, light_radius);
|
||||
|
||||
// Render scene
|
||||
driver->beginScene(true, true, video::SColor(0,0,0,0));
|
||||
smgr->drawAll();
|
||||
driver->endScene();
|
||||
|
||||
// NOTE: The scene nodes should not be dropped, otherwise
|
||||
// smgr->drop() segfaults
|
||||
/*cube->drop();
|
||||
camera->drop();
|
||||
light->drop();*/
|
||||
// Drop scene manager
|
||||
smgr->drop();
|
||||
|
||||
// Unset render target
|
||||
driver->setRenderTarget(0, false, true, 0);
|
||||
|
||||
return rtt;
|
||||
}
|
||||
|
|
16
src/mesh.h
16
src/mesh.h
|
@ -69,4 +69,20 @@ void setMeshColorByNormalXYZ(scene::IMesh *mesh,
|
|||
const video::SColor &colorY,
|
||||
const video::SColor &colorZ);
|
||||
|
||||
/*
|
||||
Render a mesh to a texture.
|
||||
Returns NULL if render-to-texture failed.
|
||||
*/
|
||||
video::ITexture *generateTextureFromMesh(scene::IMesh *mesh,
|
||||
IrrlichtDevice *device,
|
||||
core::dimension2d<u32> dim,
|
||||
std::string texture_name,
|
||||
v3f camera_position,
|
||||
v3f camera_lookat,
|
||||
core::CMatrix4<f32> camera_projection_matrix,
|
||||
video::SColorf ambient_light,
|
||||
v3f light_position,
|
||||
video::SColorf light_color,
|
||||
f32 light_radius);
|
||||
|
||||
#endif
|
||||
|
|
28
src/mods.cpp
28
src/mods.cpp
|
@ -18,7 +18,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
*/
|
||||
|
||||
#include "mods.h"
|
||||
#include "main.h"
|
||||
#include "filesys.h"
|
||||
#include "strfnd.h"
|
||||
#include "log.h"
|
||||
|
@ -26,7 +25,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#include "settings.h"
|
||||
#include "strfnd.h"
|
||||
#include <cctype>
|
||||
#include "convert_json.h"
|
||||
|
||||
static bool parseDependsLine(std::istream &is,
|
||||
std::string &dep, std::set<char> &symbols)
|
||||
|
@ -391,29 +389,3 @@ void ModConfiguration::resolveDependencies()
|
|||
// Step 4: write back list of unsatisfied mods
|
||||
m_unsatisfied_mods.assign(unsatisfied.begin(), unsatisfied.end());
|
||||
}
|
||||
|
||||
#if USE_CURL
|
||||
Json::Value getModstoreUrl(std::string url)
|
||||
{
|
||||
struct curl_slist *chunk = NULL;
|
||||
|
||||
bool special_http_header = true;
|
||||
|
||||
try{
|
||||
special_http_header = g_settings->getBool("modstore_disable_special_http_header");
|
||||
}
|
||||
catch(SettingNotFoundException &e) {
|
||||
}
|
||||
|
||||
if (special_http_header)
|
||||
chunk = curl_slist_append(chunk, "Accept: application/vnd.minetest.mmdb-v1+json");
|
||||
|
||||
Json::Value retval = fetchJsonValue(url,chunk);
|
||||
|
||||
if (chunk != NULL)
|
||||
curl_slist_free_all(chunk);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
68
src/mods.h
68
src/mods.h
|
@ -29,12 +29,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#include <map>
|
||||
#include <exception>
|
||||
#include <list>
|
||||
#include "json/json.h"
|
||||
#include "config.h"
|
||||
|
||||
#if USE_CURL
|
||||
#include <curl/curl.h>
|
||||
#endif
|
||||
|
||||
#define MODNAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyz0123456789_"
|
||||
|
||||
|
@ -160,66 +154,4 @@ private:
|
|||
|
||||
};
|
||||
|
||||
#if USE_CURL
|
||||
Json::Value getModstoreUrl(std::string url);
|
||||
#else
|
||||
inline Json::Value getModstoreUrl(std::string url) {
|
||||
return Json::Value();
|
||||
}
|
||||
#endif
|
||||
|
||||
struct ModLicenseInfo {
|
||||
int id;
|
||||
std::string shortinfo;
|
||||
std::string url;
|
||||
};
|
||||
|
||||
struct ModAuthorInfo {
|
||||
int id;
|
||||
std::string username;
|
||||
};
|
||||
|
||||
struct ModStoreMod {
|
||||
int id;
|
||||
std::string title;
|
||||
std::string basename;
|
||||
ModAuthorInfo author;
|
||||
float rating;
|
||||
bool valid;
|
||||
};
|
||||
|
||||
struct ModStoreCategoryInfo {
|
||||
int id;
|
||||
std::string name;
|
||||
};
|
||||
|
||||
struct ModStoreVersionEntry {
|
||||
int id;
|
||||
std::string date;
|
||||
std::string file;
|
||||
bool approved;
|
||||
//ugly version number
|
||||
int mtversion;
|
||||
};
|
||||
|
||||
struct ModStoreModDetails {
|
||||
/* version_set?? */
|
||||
std::vector<ModStoreCategoryInfo> categories;
|
||||
ModAuthorInfo author;
|
||||
ModLicenseInfo license;
|
||||
int id;
|
||||
std::string title;
|
||||
std::string basename;
|
||||
std::string description;
|
||||
std::string repository;
|
||||
float rating;
|
||||
std::vector<std::string> depends;
|
||||
std::vector<std::string> softdeps;
|
||||
|
||||
std::string download_url;
|
||||
std::string screenshot_url;
|
||||
std::vector<ModStoreVersionEntry> versions;
|
||||
bool valid;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -674,9 +674,7 @@ public:
|
|||
// Tiles (fill in f->tiles[])
|
||||
for(u16 j=0; j<6; j++){
|
||||
// Texture
|
||||
f->tiles[j].texture = tsrc->getTexture(
|
||||
tiledef[j].name,
|
||||
&f->tiles[j].texture_id);
|
||||
f->tiles[j].texture = tsrc->getTexture(tiledef[j].name);
|
||||
// Alpha
|
||||
f->tiles[j].alpha = f->alpha;
|
||||
// Material type
|
||||
|
@ -691,9 +689,10 @@ public:
|
|||
if(f->tiles[j].material_flags &
|
||||
MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES)
|
||||
{
|
||||
// Get texture size to determine frame count by
|
||||
// Get raw texture size to determine frame count by
|
||||
// aspect ratio
|
||||
v2u32 size = f->tiles[j].texture->getOriginalSize();
|
||||
video::ITexture *t = tsrc->getTextureRaw(tiledef[j].name);
|
||||
v2u32 size = t->getOriginalSize();
|
||||
int frame_height = (float)size.X /
|
||||
(float)tiledef[j].animation.aspect_w *
|
||||
(float)tiledef[j].animation.aspect_h;
|
||||
|
@ -716,9 +715,8 @@ public:
|
|||
// Special tiles (fill in f->special_tiles[])
|
||||
for(u16 j=0; j<CF_SPECIAL_COUNT; j++){
|
||||
// Texture
|
||||
f->special_tiles[j].texture = tsrc->getTexture(
|
||||
f->tiledef_special[j].name,
|
||||
&f->special_tiles[j].texture_id);
|
||||
f->special_tiles[j].texture =
|
||||
tsrc->getTexture(f->tiledef_special[j].name);
|
||||
// Alpha
|
||||
f->special_tiles[j].alpha = f->alpha;
|
||||
// Material type
|
||||
|
@ -733,9 +731,10 @@ public:
|
|||
if(f->special_tiles[j].material_flags &
|
||||
MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES)
|
||||
{
|
||||
// Get texture size to determine frame count by
|
||||
// Get raw texture size to determine frame count by
|
||||
// aspect ratio
|
||||
v2u32 size = f->special_tiles[j].texture->getOriginalSize();
|
||||
video::ITexture *t = tsrc->getTextureRaw(f->tiledef_special[j].name);
|
||||
v2u32 size = t->getOriginalSize();
|
||||
int frame_height = (float)size.X /
|
||||
(float)f->tiledef_special[j].animation.aspect_w *
|
||||
(float)f->tiledef_special[j].animation.aspect_h;
|
||||
|
|
|
@ -312,6 +312,7 @@ public:
|
|||
|
||||
/*
|
||||
Update tile textures to latest return values of TextueSource.
|
||||
Call after updating the texture atlas of a TextureSource.
|
||||
*/
|
||||
virtual void updateTextures(ITextureSource *tsrc)=0;
|
||||
|
||||
|
|
|
@ -57,9 +57,7 @@ Particle::Particle(
|
|||
float expirationtime,
|
||||
float size,
|
||||
bool collisiondetection,
|
||||
video::ITexture *texture,
|
||||
v2f texpos,
|
||||
v2f texsize
|
||||
AtlasPointer ap
|
||||
):
|
||||
scene::ISceneNode(smgr->getRootSceneNode(), smgr)
|
||||
{
|
||||
|
@ -72,9 +70,8 @@ Particle::Particle(
|
|||
m_material.setFlag(video::EMF_BILINEAR_FILTER, false);
|
||||
m_material.setFlag(video::EMF_FOG_ENABLE, true);
|
||||
m_material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
|
||||
m_material.setTexture(0, texture);
|
||||
m_texpos = texpos;
|
||||
m_texsize = texsize;
|
||||
m_material.setTexture(0, ap.atlas);
|
||||
m_ap = ap;
|
||||
|
||||
|
||||
// Particle related
|
||||
|
@ -183,19 +180,14 @@ void Particle::updateLight(ClientEnvironment &env)
|
|||
void Particle::updateVertices()
|
||||
{
|
||||
video::SColor c(255, m_light, m_light, m_light);
|
||||
f32 tx0 = m_texpos.X;
|
||||
f32 tx1 = m_texpos.X + m_texsize.X;
|
||||
f32 ty0 = m_texpos.Y;
|
||||
f32 ty1 = m_texpos.Y + m_texsize.Y;
|
||||
|
||||
m_vertices[0] = video::S3DVertex(-m_size/2,-m_size/2,0, 0,0,0,
|
||||
c, tx0, ty1);
|
||||
c, m_ap.x0(), m_ap.y1());
|
||||
m_vertices[1] = video::S3DVertex(m_size/2,-m_size/2,0, 0,0,0,
|
||||
c, tx1, ty1);
|
||||
c, m_ap.x1(), m_ap.y1());
|
||||
m_vertices[2] = video::S3DVertex(m_size/2,m_size/2,0, 0,0,0,
|
||||
c, tx1, ty0);
|
||||
c, m_ap.x1(), m_ap.y0());
|
||||
m_vertices[3] = video::S3DVertex(-m_size/2,m_size/2,0, 0,0,0,
|
||||
c, tx0, ty0);
|
||||
c ,m_ap.x0(), m_ap.y0());
|
||||
|
||||
for(u16 i=0; i<4; i++)
|
||||
{
|
||||
|
@ -256,19 +248,19 @@ void addNodeParticle(IGameDef* gamedef, scene::ISceneManager* smgr,
|
|||
{
|
||||
// Texture
|
||||
u8 texid = myrand_range(0,5);
|
||||
video::ITexture *texture = tiles[texid].texture;
|
||||
|
||||
// Only use first frame of animated texture
|
||||
f32 ymax = 1;
|
||||
if(tiles[texid].material_flags & MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES)
|
||||
ymax /= tiles[texid].animation_frame_count;
|
||||
|
||||
AtlasPointer ap = tiles[texid].texture;
|
||||
float size = rand()%64/512.;
|
||||
float visual_size = BS*size;
|
||||
v2f texsize(size*2, ymax*size*2);
|
||||
v2f texpos;
|
||||
texpos.X = ((rand()%64)/64.-texsize.X);
|
||||
texpos.Y = ymax*((rand()%64)/64.-texsize.Y);
|
||||
float texsize = size*2;
|
||||
|
||||
float x1 = ap.x1();
|
||||
float y1 = ap.y1();
|
||||
|
||||
ap.size.X = (ap.x1() - ap.x0()) * texsize;
|
||||
ap.size.Y = (ap.x1() - ap.x0()) * texsize;
|
||||
|
||||
ap.pos.X = ap.x0() + (x1 - ap.x0()) * ((rand()%64)/64.-texsize);
|
||||
ap.pos.Y = ap.y0() + (y1 - ap.y0()) * ((rand()%64)/64.-texsize);
|
||||
|
||||
// Physics
|
||||
v3f velocity( (rand()%100/50.-1)/1.5,
|
||||
|
@ -293,9 +285,7 @@ void addNodeParticle(IGameDef* gamedef, scene::ISceneManager* smgr,
|
|||
rand()%100/100., // expiration time
|
||||
visual_size,
|
||||
true,
|
||||
texture,
|
||||
texpos,
|
||||
texsize);
|
||||
ap);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -306,7 +296,7 @@ ParticleSpawner::ParticleSpawner(IGameDef* gamedef, scene::ISceneManager *smgr,
|
|||
u16 amount, float time,
|
||||
v3f minpos, v3f maxpos, v3f minvel, v3f maxvel, v3f minacc, v3f maxacc,
|
||||
float minexptime, float maxexptime, float minsize, float maxsize,
|
||||
bool collisiondetection, video::ITexture *texture, u32 id)
|
||||
bool collisiondetection, AtlasPointer ap, u32 id)
|
||||
{
|
||||
m_gamedef = gamedef;
|
||||
m_smgr = smgr;
|
||||
|
@ -324,7 +314,7 @@ ParticleSpawner::ParticleSpawner(IGameDef* gamedef, scene::ISceneManager *smgr,
|
|||
m_minsize = minsize;
|
||||
m_maxsize = maxsize;
|
||||
m_collisiondetection = collisiondetection;
|
||||
m_texture = texture;
|
||||
m_ap = ap;
|
||||
m_time = 0;
|
||||
|
||||
for (u16 i = 0; i<=m_amount; i++)
|
||||
|
@ -372,9 +362,7 @@ void ParticleSpawner::step(float dtime, ClientEnvironment &env)
|
|||
exptime,
|
||||
size,
|
||||
m_collisiondetection,
|
||||
m_texture,
|
||||
v2f(0.0, 0.0),
|
||||
v2f(1.0, 1.0));
|
||||
m_ap);
|
||||
m_spawntimes.erase(i);
|
||||
}
|
||||
else
|
||||
|
@ -410,9 +398,7 @@ void ParticleSpawner::step(float dtime, ClientEnvironment &env)
|
|||
exptime,
|
||||
size,
|
||||
m_collisiondetection,
|
||||
m_texture,
|
||||
v2f(0.0, 0.0),
|
||||
v2f(1.0, 1.0));
|
||||
m_ap);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,9 +42,7 @@ class Particle : public scene::ISceneNode
|
|||
float expirationtime,
|
||||
float size,
|
||||
bool collisiondetection,
|
||||
video::ITexture *texture,
|
||||
v2f texpos,
|
||||
v2f texsize
|
||||
AtlasPointer texture
|
||||
);
|
||||
~Particle();
|
||||
|
||||
|
@ -83,13 +81,16 @@ private:
|
|||
core::aabbox3d<f32> m_box;
|
||||
core::aabbox3d<f32> m_collisionbox;
|
||||
video::SMaterial m_material;
|
||||
v2f m_texpos;
|
||||
v2f m_texsize;
|
||||
v3f m_pos;
|
||||
v3f m_velocity;
|
||||
v3f m_acceleration;
|
||||
float tex_x0;
|
||||
float tex_x1;
|
||||
float tex_y0;
|
||||
float tex_y1;
|
||||
LocalPlayer *m_player;
|
||||
float m_size;
|
||||
AtlasPointer m_ap;
|
||||
u8 m_light;
|
||||
bool m_collisiondetection;
|
||||
};
|
||||
|
@ -108,7 +109,7 @@ class ParticleSpawner
|
|||
float minexptime, float maxexptime,
|
||||
float minsize, float maxsize,
|
||||
bool collisiondetection,
|
||||
video::ITexture *texture,
|
||||
AtlasPointer ap,
|
||||
u32 id);
|
||||
|
||||
~ParticleSpawner();
|
||||
|
@ -135,7 +136,7 @@ class ParticleSpawner
|
|||
float m_maxexptime;
|
||||
float m_minsize;
|
||||
float m_maxsize;
|
||||
video::ITexture *m_texture;
|
||||
AtlasPointer m_ap;
|
||||
std::vector<float> m_spawntimes;
|
||||
bool m_collisiondetection;
|
||||
};
|
||||
|
|
|
@ -226,10 +226,8 @@ bool getstringfield(lua_State *L, int table,
|
|||
if(lua_isstring(L, -1)){
|
||||
size_t len = 0;
|
||||
const char *ptr = lua_tolstring(L, -1, &len);
|
||||
if (ptr) {
|
||||
result.assign(ptr, len);
|
||||
got = true;
|
||||
}
|
||||
result.assign(ptr, len);
|
||||
got = true;
|
||||
}
|
||||
lua_pop(L, 1);
|
||||
return got;
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue