Maksim Gamarnik 2016-01-31 20:57:03 +02:00
commit 18c6b747b6
77 changed files with 2910 additions and 1190 deletions

View File

@ -149,16 +149,9 @@ endif()
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/builtin" DESTINATION "${SHAREDIR}")
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/client" DESTINATION "${SHAREDIR}")
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/games/minimal" DESTINATION "${SHAREDIR}/games")
set(MINETEST_GAME_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/games/minetest_game")
if(EXISTS ${MINETEST_GAME_SOURCE} AND IS_DIRECTORY ${MINETEST_GAME_SOURCE})
install(FILES ${MINETEST_GAME_SOURCE}/game.conf DESTINATION "${SHAREDIR}/games/minetest_game/")
install(FILES ${MINETEST_GAME_SOURCE}/README.txt DESTINATION "${SHAREDIR}/games/minetest_game/")
install(DIRECTORY ${MINETEST_GAME_SOURCE}/mods DESTINATION "${SHAREDIR}/games/minetest_game")
install(DIRECTORY ${MINETEST_GAME_SOURCE}/menu DESTINATION "${SHAREDIR}/games/minetest_game")
endif()
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/games" DESTINATION "${SHAREDIR}" PATTERN ".git*" EXCLUDE)
if(BUILD_CLIENT)
#install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/sounds/base/pack" DESTINATION "${SHAREDIR}/sounds/base")
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/textures/base/pack" DESTINATION "${SHAREDIR}/textures/base")
endif()
if(RUN_IN_PLACE)

View File

@ -809,8 +809,8 @@ $(ROOT)/jni/src/android_version.h : prep_srcdir
echo "#define VERSION_MAJOR ${VERSION_MAJOR}"; \
echo "#define VERSION_MINOR ${VERSION_MINOR}"; \
echo "#define VERSION_PATCH ${VERSION_PATCH}"; \
echo "#define VERSION_STRING STR(VERSION_MAJOR)\".\"STR(VERSION_MINOR)\
\".\"STR(VERSION_PATCH)"; \
echo "#define VERSION_STRING STR(VERSION_MAJOR) \".\" STR(VERSION_MINOR) \
\".\" STR(VERSION_PATCH)"; \
echo "#endif"; \
} > $${VERSION_FILE_NEW}; \
if ! cmp -s $${VERSION_FILE} $${VERSION_FILE_NEW}; then \

View File

@ -179,6 +179,7 @@ LOCAL_SRC_FILES := \
jni/src/mapgen_v5.cpp \
jni/src/mapgen_v6.cpp \
jni/src/mapgen_v7.cpp \
jni/src/mapgen_valleys.cpp \
jni/src/mapnode.cpp \
jni/src/mapsector.cpp \
jni/src/mesh.cpp \

View File

@ -574,6 +574,7 @@ core.nodedef_default = {
diggable = true,
climbable = false,
buildable_to = false,
floodable = false,
liquidtype = "none",
liquid_alternative_flowing = "",
liquid_alternative_source = "",

View File

@ -31,6 +31,7 @@ core.register_entity(":__builtin:item", {
spritediv = {x = 1, y = 1},
initial_sprite_basepos = {x = 0, y = 0},
is_visible = false,
infotext = "",
},
itemstring = '',
@ -50,6 +51,7 @@ core.register_entity(":__builtin:item", {
local c = s
local itemtable = stack:to_table()
local itemname = nil
local description = ""
if itemtable then
itemname = stack:to_table().name
end
@ -58,6 +60,7 @@ core.register_entity(":__builtin:item", {
if core.registered_items[itemname] then
item_texture = core.registered_items[itemname].inventory_image
item_type = core.registered_items[itemname].type
description = core.registered_items[itemname].description
end
local prop = {
is_visible = true,
@ -66,6 +69,7 @@ core.register_entity(":__builtin:item", {
visual_size = {x = s, y = s},
collisionbox = {-c, -c, -c, c, c, c},
automatic_rotate = math.pi * 0.5,
infotext = description,
}
self.object:set_properties(prop)
end,

View File

@ -4,74 +4,48 @@
-- Misc. API functions
--
local timers = {}
local mintime
local function update_timers(delay)
mintime = false
local sub = 0
for index = 1, #timers do
index = index - sub
local timer = timers[index]
timer.time = timer.time - delay
if timer.time <= 0 then
core.set_last_run_mod(timer.mod_origin)
timer.func(unpack(timer.args or {}))
table.remove(timers, index)
sub = sub + 1
elseif mintime then
mintime = math.min(mintime, timer.time)
else
mintime = timer.time
local jobs = {}
local time = 0.0
local last = 0.0
core.register_globalstep(function(dtime)
local new = core.get_us_time() / 1000000
if new > last then
time = time + (new - last)
else
-- Overflow, we may lose a little bit of time here but
-- only 1 tick max, potentially running timers slightly
-- too early.
time = time + new
end
last = new
if #jobs < 1 then
return
end
-- Iterate backwards so that we miss any new timers added by
-- a timer callback, and so that we don't skip the next timer
-- in the list if we remove one.
for i = #jobs, 1, -1 do
local job = jobs[i]
if time >= job.expire then
core.set_last_run_mod(job.mod_origin)
job.func(unpack(job.arg))
table.remove(jobs, i)
end
end
end
local timers_to_add
local function add_timers()
for _, timer in ipairs(timers_to_add) do
table.insert(timers, timer)
end
timers_to_add = false
end
local delay = 0
core.register_globalstep(function(dtime)
if not mintime then
-- abort if no timers are running
return
end
if timers_to_add then
add_timers()
end
delay = delay + dtime
if delay < mintime then
return
end
update_timers(delay)
delay = 0
end)
function core.after(time, func, ...)
function core.after(after, func, ...)
assert(tonumber(time) and type(func) == "function",
"Invalid core.after invocation")
if not mintime then
mintime = time
timers_to_add = {{
time = time+delay,
func = func,
args = {...},
mod_origin = core.get_last_run_mod(),
}}
return
end
mintime = math.min(mintime, time)
timers_to_add = timers_to_add or {}
timers_to_add[#timers_to_add+1] = {
time = time+delay,
func = func,
args = {...},
mod_origin = core.get_last_run_mod(),
}
table.insert(jobs, {
func = func,
expire = time + after,
arg = {...},
mod_origin = core.get_last_run_mod()
})
end
function core.check_player_privs(player_or_name, ...)

View File

@ -289,6 +289,7 @@ core.register_node(":air", {
pointable = false,
diggable = false,
buildable_to = true,
floodable = true,
air_equivalent = true,
drop = "",
groups = {not_in_creative_inventory=1},

View File

@ -19,29 +19,29 @@
function get_mods(path,retval,modpack)
local mods = core.get_dir_list(path, true)
for i=1, #mods, 1 do
if mods[i]:sub(1,1) ~= "." then
for _, name in ipairs(mods) do
if name:sub(1, 1) ~= "." then
local prefix = path .. DIR_DELIM .. name .. DIR_DELIM
local toadd = {}
local modpackfile = nil
table.insert(retval, toadd)
toadd.name = mods[i]
toadd.path = path .. DIR_DELIM .. mods[i] .. DIR_DELIM
if modpack ~= nil and
modpack ~= "" then
toadd.modpack = modpack
else
local filename = path .. DIR_DELIM .. mods[i] .. DIR_DELIM .. "modpack.txt"
local error = nil
modpackfile,error = io.open(filename,"r")
local mod_conf = Settings(prefix .. "mod.conf"):to_table()
if mod_conf.name then
name = mod_conf.name
end
if modpackfile ~= nil then
modpackfile:close()
toadd.is_modpack = true
table.insert(retval,toadd)
get_mods(path .. DIR_DELIM .. mods[i],retval,mods[i])
toadd.name = name
toadd.path = prefix
if modpack ~= nil and modpack ~= "" then
toadd.modpack = modpack
else
table.insert(retval,toadd)
local modpackfile = io.open(prefix .. "modpack.txt")
if modpackfile then
modpackfile:close()
toadd.is_modpack = true
get_mods(prefix, retval, name)
end
end
end
end

View File

@ -20,8 +20,8 @@ local FILENAME = "settingtypes.txt"
local CHAR_CLASSES = {
SPACE = "[%s]",
VARIABLE = "[%w_%-%.]",
INTEGER = "[-]?[%d]",
FLOAT = "[-]?[%d%.]",
INTEGER = "[+-]?[%d]",
FLOAT = "[+-]?[%d%.]",
FLAGS = "[%w_%-%.,]",
}
@ -65,11 +65,11 @@ local function parse_setting_line(settings, line, read_all, base_level, allow_se
-- so we can later strip it from the rest of the line
.. "("
.. "([" .. CHAR_CLASSES.VARIABLE .. "+)" -- variable name
.. CHAR_CLASSES.SPACE
.. CHAR_CLASSES.SPACE .. "*"
.. "%(([^%)]*)%)" -- readable name
.. CHAR_CLASSES.SPACE
.. CHAR_CLASSES.SPACE .. "*"
.. "(" .. CHAR_CLASSES.VARIABLE .. "+)" -- type
.. CHAR_CLASSES.SPACE .. "?"
.. CHAR_CLASSES.SPACE .. "*"
.. ")")
if not first_part then
@ -88,8 +88,8 @@ local function parse_setting_line(settings, line, read_all, base_level, allow_se
if setting_type == "int" then
local default, min, max = remaining_line:match("^"
-- first int is required, the last 2 are optional
.. "(" .. CHAR_CLASSES.INTEGER .. "+)" .. CHAR_CLASSES.SPACE .. "?"
.. "(" .. CHAR_CLASSES.INTEGER .. "*)" .. CHAR_CLASSES.SPACE .. "?"
.. "(" .. CHAR_CLASSES.INTEGER .. "+)" .. CHAR_CLASSES.SPACE .. "*"
.. "(" .. CHAR_CLASSES.INTEGER .. "*)" .. CHAR_CLASSES.SPACE .. "*"
.. "(" .. CHAR_CLASSES.INTEGER .. "*)"
.. "$")
@ -151,8 +151,8 @@ local function parse_setting_line(settings, line, read_all, base_level, allow_se
if setting_type == "float" then
local default, min, max = remaining_line:match("^"
-- first float is required, the last 2 are optional
.. "(" .. CHAR_CLASSES.FLOAT .. "+)" .. CHAR_CLASSES.SPACE .. "?"
.. "(" .. CHAR_CLASSES.FLOAT .. "*)" .. CHAR_CLASSES.SPACE .. "?"
.. "(" .. CHAR_CLASSES.FLOAT .. "+)" .. CHAR_CLASSES.SPACE .. "*"
.. "(" .. CHAR_CLASSES.FLOAT .. "*)" .. CHAR_CLASSES.SPACE .. "*"
.. "(" .. CHAR_CLASSES.FLOAT .. "*)"
.."$")
@ -175,7 +175,11 @@ local function parse_setting_line(settings, line, read_all, base_level, allow_se
end
if setting_type == "enum" then
local default, values = remaining_line:match("^(.+)" .. CHAR_CLASSES.SPACE .. "(.+)$")
local default, values = remaining_line:match("^"
-- first value (default) may be empty (i.e. is optional)
.. "(" .. CHAR_CLASSES.VARIABLE .. "*)" .. CHAR_CLASSES.SPACE .. "*"
.. "(" .. CHAR_CLASSES.FLAGS .. "+)"
.. "$")
if not default or values == "" then
return "Invalid enum setting"
@ -211,14 +215,22 @@ local function parse_setting_line(settings, line, read_all, base_level, allow_se
if setting_type == "flags" then
local default, possible = remaining_line:match("^"
.. "(" .. CHAR_CLASSES.FLAGS .. "+)" .. CHAR_CLASSES.SPACE .. ""
.. "(" .. CHAR_CLASSES.FLAGS .. "+)"
-- first value (default) may be empty (i.e. is optional)
-- this is implemented by making the last value optional, and
-- swapping them around if it turns out empty.
.. "(" .. CHAR_CLASSES.FLAGS .. "+)" .. CHAR_CLASSES.SPACE .. "*"
.. "(" .. CHAR_CLASSES.FLAGS .. "*)"
.. "$")
if not default or not possible then
return "Invalid flags setting"
end
if possible == "" then
possible = default
default = ""
end
table.insert(settings, {
name = name,
readable_name = readable_name,
@ -433,7 +445,7 @@ local function create_change_setting_formspec(dialogdata)
if dialogdata.error_message then
formspec = formspec .. "tablecolumns[color;text]" ..
"tableoptions[background=#00000000;highlight=#00000000;border=false]" ..
"table[5,4;5,1;error_message;#FF0000,"
"table[5,3.9;5,0.6;error_message;#FF0000,"
.. core.formspec_escape(dialogdata.error_message) .. ";0]"
width = 5
if dialogdata.entered_text then
@ -494,8 +506,8 @@ local function handle_change_setting_buttons(this, fields)
local new_value = fields["te_setting_value"]
for _,value in ipairs(new_value:split(",", true)) do
value = value:trim()
if not value:match(CHAR_CLASSES.FLAGS .. "+")
or not setting.possible:match("[,]?" .. value .. "[,]?") then
local possible = "," .. setting.possible .. ","
if not possible:find("," .. value .. ",", 0, true) then
this.data.error_message = fgettext_ne("\"$1\" is not a valid flag.", value)
this.data.entered_text = fields["te_setting_value"]
core.update_formspec(this:get_formspec())

View File

@ -454,7 +454,8 @@ fall_bobbing_amount (Fall bobbing) float 0.0
# - interlaced: odd/even line based polarisation screen support.
# - topbottom: split screen top/bottom.
# - sidebyside: split screen side by side.
3d_mode (3D mode) enum none none,anaglyph,interlaced,topbottom,sidebyside
# - pageflip: quadbuffer based 3d.
3d_mode (3D mode) enum none none,anaglyph,interlaced,topbottom,sidebyside,pageflip
# In-game chat console background color (R,G,B).
console_color (Console color) string (0,0,0)
@ -935,7 +936,7 @@ mgv7_np_cave2 (Mapgen v7 cave2 noise parameters) noise_params 0, 12, (100, 100,
# Occasional lakes and hills added to the flat world.
# Flags that are not specified in the flag string are not modified from the default.
# Flags starting with "no" are used to explicitly disable them.
mgflat_spflags (Mapgen flat flags) flags nolakes,nohills lakes,hills,nolakes,nohills
mgflat_spflags (Mapgen flat flags) flags lakes,hills,,nolakes,nohills
# Y of flat ground.
mgflat_ground_level (Mapgen flat ground level) int 8
@ -1032,6 +1033,84 @@ mgfractal_np_filler_depth (Mapgen fractal filler depth noise parameters) noise_p
mgfractal_np_cave1 (Mapgen fractal cave1 noise parameters) noise_params 0, 12, (128, 128, 128), 52534, 4, 0.5, 2.0
mgfractal_np_cave2 (Mapgen fractal cave2 noise parameters) noise_params 0, 12, (128, 128, 128), 10325, 4, 0.5, 2.0
# Mapgen Valleys parameters
[***Mapgen Valleys]
# General parameters
[****General]
# Map generation attributes specific to Mapgen Valleys.
# Flags that are not specified in the flag string are not modified from the default.
# Flags starting with "no" are used to explicitly disable them.
# "altitude_chill" makes higher elevations colder, which may cause biome issues.
# "fast" produces softer terrain, more quickly
# "humid_rivers" modifies the humidity around rivers and in areas where water would tend to pool. It may interfere with delicately adjusted biomes.
# "rugged" and "cliffs" do nothing unless "fast" is enabled
mg_valleys_spflags (Valleys C Flags) flags altitude_chill,cliffs,humid_rivers,nofast,rugged altitude_chill,noaltitude_chill,cliffs,nocliffs,fast,nofast,humid_rivers,nohumid_rivers,rugged,norugged
# The altitude at which temperature drops by 20C
mg_valleys_altitude_chill (Altitude Chill) int 90
# Average humidity
mg_valleys_humidity (Humidity) int 50
# The highest humidity around rivers in otherwise dry areas
mg_valleys_humidity_break_point (Humidity Break) int 65
# Maximum altitude where lava can emerge
mg_valleys_lava_max_height (Lava Height) int 0
# Maximum altitude where water occurs in caves (and tends to fall out)
mg_valleys_cave_water_max_height (Cave Water Height) int 31000
# How deep to make rivers
mg_valleys_river_depth (River Depth) int 4
# How wide to make rivers
mg_valleys_river_size (River Size) int 5
# Average temperature
mg_valleys_temperature (Temperature) int 50
# How often water occurs in caves (0-10)
mg_valleys_water_features (Water Features) int 3
# Noise parameters
[****Noises]
# Cliff noise
mg_valleys_np_cliffs (Cliffs) noise_params 0, 1, (750, 750, 750), 8445, 5, 1.0, 2.0
# Mountain corrugation
mg_valleys_np_corr (Corrugation) noise_params 0, 1, (40, 40, 40), -3536, 4, 1.0, 2.0
# The depth of dirt or other filler
mg_valleys_np_filler_depth (Filler Depth) noise_params 0, 1.2, (256, 256, 256), 1605, 3, 0.5, 2.0
# River noise -- rivers occur close to zero
mg_valleys_np_rivers (River Noise) noise_params 0, 1, (256, 256, 256), -6050, 5, 0.6, 2.0
# Caves and tunnels form at the intersection of the two noises
mg_valleys_np_simple_caves_1 (Simple Caves #1) noise_params 0, 1, v3f(64, 64, 64), -8402, 3, 0.5, 2.0
# Caves and tunnels form at the intersection of the two noises
mg_valleys_np_simple_caves_2 (Simple Caves #2) noise_params 0, 1, v3f(64, 64, 64), 3944, 3, 0.5, 2.0
# Base terrain height
mg_valleys_np_terrain_height (Terrain Height) noise_params -10, 50, (1024, 1024, 1024), 5202, 6, 0.4, 2.0
# Raises terrain to make valleys around the rivers
mg_valleys_np_valley_depth (Valley Depth) noise_params 5, 4, (512, 512, 512), -1914, 1, 1.0, 2.0
# Slope and fill work together to modify the heights
mg_valleys_np_inter_valley_fill (Valley Fill) noise_params 0, 1, (256, 512, 256), 1993, 6, 0.8, 2.0
# Amplifies the valleys
mg_valleys_np_valley_profile (Valley Profile) noise_params 0.6, 0.5, (512, 512, 512), 777, 1, 1.0, 2.0
# Slope and fill work together to modify the heights
mg_valleys_np_inter_valley_slope (Valley Slope) noise_params 0.5, 0.5, (128, 128, 128), 746, 1, 1.0, 2.0
[*Security]
# Prevent mods from doing insecure things like running shell commands.

View File

@ -1,34 +1,53 @@
DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = "Minetest"
# Project properties
PROJECT_NAME = @PROJECT_NAME_CAPITALIZED@
PROJECT_NUMBER = @VERSION_STRING@
PROJECT_LOGO = @CMAKE_CURRENT_SOURCE_DIR@/misc/minetest.svg
STRIP_FROM_PATH = @CMAKE_CURRENT_SOURCE_DIR@/src
# Parsing
JAVADOC_AUTOBRIEF = YES
EXTRACT_ALL = YES
EXTRACT_PRIVATE = YES
EXTRACT_STATIC = YES
SORT_MEMBERS_CTORS_1ST = YES
WARN_IF_UNDOCUMENTED = NO
BUILTIN_STL_SUPPORT = YES
PREDEFINED = "USE_SPATIAL=1" \
"USE_LEVELDB=1" \
"USE_REDIS=1" \
"USE_SOUND=1" \
"USE_CURL=1" \
"USE_FREETYPE=1" \
"USE_GETTEXT=1"
INPUT = @CMAKE_CURRENT_SOURCE_DIR@/src/ \
# Input
RECURSIVE = NO
STRIP_FROM_PATH = @CMAKE_CURRENT_SOURCE_DIR@/src
INPUT = @CMAKE_CURRENT_SOURCE_DIR@/doc/main_page.dox \
@CMAKE_CURRENT_SOURCE_DIR@/src/ \
@CMAKE_CURRENT_SOURCE_DIR@/src/client \
@CMAKE_CURRENT_SOURCE_DIR@/src/network \
@CMAKE_CURRENT_SOURCE_DIR@/src/util \
@CMAKE_CURRENT_SOURCE_DIR@/src/script \
@CMAKE_CURRENT_SOURCE_DIR@/src/script/common \
@CMAKE_CURRENT_SOURCE_DIR@/src/script/cpp_api \
@CMAKE_CURRENT_SOURCE_DIR@/src/script/lua_api
RECURSIVE = NO
REFERENCED_BY_RELATION = YES
REFERENCES_RELATION = YES
GENERATE_LATEX = NO
PAPER_TYPE = a4wide
@CMAKE_CURRENT_SOURCE_DIR@/src/script/lua_api \
@CMAKE_CURRENT_SOURCE_DIR@/src/threading
# Dot graphs
HAVE_DOT = @DOXYGEN_DOT_FOUND@
CALL_GRAPH = YES
CALLER_GRAPH = YES
MAX_DOT_GRAPH_DEPTH = 3
DOT_MULTI_TARGETS = YES
DOT_IMAGE_FORMAT = svg
# Output
GENERATE_LATEX = NO
REFERENCED_BY_RELATION = YES
REFERENCES_RELATION = YES
SEARCHENGINE = YES
DISABLE_INDEX = YES
GENERATE_TREEVIEW = YES
HTML_DYNAMIC_SECTIONS = YES
HTML_TIMESTAMP = YES

View File

@ -264,15 +264,15 @@ Example:
default_cobble.png^[crack:10:1
#### `[combine:<w>x<h>:<x1>,<y1>=<file1>:<x2>,<y2>=<file2>`
#### `[combine:<w>x<h>:<x1>,<y1>=<file1>:<x2>,<y2>=<file2>:...`
* `<w>` = width
* `<h>` = height
* `<x1>`/`<x2>` = x positions
* `<y1>`/`<y1>` = y positions
* `<file1>`/`<file2>` = textures to combine
* `<x>` = x position
* `<y>` = y position
* `<file>` = texture to combine
Create a texture of size `<w>` times `<h>` and blit `<file1>` to (`<x1>`,`<y1>`)
and blit `<file2>` to (`<x2>`,`<y2>`).
Creates a texture of size `<w>` times `<h>` and blits the listed files to their
specified coordinates.
Example:
@ -1616,7 +1616,7 @@ examples.
* types: `text`, `image`, `color`, `indent`, `tree`
* `text`: show cell contents as text
* `image`: cell contents are an image index, use column options to define images
* `colo`: cell contents are a ColorString and define color of following cell
* `color`: cell contents are a ColorString and define color of following cell
* `indent`: cell contents are a number and define indentation of following cell
* `tree`: same as indent, but user can open and close subtrees (treeview-like)
* column options:
@ -1715,8 +1715,9 @@ Helper functions
* e.g. `string:split("a,b", ",") == {"a","b"}`
* `string:trim()`
* e.g. `string.trim("\n \t\tfoo bar\t ") == "foo bar"`
* `minetest.pos_to_string({x=X,y=Y,z=Z})`: returns `"(X,Y,Z)"`
* `minetest.pos_to_string({x=X,y=Y,z=Z}, decimal_places))`: returns `"(X,Y,Z)"`
* Convert position to a printable string
Optional: 'decimal_places' will round the x, y and z of the pos to the given decimal place.
* `minetest.string_to_pos(string)`: returns a position
* Same but in reverse. Returns `nil` if the string can't be parsed to a position.
* `minetest.string_to_area("(X1, Y1, Z1) (X2, Y2, Z2)")`: returns two positions
@ -1726,7 +1727,7 @@ Helper functions
* `minetest.is_yes(arg)`
* returns whether `arg` can be interpreted as yes
* `minetest.get_us_time()`
* returns time with microsecond precision
* returns time with microsecond precision. May not return wall time.
* `table.copy(table)`: returns a table
* returns a deep copy of `table`
@ -1958,9 +1959,11 @@ and `minetest.auth_reload` call the authetification handler.
* `minetest.remove_node(pos)`
* Equivalent to `set_node(pos, "air")`
* `minetest.get_node(pos)`
* Returns `{name="ignore", ...}` for unloaded area
* Returns the node at the given position as table in the format
`{name="node_name", param1=0, param2=0}`, returns `{name="ignore", param1=0, param2=0}`
for unloaded areas.
* `minetest.get_node_or_nil(pos)`
* Returns `nil` for unloaded area
* Same as `get_node` but returns `nil` for unloaded areas.
* `minetest.get_node_light(pos, timeofday)`
* Gets the light value at the given position. Note that the light value
"inside" the node at the given position is returned, so you usually want
@ -2239,7 +2242,7 @@ These functions return the leftover itemstack.
### Timing
* `minetest.after(time, func, ...)`
* Call the function `func` after `time` seconds
* Call the function `func` after `time` seconds, may be fractional
* Optional: Variable number of arguments that are passed to `func`
### Server
@ -2459,6 +2462,8 @@ These functions return the leftover itemstack.
* Map of Lua entities, indexed by active object id
* `minetest.registered_ores`
* List of registered ore definitions.
* `minetest.registered_biomes`
* List of registered biome definitions.
* `minetest.registered_decorations`
* List of registered decoration definitions.
@ -2636,8 +2641,6 @@ This is basically a reference to a C++ `ServerActiveObject`
* `"regular"`: Uses 0 textures, `bgcolor` ignored
* `"skybox"`: Uses 6 textures, `bgcolor` used
* `"plain"`: Uses 0 textures, `bgcolor` used
* **Note**: currently does not work directly in `on_joinplayer`; use
`minetest.after(0)` in there.
* `get_sky()`: returns bgcolor, type and a table with the textures
* `override_day_night_ratio(ratio or nil)`
* `0`...`1`: Overrides day-night ratio, controlling sunlight to a specific amount
@ -3238,6 +3241,7 @@ Definition tables
backface_culling = true, -- false to disable backface_culling for model
nametag = "", -- by default empty, for players their name is shown if empty
nametag_color = <color>, -- sets color of nametag as ColorSpec
infotext = "", -- by default empty, text to be shown when pointed at object
}
### Entity definition (`register_entity`)
@ -3354,7 +3358,7 @@ Definition tables
* `{name="image.png", animation={Tile Animation definition}}`
* `{name="image.png", backface_culling=bool, tileable_vertical=bool,
tileable_horizontal=bool}`
* backface culling only supported in special tiles.
* backface culling enabled by default for most nodes
* tileable flags are info for shaders, how they should treat texture
when displacement mapping is used
Directions are from the point of view of the tile texture,
@ -3396,6 +3400,7 @@ Definition tables
diggable = true, -- If false, can never be dug
climbable = false, -- If true, can be climbed on (ladder)
buildable_to = false, -- If true, placed nodes can replace this node
floodable = false, -- If true, liquids flow into and replace this node
liquidtype = "none", -- "none"/"source"/"flowing"
liquid_alternative_flowing = "", -- Flowing version of source liquid
liquid_alternative_source = "", -- Source version of flowing liquid

8
doc/main_page.dox Normal file
View File

@ -0,0 +1,8 @@
/** @mainpage The Minetest engine internal documentation
Welcome to the Minetest engine Doxygen documentation site!\n
This page documents the internal structure of the Minetest engine's C++ code.\n
Use the tree view at the left to navigate.
*/

View File

@ -28,8 +28,9 @@
</ul>
</description>
<screenshots>
<screenshot type="default" width="1440" height="851">http://minetest.net/_media/screen2.png</screenshot>
<screenshot width="1440" height="851">http://minetest.net/_media/screenshot_4032289578.png</screenshot>
<screenshot type="default" width="1920" height="1080">http://www.minetest.net/media/gallery/1.jpg</screenshot>
<screenshot width="1920" height="1080">http://www.minetest.net/media/gallery/3.jpg</screenshot>
<screenshot width="1920" height="1080">http://www.minetest.net/media/gallery/5.jpg</screenshot>
</screenshots>
<url type="homepage">http://MultiCraft.mobi</url>
<updatecontact>MoNTE48@mal.ua</updatecontact>

View File

@ -518,7 +518,8 @@
# - interlaced: odd/even line based polarisation screen support.
# - topbottom: split screen top/bottom.
# - sidebyside: split screen side by side.
# type: enum values: none, anaglyph, interlaced, topbottom, sidebyside
# - pageflip: quadbuffer based 3d.
# type: enum values: none, anaglyph, interlaced, topbottom, sidebyside, pageflip
# 3d_mode = none
# In-game chat console background color (R,G,B).
@ -1186,8 +1187,8 @@
# Occasional lakes and hills added to the flat world.
# Flags that are not specified in the flag string are not modified from the default.
# Flags starting with "no" are used to explicitly disable them.
# type: flags possible values: lakes, hills, nolakes, nohills
# mgflat_spflags = nolakes,nohills
# type: flags possible values: lakes, hills, , nolakes, nohills
# mgflat_spflags =
# Y of flat ground.
# type: int
@ -1312,6 +1313,47 @@
# type: noise_params
# mgfractal_np_cave2 = 0, 12, (128, 128, 128), 10325, 4, 0.5, 2.0
#### Mapgen Valleys
#mg_valleys_spflags = altitude_chill,cliffs,humid_rivers,nofast,rugged
# "altitude_chill" makes higher elevations colder, which may cause biome issues.
# "fast" produces softer terrain, more quickly
# "humid_rivers" modifies the humidity around rivers and in areas where water would tend to pool. It may interfere with delicately adjusted biomes.
# "rugged" and "cliffs" do nothing unless "fast" is enabled
#
#mg_valleys_altitude_chill = 90 # the altitude at which temperature drops by 20C
#mg_valleys_cave_water_max_height = 31000 # max altitude of water in caves
#mg_valleys_humidity = 50 # the average humidity
#mg_valleys_humidity_break_point = 65 # The highest humidity around rivers in otherwise dry areas
#mg_valleys_lava_max_height = 0 # maximum altitude of lava
#mg_valleys_river_depth = 4 # how deep to make rivers
#mg_valleys_river_size = 5 # how wide to make rivers
#mg_valleys_temperature = 50 # the average temperature
#mg_valleys_water_features = 3 # how often water occurs in caves (0-10)
#
#mg_valleys_np_cliffs = 0, 1, (750, 750, 750), 8445, 5, 1.0, 2.0
#mg_valleys_np_corr = 0, 1, (40, 40, 40), -3536, 4, 1.0, 2.0
#mg_valleys_np_filler_depth = 0, 1.2, (256, 256, 256), 1605, 3, 0.5, 2.0
#
# River noise -- rivers occur close to zero
#mg_valleys_np_rivers = 0, 1, (256, 256, 256), -6050, 5, 0.6, 2.0
#
#mg_valleys_np_simple_caves_1 = 0, 1, v3f(64, 64, 64), -8402, 3, 0.5, 2.0
#mg_valleys_np_simple_caves_2 = 0, 1, v3f(64, 64, 64), 3944, 3, 0.5, 2.0
#
# Base terrain height
#mg_valleys_np_terrain_height = -10, 50, (1024, 1024, 1024), 5202, 6, 0.4, 2.0
#
# Raises terrain to make valleys around the rivers
#mg_valleys_np_valley_depth = 5, 4, (512, 512, 512), -1914, 1, 1.0, 2.0
#
# Slope and fill work together to modify the heights
#mg_valleys_np_inter_valley_fill = 0, 1, (256, 512, 256), 1993, 6, 0.8, 2.0
#mg_valleys_np_inter_valley_slope = 0.5, 0.5, (128, 128, 128), 746, 1, 1.0, 2.0
#
# Amplifies the valleys
#mg_valleys_np_valley_profile = 0.6, 0.5, (512, 512, 512), 777, 1, 1.0, 2.0
## Security
# Prevent mods from doing insecure things like running shell commands.

View File

@ -8,69 +8,70 @@ msgstr ""
"Project-Id-Version: 0.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-11-08 21:23+0100\n"
"PO-Revision-Date: 2013-02-17 00:41+0200\n"
"Last-Translator: Rune Biskopstö Christensen <lakersforce@gmail.com>\n"
"Language-Team: \n"
"PO-Revision-Date: 2016-01-13 09:23+0000\n"
"Last-Translator: Peter Mikkelsen <petermikkelsen10@gmail.com>\n"
"Language-Team: Danish "
"<https://hosted.weblate.org/projects/minetest/minetest/da/>\n"
"Language: da\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Weblate 1.4-dev\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 2.5-dev\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
msgstr ""
msgstr "Der skete en fejt i Lua scriptet, så som et mod:"
#: builtin/fstk/ui.lua
msgid "An error occured:"
msgstr ""
msgstr "Der skete en fejl:"
#: builtin/fstk/ui.lua
#, fuzzy
msgid "Main menu"
msgstr "Hovedmenu"
#: builtin/fstk/ui.lua builtin/mainmenu/store.lua
msgid "Ok"
msgstr ""
msgstr "Ok"
#: builtin/fstk/ui.lua
#, fuzzy
msgid "Reconnect"
msgstr "Forbind"
msgstr "Forbind igen"
#: builtin/fstk/ui.lua
msgid "The server has requested a reconnect:"
msgstr ""
msgstr "Serveren har anmodet om at forbinde igen:"
#: builtin/mainmenu/common.lua src/game.cpp
msgid "Loading..."
msgstr ""
msgstr "Indlæser..."
#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
msgstr ""
msgstr "Protokol versionerne matchede ikke. "
#: builtin/mainmenu/common.lua
msgid "Server enforces protocol version $1. "
msgstr ""
msgstr "Serveren kræver protokol version $1. "
#: builtin/mainmenu/common.lua
msgid "Server supports protocol versions between $1 and $2. "
msgstr ""
msgstr "Serveren understøtter protokol versioner mellem $1 og $2. "
#: builtin/mainmenu/common.lua
msgid "Try reenabling public serverlist and check your internet connection."
msgstr ""
"Prøv at slå den offentlige serverliste fra og til, og tjek din internet "
"forbindelse."
#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
msgstr ""
msgstr "Vi understøtter kun protokol version $1."
#: builtin/mainmenu/common.lua
msgid "We support protocol versions between version $1 and $2."
msgstr ""
msgstr "Vi understøtter protokol versioner mellem $1 og $2."
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_rename_modpack.lua builtin/mainmenu/tab_settings.lua
@ -79,22 +80,18 @@ msgid "Cancel"
msgstr "Anuller"
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua
#, fuzzy
msgid "Depends:"
msgstr "afhænger af:"
msgstr "Afhænger af:"
#: builtin/mainmenu/dlg_config_world.lua
#, fuzzy
msgid "Disable MP"
msgstr "Deaktivér alle"
msgstr "Deaktivér MP"
#: builtin/mainmenu/dlg_config_world.lua
#, fuzzy
msgid "Enable MP"
msgstr "Aktivér alle"
msgstr "Aktivér MP"
#: builtin/mainmenu/dlg_config_world.lua
#, fuzzy
msgid "Enable all"
msgstr "Aktivér alle"
@ -103,19 +100,20 @@ msgid ""
"Failed to enable mod \"$1\" as it contains disallowed characters. Only "
"chararacters [a-z0-9_] are allowed."
msgstr ""
"Kunne ikke slå mod \"$1\" til, da den indeholder ugyldige tegn. Kun tegnene "
"[a-z0-9_] er tilladte."
#: builtin/mainmenu/dlg_config_world.lua
#, fuzzy
msgid "Hide Game"
msgstr "Spil"
msgstr "Skjul spil"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Hide mp content"
msgstr ""
msgstr "Skjul mp indhold"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Mod:"
msgstr ""
msgstr "Mod:"
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_settings.lua
#: src/guiKeyChangeMenu.cpp
@ -123,18 +121,16 @@ msgid "Save"
msgstr "Gem"
#: builtin/mainmenu/dlg_config_world.lua
#, fuzzy
msgid "World:"
msgstr "Vælg verden:"
msgstr "Verden:"
#: builtin/mainmenu/dlg_config_world.lua
msgid "enabled"
msgstr "aktiveret"
#: builtin/mainmenu/dlg_create_world.lua
#, fuzzy
msgid "A world named \"$1\" already exists"
msgstr "Kan ikke skabe verden: en verden med dette navn eksisterer allerede"
msgstr "En verden med navnet \"$1\" eksisterer allerede"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Create"
@ -142,11 +138,11 @@ msgstr "Skab"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download a subgame, such as minetest_game, from minetest.net"
msgstr ""
msgstr "Hent et subgame, så som minetest_game fra minetest.net"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download one from minetest.net"
msgstr ""
msgstr "Hent en fra minetest.net"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Game"
@ -154,7 +150,7 @@ msgstr "Spil"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Mapgen"
msgstr ""
msgstr "Mapgen"
#: builtin/mainmenu/dlg_create_world.lua
msgid "No worldname given or no game selected"
@ -166,7 +162,7 @@ msgstr ""
#: builtin/mainmenu/dlg_create_world.lua
msgid "Warning: The minimal development test is meant for developers."
msgstr ""
msgstr "Advarsel: Den minimale udvikings test er kun lavet for udviklerne."
#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
@ -174,32 +170,31 @@ msgstr "Verdens navn"
#: builtin/mainmenu/dlg_create_world.lua
msgid "You have no subgames installed."
msgstr ""
msgstr "Du har ikke installeret nogle subgames."
#: builtin/mainmenu/dlg_delete_mod.lua
msgid "Are you sure you want to delete \"$1\"?"
msgstr ""
msgstr "Er du sikker på du vil slette \"$1\"?"
#: builtin/mainmenu/dlg_delete_mod.lua
msgid "Modmgr: failed to delete \"$1\""
msgstr ""
msgstr "Modmgr: Kunne ikke slette \"$1\""
#: builtin/mainmenu/dlg_delete_mod.lua
msgid "Modmgr: invalid modpath \"$1\""
msgstr ""
msgstr "Modmgr: ugyldig mod-sti \"$1\""
#: builtin/mainmenu/dlg_delete_mod.lua
msgid "No of course not!"
msgstr ""
msgstr "Nej selvfølgelig ikke!"
#: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
msgid "Yes"
msgstr "Ja"
#: builtin/mainmenu/dlg_delete_world.lua
#, fuzzy
msgid "Delete World \"$1\"?"
msgstr "Slet verden"
msgstr "Slet verden \"$1\"?"
#: builtin/mainmenu/dlg_delete_world.lua
msgid "No"
@ -211,79 +206,80 @@ msgstr "Accepter"
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Rename Modpack:"
msgstr ""
msgstr "Omdøb Modpack:"
#: builtin/mainmenu/modmgr.lua
msgid ""
"\n"
"Install Mod: unsupported filetype \"$1\" or broken archive"
msgstr ""
"\n"
"Installer Mod: filtypen \"$1\" er enten ikke understøttet, ellers er arkivet "
"korrupt"
#: builtin/mainmenu/modmgr.lua
#, fuzzy
msgid "Failed to install $1 to $2"
msgstr "Mislykkedes i at initialisere verden"
msgstr "Kunne ikke installere $1 til $2"
#: builtin/mainmenu/modmgr.lua
msgid "Install Mod: file: \"$1\""
msgstr ""
msgstr "Installer Mod: Fil: \"$1\""
#: builtin/mainmenu/modmgr.lua
msgid "Install Mod: unable to find real modname for: $1"
msgstr ""
msgstr "Installer Mod: kunne ikke finde det rigtige mod navn for: $1"
#: builtin/mainmenu/modmgr.lua
msgid "Install Mod: unable to find suitable foldername for modpack $1"
msgstr ""
msgstr "Installer Mod: kunne ikke finde passende mappe navn for modpack $1"
#: builtin/mainmenu/store.lua
msgid "Close store"
msgstr ""
msgstr "Luk marked"
#: builtin/mainmenu/store.lua
msgid "Downloading $1, please wait..."
msgstr ""
msgstr "Henter $1, vent venligst..."
#: builtin/mainmenu/store.lua
msgid "Install"
msgstr ""
msgstr "Installer"
#: builtin/mainmenu/store.lua
msgid "Page $1 of $2"
msgstr ""
msgstr "Side $1 af $2"
#: builtin/mainmenu/store.lua
msgid "Rating"
msgstr ""
msgstr "Bedømmelse"
#: builtin/mainmenu/store.lua
msgid "Search"
msgstr ""
msgstr "Søg"
#: builtin/mainmenu/store.lua
#, fuzzy
msgid "Shortname:"
msgstr "Verdens navn"
msgstr "Kort navn:"
#: builtin/mainmenu/store.lua
msgid "Successfully installed:"
msgstr ""
msgstr "Succesfuldt installeret:"
#: builtin/mainmenu/store.lua
msgid "Unsorted"
msgstr ""
msgstr "Usorteret"
#: builtin/mainmenu/store.lua
msgid "re-Install"
msgstr ""
msgstr "geninstaller"
#: builtin/mainmenu/tab_credits.lua
msgid "Active Contributors"
msgstr ""
msgstr "Aktive bidragere"
#: builtin/mainmenu/tab_credits.lua
msgid "Core Developers"
msgstr ""
msgstr "Hoved udviklere"
#: builtin/mainmenu/tab_credits.lua
msgid "Credits"
@ -291,67 +287,63 @@ msgstr "Skabt af"
#: builtin/mainmenu/tab_credits.lua
msgid "Previous Contributors"
msgstr ""
msgstr "Tidligere bidragere"
#: builtin/mainmenu/tab_credits.lua
msgid "Previous Core Developers"
msgstr ""
msgstr "Tidligere hoved udviklere"
#: builtin/mainmenu/tab_mods.lua
msgid "Installed Mods:"
msgstr ""
msgstr "Installerede mods:"
#: builtin/mainmenu/tab_mods.lua
msgid "Mod information:"
msgstr ""
msgstr "Information om mod:"
#: builtin/mainmenu/tab_mods.lua builtin/mainmenu/tab_settings.lua
msgid "Mods"
msgstr ""
msgstr "Mods"
#: builtin/mainmenu/tab_mods.lua
msgid "No mod description available"
msgstr ""
msgstr "Der er ikke nogen beskrivelse af tilgængelig af det valgte mod"
#: builtin/mainmenu/tab_mods.lua
msgid "Rename"
msgstr ""
msgstr "Omdøb"
#: builtin/mainmenu/tab_mods.lua
#, fuzzy
msgid "Select Mod File:"
msgstr "Vælg verden:"
msgstr "Vælg mod fil:"
#: builtin/mainmenu/tab_mods.lua
msgid "Uninstall selected mod"
msgstr ""
msgstr "Afinstaller det valgte mod"
#: builtin/mainmenu/tab_mods.lua
msgid "Uninstall selected modpack"
msgstr ""
msgstr "Afinstaller den valgte modpack"
#: builtin/mainmenu/tab_multiplayer.lua
#, fuzzy
msgid "Address / Port :"
msgstr "Adresse/port"
msgstr "Adresse/port:"
#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
msgid "Client"
msgstr ""
msgstr "Klient"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "Connect"
msgstr "Forbind"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
#, fuzzy
msgid "Creative mode"
msgstr "Kreativ tilstand"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
#, fuzzy
msgid "Damage enabled"
msgstr "aktiveret"
msgstr "Skade aktiveret"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_server.lua
#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp
@ -359,18 +351,16 @@ msgid "Delete"
msgstr "Slet"
#: builtin/mainmenu/tab_multiplayer.lua
#, fuzzy
msgid "Name / Password :"
msgstr "Navn/kodeord"
msgstr "Navn/kodeord:"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "Public Serverlist"
msgstr ""
msgstr "Offentlig serverliste"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
#, fuzzy
msgid "PvP enabled"
msgstr "aktiveret"
msgstr "Spiller mod spiller aktiveret"
#: builtin/mainmenu/tab_server.lua
msgid "Bind Address"
@ -407,9 +397,8 @@ msgid "Port"
msgstr ""
#: builtin/mainmenu/tab_server.lua
#, fuzzy
msgid "Public"
msgstr "Vis offentlig"
msgstr "Offentlig"
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
msgid "Select World:"
@ -417,24 +406,23 @@ msgstr "Vælg verden:"
#: builtin/mainmenu/tab_server.lua
msgid "Server"
msgstr ""
msgstr "Server"
#: builtin/mainmenu/tab_server.lua
msgid "Server Port"
msgstr ""
msgstr "Server port"
#: builtin/mainmenu/tab_server.lua
#, fuzzy
msgid "Start Game"
msgstr "Start spil / Forbind"
#: builtin/mainmenu/tab_settings.lua
msgid "\"$1\" is not a valid flag."
msgstr ""
msgstr "\"$1\" er ikke en gyldig indstilling."
#: builtin/mainmenu/tab_settings.lua
msgid "(No description of setting given)"
msgstr ""
msgstr "(Der er ikke nogen beskrivelse af denne indstilling)"
#: builtin/mainmenu/tab_settings.lua
msgid "Browse"
@ -445,22 +433,20 @@ msgid "Change keys"
msgstr "Skift bindinger"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Disabled"
msgstr "Deaktivér alle"
msgstr "Deaktiveret"
#: builtin/mainmenu/tab_settings.lua
msgid "Edit"
msgstr ""
msgstr "Rediger"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Enabled"
msgstr "aktiveret"
#: builtin/mainmenu/tab_settings.lua
msgid "Format is 3 numbers separated by commas and inside brackets."
msgstr ""
msgstr "Formatet er 3 tal, adskilt af kommaer, og omgivet af parenteser."
#: builtin/mainmenu/tab_settings.lua
msgid ""
@ -469,7 +455,6 @@ msgid ""
msgstr ""
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Games"
msgstr "Spil"
@ -479,28 +464,27 @@ msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Please enter a comma seperated list of flags."
msgstr ""
msgstr "Indtast venligst en liste af indstillinger som er adskilt med kommaer."
#: builtin/mainmenu/tab_settings.lua
msgid "Please enter a valid integer."
msgstr ""
msgstr "Indtast venligst et gyldigt heltal."
#: builtin/mainmenu/tab_settings.lua
msgid "Please enter a valid number."
msgstr ""
msgstr "Indtast venligt et gyldigt nummer."
#: builtin/mainmenu/tab_settings.lua
msgid "Possible values are: "
msgstr ""
msgstr "Mulige værdier er: "
#: builtin/mainmenu/tab_settings.lua
msgid "Restore Default"
msgstr ""
msgstr "Gendan standard"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Select path"
msgstr "Vælg"
msgstr "Vælg sti"
#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
@ -508,71 +492,70 @@ msgstr "Indstillinger"
#: builtin/mainmenu/tab_settings.lua
msgid "Show technical names"
msgstr ""
msgstr "Vis tekniske navne"
#: builtin/mainmenu/tab_settings.lua
msgid "The value must be greater than $1."
msgstr ""
msgstr "Værdien skal være større end $1."
#: builtin/mainmenu/tab_settings.lua
msgid "The value must be lower than $1."
msgstr ""
msgstr "Værdien skal være mindre end $1."
#: builtin/mainmenu/tab_simple_main.lua
#, fuzzy
msgid "Config mods"
msgstr "Konfigurér"
msgstr "Konfigurér mods"
#: builtin/mainmenu/tab_simple_main.lua
#, fuzzy
msgid "Main"
msgstr "Hovedmenu"
#: builtin/mainmenu/tab_simple_main.lua
#, fuzzy
msgid "Start Singleplayer"
msgstr "Enligspiller"
msgstr "Enlig spiller"
#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp
msgid "Play"
msgstr "Afspil"
msgstr "Spil"
#: builtin/mainmenu/tab_singleplayer.lua
msgid "Singleplayer"
msgstr "Enligspiller"
msgstr "Enlig spiller"
#: builtin/mainmenu/tab_texturepacks.lua
msgid "No information available"
msgstr ""
msgstr "Der er ikke nogen information tilgængelig"
#: builtin/mainmenu/tab_texturepacks.lua
#, fuzzy
msgid "None"
msgstr ""
msgstr "Ingen"
#: builtin/mainmenu/tab_texturepacks.lua
#, fuzzy
msgid "Select texture pack:"
msgstr ""
#: builtin/mainmenu/tab_texturepacks.lua
#, fuzzy
msgid "Texturepacks"
msgstr ""
#: src/client.cpp
#, fuzzy
msgid "Connection timed out."
msgstr "Forbindelses fejl (udløbelse af tidsfrist?)"
msgstr "Forbindelses fejl (tidsfristen udløb)."
#: src/client.cpp
msgid "Done!"
msgstr ""
msgstr "Færdig!"
#: src/client.cpp
msgid "Initializing nodes"
msgstr ""
msgstr "Initialiserer noder"
#: src/client.cpp
msgid "Initializing nodes..."
msgstr ""
msgstr "Initialiserer noder..."
#: src/client.cpp
msgid "Item textures..."
@ -604,11 +587,11 @@ msgstr "Hovedmenu"
#: src/client/clientlauncher.cpp
msgid "No world selected and no address provided. Nothing to do."
msgstr "Ingen verden valgt og ingen adresse angivet. Ingen opgave at lave."
msgstr "Ingen verden valgt og ingen adresse angivet. Der er ikke noget at gøre."
#: src/client/clientlauncher.cpp
msgid "Player name too long."
msgstr ""
msgstr "Spillerens navn er for langt."
#: src/client/clientlauncher.cpp
msgid "Provided world path doesn't exist: "
@ -627,9 +610,8 @@ msgstr ""
"Tjek debug.txt for detaljer."
#: src/game.cpp
#, fuzzy
msgid "Change Keys"
msgstr "Skift bindinger"
msgstr "Skift tastatur-bindinger"
#: src/game.cpp
msgid "Change Password"
@ -637,7 +619,7 @@ msgstr "Skift kodeord"
#: src/game.cpp
msgid "Connecting to server..."
msgstr ""
msgstr "Forbinder til server..."
#: src/game.cpp
msgid "Continue"
@ -700,7 +682,7 @@ msgstr ""
#: src/game.cpp
msgid "Media..."
msgstr ""
msgstr "Medier..."
#: src/game.cpp
msgid "MiB/s"
@ -724,11 +706,11 @@ msgstr "Genopstå"
#: src/game.cpp
msgid "Shutting down..."
msgstr ""
msgstr "Lukker ned..."
#: src/game.cpp
msgid "Sound Volume"
msgstr ""
msgstr "Lydniveau"
#: src/game.cpp
msgid "You died."
@ -740,7 +722,7 @@ msgstr ""
#: src/guiFormSpecMenu.cpp
msgid "ok"
msgstr ""
msgstr "ok"
#: src/guiKeyChangeMenu.cpp
msgid "\"Use\" = climb down"
@ -1358,9 +1340,8 @@ msgid "Cloud radius"
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Clouds"
msgstr "3D skyer"
msgstr "Skyer"
#: src/settings_translation_file.cpp
msgid "Clouds are a client side effect."

View File

@ -8,16 +8,16 @@ msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-11-08 21:23+0100\n"
"PO-Revision-Date: 2015-09-21 14:55+0200\n"
"Last-Translator: way-hu <gabor.w.varnagy@gmail.com>\n"
"Language-Team: Hungarian <https://hosted.weblate.org/projects/minetest/"
"minetest/hu/>\n"
"PO-Revision-Date: 2016-01-25 00:59+0000\n"
"Last-Translator: Kisbenedek Márton <martonkisbenedek@gmail.com>\n"
"Language-Team: Hungarian "
"<https://hosted.weblate.org/projects/minetest/minetest/hu/>\n"
"Language: hu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 2.4\n"
"X-Generator: Weblate 2.5-dev\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
@ -48,9 +48,8 @@ msgid "Loading..."
msgstr "Betöltés..."
#: builtin/mainmenu/common.lua
#, fuzzy
msgid "Protocol version mismatch. "
msgstr "Protokol verzió eltérés, szerver "
msgstr "Protokoll verzió eltérés. "
#: builtin/mainmenu/common.lua
msgid "Server enforces protocol version $1. "
@ -58,7 +57,7 @@ msgstr ""
#: builtin/mainmenu/common.lua
msgid "Server supports protocol versions between $1 and $2. "
msgstr ""
msgstr "A szerver $1 és $2 protokoll verzió közötti verziókat támogat. "
#: builtin/mainmenu/common.lua
msgid "Try reenabling public serverlist and check your internet connection."
@ -68,11 +67,11 @@ msgstr ""
#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
msgstr ""
msgstr "Csak $1 protokoll verziót támogatjuk."
#: builtin/mainmenu/common.lua
msgid "We support protocol versions between version $1 and $2."
msgstr ""
msgstr "$1 és $2 közötti protokoll verziókat támogatunk."
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_rename_modpack.lua builtin/mainmenu/tab_settings.lua
@ -82,7 +81,7 @@ msgstr "Mégse"
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua
msgid "Depends:"
msgstr "Függőségek:"
msgstr "Függ:"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Disable MP"
@ -94,7 +93,7 @@ msgstr "Csomag engedélyez"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Enable all"
msgstr "Összes engedélyezése"
msgstr "Mind engedélyez"
#: builtin/mainmenu/dlg_config_world.lua
msgid ""
@ -106,11 +105,11 @@ msgstr ""
#: builtin/mainmenu/dlg_config_world.lua
msgid "Hide Game"
msgstr "Játék elrejtése"
msgstr "Játék elrejtés"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Hide mp content"
msgstr "Modpakk tartalom elrejtése"
msgstr "Modpakk tartalom elrejtés"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Mod:"
@ -135,7 +134,7 @@ msgstr "\"$1\" nevű világ már létezik"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Create"
msgstr "Létrehozás"
msgstr "Létrehoz"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download a subgame, such as minetest_game, from minetest.net"
@ -208,7 +207,7 @@ msgstr "Elfogad"
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Rename Modpack:"
msgstr "Modpakk átnevezése:"
msgstr "Modpakk átnevezés:"
#: builtin/mainmenu/modmgr.lua
msgid ""
@ -370,7 +369,7 @@ msgstr "Bind Address"
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
msgid "Configure"
msgstr "Beállítás"
msgstr "Beállít"
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua
#: builtin/mainmenu/tab_singleplayer.lua
@ -428,20 +427,19 @@ msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Browse"
msgstr ""
msgstr "Keres"
#: builtin/mainmenu/tab_settings.lua
msgid "Change keys"
msgstr "Gombok változtatása"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Disabled"
msgstr "Csomag letiltás"
msgstr "Letiltva"
#: builtin/mainmenu/tab_settings.lua
msgid "Edit"
msgstr ""
msgstr "Szerkeszt"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
@ -450,7 +448,7 @@ msgstr "Engedélyez"
#: builtin/mainmenu/tab_settings.lua
msgid "Format is 3 numbers separated by commas and inside brackets."
msgstr ""
msgstr "A formátum 3 szám vesszőkkel elválasztva zárójelek között."
#: builtin/mainmenu/tab_settings.lua
msgid ""
@ -459,9 +457,8 @@ msgid ""
msgstr ""
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Games"
msgstr "Játék"
msgstr "Játékok"
#: builtin/mainmenu/tab_settings.lua
msgid "Optionally the lacunarity can be appended with a leading comma."
@ -473,24 +470,23 @@ msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Please enter a valid integer."
msgstr ""
msgstr "Írj be egy érvényes egész számot."
#: builtin/mainmenu/tab_settings.lua
msgid "Please enter a valid number."
msgstr ""
msgstr "Írj be egy érvényes számot."
#: builtin/mainmenu/tab_settings.lua
msgid "Possible values are: "
msgstr ""
msgstr "Lehetséges értékek: "
#: builtin/mainmenu/tab_settings.lua
msgid "Restore Default"
msgstr ""
msgstr "Alapértelmezett visszaállítás"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Select path"
msgstr "Kiválaszt"
msgstr "Útvonal kiválasztás"
#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
@ -498,15 +494,15 @@ msgstr "Beállítások"
#: builtin/mainmenu/tab_settings.lua
msgid "Show technical names"
msgstr ""
msgstr "Technikai nevek mutatása"
#: builtin/mainmenu/tab_settings.lua
msgid "The value must be greater than $1."
msgstr ""
msgstr "Az értéknek nagyobbnak kell lennie ennél: $1."
#: builtin/mainmenu/tab_settings.lua
msgid "The value must be lower than $1."
msgstr ""
msgstr "Az értéknek kisebbnek kell lennie ennél: $1."
#: builtin/mainmenu/tab_simple_main.lua
msgid "Config mods"
@ -526,7 +522,7 @@ msgstr "Játék"
#: builtin/mainmenu/tab_singleplayer.lua
msgid "Singleplayer"
msgstr "Egyjátékos mód"
msgstr "Egyjátékos"
#: builtin/mainmenu/tab_texturepacks.lua
msgid "No information available"
@ -538,7 +534,7 @@ msgstr "Semmi"
#: builtin/mainmenu/tab_texturepacks.lua
msgid "Select texture pack:"
msgstr "Textúracsomag kiválasztása:"
msgstr "Textúrapakk kiválasztása:"
#: builtin/mainmenu/tab_texturepacks.lua
msgid "Texturepacks"
@ -655,13 +651,13 @@ msgstr ""
"Alapértelmezett irányítás:\n"
"- WASD: Mozgás\n"
"- Space: Ugrás/Mászás\n"
"- Shift: Lopakodás/Lefele menés\n"
"- Shift: Lopakodás/Lefelé\n"
"- Q: Tárgyak eldobása\n"
"- I: Invertory\n"
"- I: Eszköztár\n"
"- Egér: Forgás/Nézelődés\n"
"- Egér Bal-gomb: Ásás/Ütés\n"
"- Egér jobb-gomb: Helyezés/Használat\n"
"- Egér görgő: Tárgyak kiválasztása\n"
"- Bal-egér: Ásás/Ütés\n"
"- Jobb-egér: Helyez/Használ\n"
"- Egér görgő: Tárgy kiválaszt\n"
"- T: Beszélgetés\n"
#: src/game.cpp
@ -684,7 +680,7 @@ msgstr ""
"- egy érintés: gomb aktiválás\n"
"- dupla érintés: helyez/használat\n"
"- ujj csúsztatás: körbenéz\n"
"Menü/Inventory látható:\n"
"Menü/Eszköztár látható:\n"
"- dupla érintés (külső):\n"
" -->bezár\n"
"- stack, vagy slot érintése:\n"
@ -698,7 +694,7 @@ msgstr "Kilépés a menübe"
#: src/game.cpp
msgid "Exit to OS"
msgstr "Kilépés az OP-rendszerbe"
msgstr "Bezárás"
#: src/game.cpp
msgid "Item definitions..."
@ -785,9 +781,8 @@ msgid "Forward"
msgstr "Előre"
#: src/guiKeyChangeMenu.cpp
#, fuzzy
msgid "Inventory"
msgstr "Inventory"
msgstr "Eszköztár"
#: src/guiKeyChangeMenu.cpp
msgid "Jump"
@ -800,7 +795,7 @@ msgstr "A gomb már használatban van"
#: src/guiKeyChangeMenu.cpp
msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
msgstr ""
"Gombkiosztás. (Ha elfuserálod ezt a menüt, távolíts el néhány cuccot a "
"Gombkiosztás. (Ha elfuserálod ezt a menüt, távolíts el néhány dolgot a "
"minetest.conf-ból)"
#: src/guiKeyChangeMenu.cpp src/keycode.cpp
@ -809,7 +804,7 @@ msgstr "Bal"
#: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Print stacks"
msgstr "Stacks nyomtatása"
msgstr "Halmok nyomtatása"
#: src/guiKeyChangeMenu.cpp
msgid "Range select"
@ -976,7 +971,7 @@ msgstr "Bal gomb"
#: src/keycode.cpp
msgid "Left Control"
msgstr "Bal Controll"
msgstr "Bal Control"
#: src/keycode.cpp
msgid "Left Menu"
@ -1020,59 +1015,59 @@ msgstr "Numlock"
#: src/keycode.cpp
msgid "Numpad *"
msgstr "Numerikus billentyű *"
msgstr "Numerikus bill. *"
#: src/keycode.cpp
msgid "Numpad +"
msgstr "Numerikus billentyű +"
msgstr "Numerikus bill. +"
#: src/keycode.cpp
msgid "Numpad -"
msgstr "Numerikus billentyű -"
msgstr "Numerikus bill. -"
#: src/keycode.cpp
msgid "Numpad /"
msgstr "Numerikus billentyű /"
msgstr "Numerikus bill. /"
#: src/keycode.cpp
msgid "Numpad 0"
msgstr "Numerikus billentyű 0"
msgstr "Numerikus bill. 0"
#: src/keycode.cpp
msgid "Numpad 1"
msgstr "Numerikus billentyű 1"
msgstr "Numerikus bill. 1"
#: src/keycode.cpp
msgid "Numpad 2"
msgstr "Numerikus billentyű 2"
msgstr "Numerikus bill. 2"
#: src/keycode.cpp
msgid "Numpad 3"
msgstr "Numerikus billentyű 3"
msgstr "Numerikus bill. 3"
#: src/keycode.cpp
msgid "Numpad 4"
msgstr "Numerikus billentyű 4"
msgstr "Numerikus bill. 4"
#: src/keycode.cpp
msgid "Numpad 5"
msgstr "Numerikus billentyű 5"
msgstr "Numerikus bill. 5"
#: src/keycode.cpp
msgid "Numpad 6"
msgstr "Numerikus billentyű 6"
msgstr "Numerikus bill. 6"
#: src/keycode.cpp
msgid "Numpad 7"
msgstr "Numerikus billentyű 7"
msgstr "Numerikus bill. 7"
#: src/keycode.cpp
msgid "Numpad 8"
msgstr "Numerikus billentyű 8"
msgstr "Numerikus bill. 8"
#: src/keycode.cpp
msgid "Numpad 9"
msgstr "Numerikus billentyű 9"
msgstr "Numerikus bill. 9"
#: src/keycode.cpp
#, fuzzy
@ -1174,10 +1169,13 @@ msgid "Zoom"
msgstr "Nagyítás"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"0 = parallax occlusion with slope information (faster).\n"
"1 = relief mapping (slower, more accurate)."
msgstr ""
"0 = parallax occlusion with slope information (gyorsabb).\n"
"1 = relief mapping (lassabb, pontosabb)."
#: src/settings_translation_file.cpp
#, fuzzy
@ -1186,9 +1184,10 @@ msgstr "3D felhők"
#: src/settings_translation_file.cpp
msgid "3D mode"
msgstr ""
msgstr "3D mód"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"3D support.\n"
"Currently supported:\n"
@ -1198,20 +1197,29 @@ msgid ""
"- topbottom: split screen top/bottom.\n"
"- sidebyside: split screen side by side."
msgstr ""
"3D támogatás.\n"
"Jelenleg támogatott:\n"
"- none: nincs 3d kimenet.\n"
"- anaglyph: cián/magenta színű 3d.\n"
"- interlaced: odd/even line based polarisation screen support.\n"
"- topbottom: split screen top/bottom.\n"
"- sidebyside: split screen side by side."
#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
msgstr ""
"Egy választott map seed az új térképhez, véletlenszerűhöz hagyd üresen.\n"
"Felül lesz írva új világ létrehozásánál a főmenüben."
#: src/settings_translation_file.cpp
msgid "A message to be displayed to all clients when the server crashes."
msgstr ""
msgstr "Az összes kliensen megjelenített üzenet a szerver összeomlásakor."
#: src/settings_translation_file.cpp
msgid "A message to be displayed to all clients when the server shuts down."
msgstr ""
msgstr "Az összes kliensen megjelenített üzenet a szerver leállításakor."
#: src/settings_translation_file.cpp
msgid "Absolute limit of emerge queues"
@ -1219,11 +1227,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Acceleration in air"
msgstr ""
msgstr "Gyorsulás levegőben"
#: src/settings_translation_file.cpp
msgid "Active block range"
msgstr ""
msgstr "Aktív blokk kiterjedési terület"
#: src/settings_translation_file.cpp
msgid "Active object send range"

View File

@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: Minetest 0.4.9\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-11-08 21:23+0100\n"
"PO-Revision-Date: 2015-12-21 22:09+0000\n"
"Last-Translator: Gianluca Luparini <gianlucalup@openmailbox.org>\n"
"PO-Revision-Date: 2016-01-24 15:00+0000\n"
"Last-Translator: Paolo DGZ <pikinor24@yahoo.it>\n"
"Language-Team: Italian "
"<https://hosted.weblate.org/projects/minetest/minetest/it/>\n"
"Language: it\n"
@ -42,7 +42,7 @@ msgstr "Riconnettersi"
#: builtin/fstk/ui.lua
msgid "The server has requested a reconnect:"
msgstr "Il server ha richiesto una riconnessione"
msgstr "Il server ha richiesto una riconnessione:"
#: builtin/mainmenu/common.lua src/game.cpp
msgid "Loading..."
@ -78,7 +78,7 @@ msgstr "Supportiamo soltanto versioni del protocollo comprese tra $1 e $2."
#: builtin/mainmenu/dlg_rename_modpack.lua builtin/mainmenu/tab_settings.lua
#: src/guiKeyChangeMenu.cpp src/keycode.cpp
msgid "Cancel"
msgstr "Annullare"
msgstr "Annulla"
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua
msgid "Depends:"
@ -86,15 +86,15 @@ msgstr "Dipendenze:"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Disable MP"
msgstr "Disatt. pacch."
msgstr "Disattiva modpack"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Enable MP"
msgstr "Att. pacch."
msgstr "Attiva modpack"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Enable all"
msgstr "Attivarli tutti"
msgstr "Attivali tutti"
#: builtin/mainmenu/dlg_config_world.lua
msgid ""
@ -119,7 +119,7 @@ msgstr "Mod.:"
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_settings.lua
#: src/guiKeyChangeMenu.cpp
msgid "Save"
msgstr "Salvare"
msgstr "Salva"
#: builtin/mainmenu/dlg_config_world.lua
msgid "World:"
@ -135,7 +135,7 @@ msgstr "Esiste già un mondo chiamato \"$1\""
#: builtin/mainmenu/dlg_create_world.lua
msgid "Create"
msgstr "Creare"
msgstr "Crea"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download a subgame, such as minetest_game, from minetest.net"
@ -325,7 +325,7 @@ msgstr "Selezionare il file modulo:"
#: builtin/mainmenu/tab_mods.lua
msgid "Uninstall selected mod"
msgstr "Disinstallare il modulo selezionato"
msgstr "Disinstalla la mod selezionata"
#: builtin/mainmenu/tab_mods.lua
msgid "Uninstall selected modpack"
@ -341,7 +341,7 @@ msgstr "Client"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "Connect"
msgstr "Connettere"
msgstr "Connettiti"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "Creative mode"
@ -354,7 +354,7 @@ msgstr "Danni abilitati"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_server.lua
#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp
msgid "Delete"
msgstr "Cancellare"
msgstr "Cancella"
#: builtin/mainmenu/tab_multiplayer.lua
msgid "Name / Password :"
@ -607,7 +607,7 @@ msgstr "Il percorso del mondo fornito non esiste: "
#: src/fontengine.cpp
msgid "needs_fallback_font"
msgstr "no"
msgstr "richiedi_fallback_font"
#: src/game.cpp
msgid ""
@ -618,9 +618,8 @@ msgstr ""
"Controllare debug.txt per i dettagli."
#: src/game.cpp
#, fuzzy
msgid "Change Keys"
msgstr "Cambiare i tasti"
msgstr "Cambia i tasti"
#: src/game.cpp
msgid "Change Password"
@ -703,7 +702,7 @@ msgstr "Tornare al menù"
#: src/game.cpp
msgid "Exit to OS"
msgstr "Tornare al S.O."
msgstr "Tornare al sistema operativo"
#: src/game.cpp
msgid "Item definitions..."
@ -910,7 +909,7 @@ msgstr "Control"
#: src/keycode.cpp
msgid "Convert"
msgstr "Convert"
msgstr "Converti"
#: src/keycode.cpp
msgid "CrSel"
@ -926,7 +925,7 @@ msgstr "Fine"
#: src/keycode.cpp
msgid "Erase OEF"
msgstr "Erase OEF"
msgstr "Cancella OEF"
#: src/keycode.cpp
msgid "Escape"
@ -1074,7 +1073,7 @@ msgstr "Tast. num. 9"
#: src/keycode.cpp
msgid "OEM Clear"
msgstr "OEM Clear"
msgstr "Ripulisci OEM"
#: src/keycode.cpp
msgid "PA1"
@ -1221,9 +1220,8 @@ msgstr ""
"Un messaggio da mostrare a tutti i giocatori quando il server si spegne."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Absolute limit of emerge queues"
msgstr "Limite assoluto delle code di \"emersione\""
msgstr "Limite assoluto delle code degli emerge"
#: src/settings_translation_file.cpp
msgid "Acceleration in air"
@ -1267,7 +1265,7 @@ msgstr "Avanzato"
#: src/settings_translation_file.cpp
msgid "Always fly and fast"
msgstr ""
msgstr "Volo veloce permanentemente abilitato"
#: src/settings_translation_file.cpp
#, fuzzy
@ -1337,14 +1335,13 @@ msgstr "Ammorbidisci la visuale in modalità cinematica"
#: src/settings_translation_file.cpp
msgid "Camera update toggle key"
msgstr "Tasto Attiva/Disattiva aggiornamento della camera."
msgstr "Tasto Attiva/Disattiva aggiornamento della camera"
#: src/settings_translation_file.cpp
msgid "Chat key"
msgstr "Tasto Chat"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Chat toggle key"
msgstr "Tasto mostra/nascondi chat"
@ -1366,7 +1363,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Client and Server"
msgstr ""
msgstr "Client e Server"
#: src/settings_translation_file.cpp
msgid "Climbing speed"
@ -1403,9 +1400,8 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Command key"
msgstr "Comando"
msgstr "Tasto del comando"
#: src/settings_translation_file.cpp
#, fuzzy
@ -1413,7 +1409,6 @@ msgid "Connect glass"
msgstr "Vetro connesso"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Connect to external media server"
msgstr "Connettiti al server dati esterno"
@ -1422,27 +1417,24 @@ msgid "Connects glass if supported by node."
msgstr "Collega il vetro se supportato dal nodo."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Console alpha"
msgstr "Console"
msgstr "Console primaira"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Console color"
msgstr "Console"
msgstr "Colore della console"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Console key"
msgstr "Console"
msgstr "Tasto per la console"
#: src/settings_translation_file.cpp
msgid "Continuous forward"
msgstr ""
msgstr "Avanti automatico continuo"
#: src/settings_translation_file.cpp
msgid "Continuous forward movement (only used for testing)."
msgstr ""
msgstr "Movimento in avanti continuo (usato solo per i test)."
#: src/settings_translation_file.cpp
msgid "Controls"
@ -1454,12 +1446,17 @@ msgid ""
"Examples: 72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays "
"unchanged."
msgstr ""
"Definisce la lunghezza del ciclo giorno/notte.\n"
"Ad esempio: 72 = 20min, 360 = 4min, 1 = 24ore, 0 =giorno e notte rimangono "
"fissi."
#: src/settings_translation_file.cpp
msgid ""
"Controls size of deserts and beaches in Mapgen v6.\n"
"When snowbiomes are enabled 'mgv6_freq_desert' is ignored."
msgstr ""
"Definisce la dimensione di deserti e spiagge nel generatoe delle mappe v6.\n"
"Quando i biomi innevati sono abilitati 'mgv6_freq_desert' viene ignorato."
#: src/settings_translation_file.cpp
msgid "Crash message"
@ -1483,7 +1480,7 @@ msgstr "Colore del mirino (R,G,B)."
#: src/settings_translation_file.cpp
msgid "Crouch speed"
msgstr ""
msgstr "Velocita da accovacciato"
#: src/settings_translation_file.cpp
msgid "DPI"
@ -1495,7 +1492,7 @@ msgstr "Abilitare il danno"
#: src/settings_translation_file.cpp
msgid "Debug info toggle key"
msgstr ""
msgstr "Comando attiva/disattiva informazioni del debug"
#: src/settings_translation_file.cpp
msgid "Debug log level"
@ -1507,12 +1504,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Default acceleration"
msgstr ""
msgstr "Accelerazione di default"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Default game"
msgstr "modificare il gioco"
msgstr "Gioco di default"
#: src/settings_translation_file.cpp
msgid ""
@ -1521,9 +1517,8 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Default password"
msgstr "Nuova password"
msgstr "Password di default"
#: src/settings_translation_file.cpp
msgid "Default privileges"
@ -1576,9 +1571,8 @@ msgid "Detailed mod profiling"
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Disable anticheat"
msgstr "Abilitare le particelle"
msgstr "Disattiva l'anticheat"
#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
@ -1589,14 +1583,13 @@ msgid "Domain name of server, to be displayed in the serverlist."
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Double tap jump for fly"
msgstr "Volare On/Off = due volte \"saltare\""
msgstr "Schiaccia due volte il tasto \"salto\" per volare"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Double-tapping the jump key toggles fly mode."
msgstr "Volare On/Off = due volte \"saltare\""
msgstr ""
"Doppio click sul tasto \"salto\" per attivare/disattivare la modalità volo."
#: src/settings_translation_file.cpp
msgid "Drop item key"
@ -1674,9 +1667,8 @@ msgid "Enables caching of facedir rotated meshes."
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enables minimap."
msgstr "Abilitare il danno"
msgstr "Abilita la minimap."
#: src/settings_translation_file.cpp
msgid ""
@ -1706,12 +1698,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Fall bobbing"
msgstr ""
msgstr "Ondeggiamento visuale quando si cade"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Fallback font"
msgstr "needs_fallback_font"
msgstr "Fallback font"
#: src/settings_translation_file.cpp
msgid "Fallback font shadow"
@ -1770,9 +1761,8 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Filtering"
msgstr "Nessun Filtro"
msgstr "Filtraggio"
#: src/settings_translation_file.cpp
msgid "Fixed map seed"
@ -1819,7 +1809,6 @@ msgid "Font size"
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Forward key"
msgstr "Avanti"
@ -2015,9 +2004,8 @@ msgid "Ignore world errors"
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "In-Game"
msgstr "Gioco"
msgstr "Nel gioco"
#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
@ -2036,7 +2024,6 @@ msgid "Interval of sending time of day to clients."
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Inventory key"
msgstr "Inventario"
@ -2099,9 +2086,8 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Jump key"
msgstr "Saltare"
msgstr "Salto"
#: src/settings_translation_file.cpp
msgid "Jumping speed"
@ -2333,9 +2319,8 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Left key"
msgstr "Menù a sinistra"
msgstr "Sinistra"
#: src/settings_translation_file.cpp
msgid ""
@ -2378,7 +2363,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Liquid fluidity smoothing"
msgstr ""
msgstr "Raffinatezza dello scorrere dei liquidi"
#: src/settings_translation_file.cpp
msgid "Liquid loop max"
@ -2390,7 +2375,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Liquid sink"
msgstr ""
msgstr "Velocità di caduta del liquiddi"
#: src/settings_translation_file.cpp
msgid "Liquid update interval in seconds."
@ -2405,14 +2390,12 @@ msgid "Main menu game manager"
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Main menu mod manager"
msgstr "Menù principale"
msgstr "Pannello di controllo mod del menù principale"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Main menu script"
msgstr "Menù principale"
msgstr "Script del menù principale"
#: src/settings_translation_file.cpp
msgid ""
@ -2506,14 +2489,12 @@ msgid "Mapgen biome humidity noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Mapgen debug"
msgstr "Generat. mappe"
msgstr "Debug del generatore delle mappe"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Mapgen flags"
msgstr "Generat. mappe"
msgstr "flags del generatore delle mappe"
#: src/settings_translation_file.cpp
#, fuzzy
@ -2594,14 +2575,12 @@ msgid "Mapgen heat blend noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Mapgen name"
msgstr "Generat. mappe"
msgstr "Nome del genratore delle mappe"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Mapgen v5"
msgstr "Generat. mappe"
msgstr "Generatore mappe v5"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 cave1 noise parameters"
@ -2624,9 +2603,8 @@ msgid "Mapgen v5 height noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Mapgen v6"
msgstr "Generat. mappe"
msgstr "Generatore mappe v6"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 apple trees noise parameters"
@ -2685,9 +2663,8 @@ msgid "Mapgen v6 trees noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Mapgen v7"
msgstr "Generat. mappe"
msgstr "Generatore mappe v7"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 cave1 noise parameters"
@ -2816,7 +2793,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Maximum number of players that can connect simultaneously."
msgstr ""
msgstr "Numero di giocatori che si possono connettere simultaneamente."
#: src/settings_translation_file.cpp
msgid "Maximum number of statically stored objects in a block."
@ -2839,6 +2816,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Maximum time in ms a file download (e.g. a mod download) may take."
msgstr ""
"Tempo massimo per il download di un file, ad esempio una mod, espresso in ms."
#: src/settings_translation_file.cpp
msgid "Maximum users"
@ -2849,7 +2827,6 @@ msgid "Maxmimum objects per block"
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Menus"
msgstr "Menù"
@ -2889,7 +2866,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Mipmapping"
msgstr "Mip-Mapping"
@ -2982,7 +2958,6 @@ msgid "Noclip key"
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Node highlighting"
msgstr "Evidenziamento Nodi"
@ -3000,7 +2975,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Number of emerge threads"
msgstr ""
msgstr "Numero degli emerge threads"
#: src/settings_translation_file.cpp
msgid ""
@ -3010,6 +2985,11 @@ msgid ""
"speed greatly\n"
"at the cost of slightly buggy caves."
msgstr ""
"Numero degli emerge threads da usare. Lascia questa voce vuota o aumenta "
"questo numero\n"
"per usare più di un thread. Su sistemi muliprocessore questo migliorerà "
"notevolmente la velocità della generazione delle mappe\n"
"ma potrebbe causare bug."
#: src/settings_translation_file.cpp
msgid ""
@ -3081,9 +3061,8 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Player name"
msgstr "Nome del giocatore troppo lungo."
msgstr "Nome del giocatore"
#: src/settings_translation_file.cpp
msgid "Player transfer distance"
@ -3091,7 +3070,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Player versus Player"
msgstr ""
msgstr "PvP"
#: src/settings_translation_file.cpp
msgid ""
@ -3108,9 +3087,8 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Preload inventory textures"
msgstr "Caricamento..."
msgstr "Precaricamento delle textures dell'inventario"
#: src/settings_translation_file.cpp
msgid "Prevent mods from doing insecure things like running shell commands."
@ -3157,9 +3135,8 @@ msgid "Replaces the default main menu with a custom one."
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Right key"
msgstr "Menù a destra"
msgstr "Destra"
#: src/settings_translation_file.cpp
msgid "Rightclick repetition interval"
@ -3199,9 +3176,8 @@ msgid "Screen width"
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Screenshot"
msgstr "Istantanea"
msgstr "Istantanea schermo"
#: src/settings_translation_file.cpp
msgid "Screenshot folder"
@ -3228,32 +3204,26 @@ msgid "Selection box width"
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Server / Singleplayer"
msgstr "Giocatore singolo"
msgstr "Server / Giocatore singolo"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Server URL"
msgstr "Server"
msgstr "URL del server"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Server address"
msgstr "Porta del server"
msgstr "Indirizzo del server"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Server description"
msgstr "Porta del server"
msgstr "Descrizione del server"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Server name"
msgstr "Server"
msgstr "Nome del server"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Server port"
msgstr "Porta del server"
@ -3321,9 +3291,8 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Smooth lighting"
msgstr "Illuminazione armoniosa"
msgstr "Raffinatezza ombreggiature"
#: src/settings_translation_file.cpp
msgid ""
@ -3340,9 +3309,8 @@ msgid "Smooths rotation of camera. 0 to disable."
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Sneak key"
msgstr "Strisciare"
msgstr "Abbassati"
#: src/settings_translation_file.cpp
msgid "Sound"
@ -3530,9 +3498,8 @@ msgid "Use trilinear filtering when scaling textures."
msgstr "Usa un filtro trilineare quando si scalano le texture."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Useful for mod developers."
msgstr "Sviluppatori principali"
msgstr "Utile per gli sviluppatori di mod."
#: src/settings_translation_file.cpp
msgid "V-Sync"
@ -3575,7 +3542,6 @@ msgid "Viewing range minimum"
msgstr "Distanza minima di visibilità"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Volume"
msgstr "Volume del suono"
@ -3640,7 +3606,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"When using bilinear/trilinear/anisotropic filters, low-resolution textures\n"
"can be blurred, so automatically upscale them with nearest-neighbor\n"
@ -3722,7 +3687,6 @@ msgstr ""
"premere F5)."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Width of the selectionbox's lines around nodes."
msgstr "Larghezza dei riquadri attorno ai nodi."

View File

@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-11-08 21:23+0100\n"
"PO-Revision-Date: 2015-12-19 11:07+0000\n"
"PO-Revision-Date: 2016-01-14 08:53+0000\n"
"Last-Translator: Rui <rui914t@gmail.com>\n"
"Language-Team: Japanese "
"<https://hosted.weblate.org/projects/minetest/minetest/ja/>\n"
@ -134,7 +134,6 @@ msgid "Download a subgame, such as minetest_game, from minetest.net"
msgstr "minetest.netからminetest_gameなどのサブゲームをダウンロードしてください"
#: builtin/mainmenu/dlg_create_world.lua
#, fuzzy
msgid "Download one from minetest.net"
msgstr "minetest.netからダウンロードしてください"
@ -358,7 +357,6 @@ msgid "PvP enabled"
msgstr "PvP有効"
#: builtin/mainmenu/tab_server.lua
#, fuzzy
msgid "Bind Address"
msgstr "バインドアドレス"
@ -413,7 +411,6 @@ msgid "Start Game"
msgstr "ゲームスタート"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "\"$1\" is not a valid flag."
msgstr "\"$1\"は有効なフラグではありません。"
@ -442,9 +439,8 @@ msgid "Enabled"
msgstr "有効"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Format is 3 numbers separated by commas and inside brackets."
msgstr "書式は、コンマとかっこで区切られた 3 つの数字です。"
msgstr "括弧内に3つの数字をカンマで区切って入力してください。"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
@ -460,14 +456,12 @@ msgid "Games"
msgstr "ゲーム"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Optionally the lacunarity can be appended with a leading comma."
msgstr "空隙性随意大手カンマを付加することができます。"
msgstr "空隙性の値には、任意でカンマを付けて読みやすくすることができます。"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Please enter a comma seperated list of flags."
msgstr "フラグのリストはカンマで区切って入力してください。"
msgstr "フラグはカンマで区切られた一覧で入力してください。"
#: builtin/mainmenu/tab_settings.lua
msgid "Please enter a valid integer."
@ -478,27 +472,24 @@ msgid "Please enter a valid number."
msgstr "有効な数字を入力してください。"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Possible values are: "
msgstr "可能な値: "
msgstr "使用可能な値: "
#: builtin/mainmenu/tab_settings.lua
msgid "Restore Default"
msgstr "初期設定に戻す"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Select path"
msgstr "ファイルパスを選択"
msgstr "ファイルの場所を選択"
#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
msgstr "設定"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Show technical names"
msgstr "技術名称を表示"
msgstr "パラメータ名を表示"
#: builtin/mainmenu/tab_settings.lua
msgid "The value must be greater than $1."
@ -577,30 +568,26 @@ msgid "Connection error (timed out?)"
msgstr "接続エラー (タイムアウト?)"
#: src/client/clientlauncher.cpp
#, fuzzy
msgid "Could not find or load game \""
msgstr "以下のゲームの読み込みができません\""
msgstr "以下のゲームが見つからないか読み込めません \""
#: src/client/clientlauncher.cpp
#, fuzzy
msgid "Invalid gamespec."
msgstr "無効なgamespecです。"
msgstr "無効なゲーム情報です。"
#: src/client/clientlauncher.cpp
msgid "Main Menu"
msgstr "メインメニュー"
#: src/client/clientlauncher.cpp
#, fuzzy
msgid "No world selected and no address provided. Nothing to do."
msgstr "ワールドが選択されていないアドレスです。続行できません。"
msgstr "ワールドが選択されていないか存在しないアドレスです。続行できません。"
#: src/client/clientlauncher.cpp
msgid "Player name too long."
msgstr "プレイヤー名が長過ぎます。"
#: src/client/clientlauncher.cpp
#, fuzzy
msgid "Provided world path doesn't exist: "
msgstr "ワールドが存在しません: "
@ -667,7 +654,6 @@ msgstr ""
"- T: チャット\n"
#: src/game.cpp
#, fuzzy
msgid ""
"Default Controls:\n"
"No menu visible:\n"
@ -685,9 +671,9 @@ msgstr ""
"デフォルトの操作:\n"
"タッチ操作:\n"
"- シングルタップ: ブロックの破壊\n"
"- ダブルタップ: 設置使用\n"
"- ダブルタップ: 設置/使用\n"
"- スライド: 見回す\n"
"メニューインベントリの操作:\n"
"メニュー/インベントリの操作:\n"
"- メニューの外をダブルタップ:\n"
" --> 閉じる\n"
"- アイテムをタッチ:\n"
@ -1168,6 +1154,8 @@ msgid ""
"0 = parallax occlusion with slope information (faster).\n"
"1 = relief mapping (slower, more accurate)."
msgstr ""
"0 = 斜面情報付きの視差遮蔽マッピング(高速)。\n"
"1 = リリーフマッピング(正確だが低速)。"
#: src/settings_translation_file.cpp
msgid "3D clouds"
@ -1178,7 +1166,6 @@ msgid "3D mode"
msgstr "3Dモード"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"3D support.\n"
"Currently supported:\n"
@ -1189,18 +1176,21 @@ msgid ""
"- sidebyside: split screen side by side."
msgstr ""
"3Dサポート\n"
"現在サポートしている:\n"
"- none: 3D出力なし\n"
"- anaglyph: cyan/magenta color 3d.\n"
"- interlaced: odd/even line based polarisation screen support.\n"
"- topbottom: split screen top/bottom.\n"
"- sidebyside: split screen side by side."
"サポートしている出力:\n"
"- none: 3D出力を行いません。\n"
"- anaglyph: 赤/青の色による3Dです。\n"
"- interlaced: 偶数/奇数のラインをベースで偏光式スクリーンに対応しています。\n"
"- topbottom: 画面を上下で分割します。\n"
"- sidebyside: 画面を左右で分割します。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
msgstr ""
"新規マップを作成する際の初期シード値です。空にするとランダムに設定されます。\n"
"メインメニューから新規ワールドを作成する際に上書きされることがあります。"
#: src/settings_translation_file.cpp
msgid "A message to be displayed to all clients when the server crashes."
@ -1211,8 +1201,9 @@ msgid "A message to be displayed to all clients when the server shuts down."
msgstr "サーバー終了時に全てのクライアントへ表示するメッセージ。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Absolute limit of emerge queues"
msgstr ""
msgstr "エマージキューの絶対的な制限値"
#: src/settings_translation_file.cpp
#, fuzzy
@ -3548,7 +3539,6 @@ msgid "Waving leaves"
msgstr "揺れる葉"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Waving plants"
msgstr "揺れる草花"
@ -3557,19 +3547,16 @@ msgid "Waving water"
msgstr "揺れる水"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Waving water height"
msgstr "揺れる水"
msgstr "水が揺れる高さ"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Waving water length"
msgstr "揺れる水"
msgstr "水が揺れる丈"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Waving water speed"
msgstr "揺れる水"
msgstr "水が揺れる速度"
#: src/settings_translation_file.cpp
msgid ""
@ -3598,6 +3585,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Where the map generator stops.\n"
"Please note:\n"
@ -3606,58 +3594,74 @@ msgid ""
"- Those groups have an offset of -32, -32 nodes from the origin.\n"
"- Only groups which are within the map_generation_limit are generated"
msgstr ""
"どこでマップ生成を停止するかの設定です。\n"
"注意:\n"
"- 最大で31000です(これ以上に設定しても効果はありません)。\n"
"- マップ生成は80x80x80ードのグループで動作します (5x5x5マップブロック)。\n"
"- このグループは原点から-32、-32ードのオフセットがあります。\n"
"- グループはmap_generation_limit内で生成されたものに限ります。"
#: src/settings_translation_file.cpp
msgid ""
"Whether freetype fonts are used, requires freetype support to be compiled in."
msgstr ""
msgstr "Freetypeフォントを利用するかどうかの設定です。Freetypeをサポートするビルドである必要があります。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Whether node texture animations should be desynchronized per mapblock."
msgstr ""
msgstr "ノードのテクスチャのアニメーションをマップブロックごとに非同期にするかどうかの設定です。"
#: src/settings_translation_file.cpp
msgid ""
"Whether players are shown to clients without any range limit.\n"
"Deprecated, use the setting player_transfer_distance instead."
msgstr ""
"視界の範囲に関わらずクライアントにプレイヤーを表示するかどうかの設定です。\n"
"非推奨です。player_transfer_distance instead設定を利用してください。"
#: src/settings_translation_file.cpp
msgid "Whether to allow players to damage and kill each other."
msgstr ""
msgstr "他のプレイヤーを殺すことができるかどうかの設定です。"
#: src/settings_translation_file.cpp
msgid ""
"Whether to ask clients to reconnect after a (Lua) crash.\n"
"Set this to true if your server is set up to restart automatically."
msgstr ""
"(Luaが)クラッシュした際にクライアントに再接続を要求するかどうかの設定です。\n"
"サーバーが自動で再起動されるように設定されているならばtrueに設定してください。"
#: src/settings_translation_file.cpp
msgid "Whether to fog out the end of the visible area."
msgstr ""
msgstr "可視領域の端に霧を表示するかどうかの設定です。"
#: src/settings_translation_file.cpp
msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr ""
msgstr "クライアントのデバッグ情報を表示するかどうかの設定です(F5を押すのと同じ効果)。"
#: src/settings_translation_file.cpp
msgid "Width of the selectionbox's lines around nodes."
msgstr ""
msgstr "ノードを選択した際に表示される線の幅です。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"World directory (everything in the world is stored here).\n"
"Not needed if starting from the main menu."
msgstr ""
"ワールドを保存するディレクトリです(全てのワールドはここに保存されます)。\n"
"メインメニューから開始する場合必要ありません。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "cURL file download timeout"
msgstr ""
msgstr "cURLファイルダウンロードタイムアウト"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "cURL parallel limit"
msgstr ""
msgstr "cURLパラレル制限"
#: src/settings_translation_file.cpp
msgid "cURL timeout"

View File

@ -7,8 +7,8 @@ msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-11-08 21:23+0100\n"
"PO-Revision-Date: 2015-12-19 02:35+0000\n"
"Last-Translator: Rogier <rogier777@gmail.com>\n"
"PO-Revision-Date: 2016-01-23 04:35+0000\n"
"Last-Translator: Tobyplowy <toby123@live.nl>\n"
"Language-Team: Dutch "
"<https://hosted.weblate.org/projects/minetest/minetest/nl/>\n"
"Language: nl\n"
@ -568,12 +568,12 @@ msgstr "Voorwerp-texturen..."
#: src/client.cpp
msgid "Loading textures..."
msgstr "Bezig met laden van texturen..."
msgstr "Bezig met texturen te laaden..."
#: src/client.cpp
#, fuzzy
msgid "Rebuilding shaders..."
msgstr "Herbouwen van shaders..."
msgstr "schaduwen herbouwen..."
#: src/client/clientlauncher.cpp
msgid "Connection error (timed out?)"
@ -731,7 +731,7 @@ msgstr "Server-adres opzoeken..."
#: src/game.cpp
msgid "Respawn"
msgstr "Wedergeboorte"
msgstr "Respawn"
#: src/game.cpp
msgid "Shutting down..."
@ -743,16 +743,15 @@ msgstr "Geluidsvolume"
#: src/game.cpp
msgid "You died."
msgstr "Je bent gestorven."
msgstr "Je bent dood."
#: src/guiFormSpecMenu.cpp
#, fuzzy
msgid "Enter "
msgstr "Invoeren "
msgstr "Enter "
#: src/guiFormSpecMenu.cpp
msgid "ok"
msgstr "ok"
msgstr "oké"
#: src/guiKeyChangeMenu.cpp
msgid "\"Use\" = climb down"
@ -788,7 +787,7 @@ msgstr "Vooruit"
#: src/guiKeyChangeMenu.cpp
msgid "Inventory"
msgstr "Rugzak"
msgstr "inventaris"
#: src/guiKeyChangeMenu.cpp
msgid "Jump"
@ -822,7 +821,7 @@ msgstr "Rechts"
#: src/guiKeyChangeMenu.cpp
msgid "Sneak"
msgstr "Kruipen"
msgstr "sluipen"
#: src/guiKeyChangeMenu.cpp
msgid "Toggle Cinematic"
@ -1364,7 +1363,7 @@ msgstr "Cinematic modus aan/uit toets"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Clean transparent textures"
msgstr "Doorzichtige texturen schonen"
msgstr "Transparante texturen"
#: src/settings_translation_file.cpp
msgid "Client and Server"
@ -1691,6 +1690,10 @@ msgid ""
"or need to be auto-generated.\n"
"Requires shaders to be enabled."
msgstr ""
"bumpmapping aanzetten voor texturen. Normalmaps moeten al in de texture pack "
"zitten\n"
"of ze moeten automatisch gegenereerd worden.\n"
"Schaduwen moeten aanstaan."
#: src/settings_translation_file.cpp
msgid "Enables caching of facedir rotated meshes."
@ -1726,7 +1729,7 @@ msgstr "FPS in het pauze-menu"
#: src/settings_translation_file.cpp
msgid "FSAA"
msgstr ""
msgstr "FSAA"
#: src/settings_translation_file.cpp
msgid "Fall bobbing"

View File

@ -8,15 +8,16 @@ msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-11-08 21:23+0100\n"
"PO-Revision-Date: 2014-01-06 01:45+0200\n"
"Last-Translator: João Farias <jgfd@cin.ufpe.br>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"PO-Revision-Date: 2016-01-14 18:20+0000\n"
"Last-Translator: Ian giestas pauli <iangiestaspauli@gmail.com>\n"
"Language-Team: Portuguese "
"<https://hosted.weblate.org/projects/minetest/minetest/pt/>\n"
"Language: pt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 1.7-dev\n"
"X-Generator: Weblate 2.5-dev\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
@ -36,13 +37,12 @@ msgid "Ok"
msgstr "Ok"
#: builtin/fstk/ui.lua
#, fuzzy
msgid "Reconnect"
msgstr "Ligar"
msgstr "Reconectar"
#: builtin/fstk/ui.lua
msgid "The server has requested a reconnect:"
msgstr ""
msgstr "O servidor requisitou uma reconexão:"
#: builtin/mainmenu/common.lua src/game.cpp
msgid "Loading..."

View File

@ -8,20 +8,20 @@ msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-11-08 21:23+0100\n"
"PO-Revision-Date: 2015-10-27 16:46+0200\n"
"Last-Translator: PilzAdam <PilzAdam@minetest.net>\n"
"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/"
"minetest/minetest/pt_BR/>\n"
"PO-Revision-Date: 2016-01-14 20:25+0000\n"
"Last-Translator: Ian giestas pauli <iangiestaspauli@gmail.com>\n"
"Language-Team: Portuguese (Brazil) "
"<https://hosted.weblate.org/projects/minetest/minetest/pt_BR/>\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 2.5-dev\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
msgstr "Ocorreu um erro no script Lua, como um mod:"
msgstr "Ocorreu um erro no script Lua, assim como em um mod:"
#: builtin/fstk/ui.lua
msgid "An error occured:"
@ -36,13 +36,12 @@ msgid "Ok"
msgstr "Ok"
#: builtin/fstk/ui.lua
#, fuzzy
msgid "Reconnect"
msgstr "Conectar"
msgstr "Reconectar"
#: builtin/fstk/ui.lua
msgid "The server has requested a reconnect:"
msgstr ""
msgstr "O servidor requisitou uma reconexão:"
#: builtin/mainmenu/common.lua src/game.cpp
msgid "Loading..."
@ -50,27 +49,29 @@ msgstr "Carregando..."
#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
msgstr ""
msgstr "Versão do protocolo incompatível. "
#: builtin/mainmenu/common.lua
msgid "Server enforces protocol version $1. "
msgstr ""
msgstr "O servidor suporta o protocolo versão $1. "
#: builtin/mainmenu/common.lua
msgid "Server supports protocol versions between $1 and $2. "
msgstr ""
msgstr "O servidor suporta entre as versões $1 e $2 do protocolo. "
#: builtin/mainmenu/common.lua
msgid "Try reenabling public serverlist and check your internet connection."
msgstr ""
"Tente reabilitar a lista de servidores publicos e checar sua conexão de "
"internet."
#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
msgstr ""
msgstr "Nós apenas suportamos a versão $1 do protocolo."
#: builtin/mainmenu/common.lua
msgid "We support protocol versions between version $1 and $2."
msgstr ""
msgstr "Nós suportamos entre as versões $1 e $2 do protocolo."
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_rename_modpack.lua builtin/mainmenu/tab_settings.lua
@ -99,6 +100,9 @@ msgid ""
"Failed to enable mod \"$1\" as it contains disallowed characters. Only "
"chararacters [a-z0-9_] are allowed."
msgstr ""
"Falha ao carregar mod \"$1\" devido ao fato de seu nome possuir caracteres "
"inválidos. Apenas caracteres de \"a\" até \"z\" e algarísmos de 0 até 9 são "
"permitidos."
#: builtin/mainmenu/dlg_config_world.lua
msgid "Hide Game"
@ -135,11 +139,11 @@ msgstr "Criar"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download a subgame, such as minetest_game, from minetest.net"
msgstr ""
msgstr "Baixe um subgame, como o minetest_game, do site minetest.net"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download one from minetest.net"
msgstr ""
msgstr "Baixe um do site minetest.net"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Game"
@ -161,6 +165,7 @@ msgstr "Seed"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Warning: The minimal development test is meant for developers."
msgstr ""
"Aviso: O game \"minimal development test\" apenas serve para desenvolvedores."
#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
@ -168,7 +173,7 @@ msgstr "Nome do mundo"
#: builtin/mainmenu/dlg_create_world.lua
msgid "You have no subgames installed."
msgstr ""
msgstr "Você não possui nenhum subgame instalado."
#: builtin/mainmenu/dlg_delete_mod.lua
msgid "Are you sure you want to delete \"$1\"?"
@ -207,13 +212,13 @@ msgid "Rename Modpack:"
msgstr "Renomear pacote de módulos:"
#: builtin/mainmenu/modmgr.lua
#, fuzzy
msgid ""
"\n"
"Install Mod: unsupported filetype \"$1\" or broken archive"
msgstr ""
"\n"
"Instalação de módulo: o tipo de arquivo \"$1\" não é suportado"
"Instalação de módulo: o tipo de arquivo \"$1\" não é suportado ou o arquivo "
"está corrompido"
#: builtin/mainmenu/modmgr.lua
msgid "Failed to install $1 to $2"
@ -236,11 +241,11 @@ msgstr ""
#: builtin/mainmenu/store.lua
msgid "Close store"
msgstr ""
msgstr "Fechar Mod Store"
#: builtin/mainmenu/store.lua
msgid "Downloading $1, please wait..."
msgstr ""
msgstr "Baixando $1, por favor aguarde..."
#: builtin/mainmenu/store.lua
msgid "Install"
@ -256,20 +261,19 @@ msgstr "Classificação"
#: builtin/mainmenu/store.lua
msgid "Search"
msgstr ""
msgstr "Procurar"
#: builtin/mainmenu/store.lua
#, fuzzy
msgid "Shortname:"
msgstr "Nome do mundo"
msgstr "Nome curto:"
#: builtin/mainmenu/store.lua
msgid "Successfully installed:"
msgstr ""
msgstr "Instalado com sucesso:"
#: builtin/mainmenu/store.lua
msgid "Unsorted"
msgstr ""
msgstr "Desorganizado"
#: builtin/mainmenu/store.lua
msgid "re-Install"
@ -292,9 +296,8 @@ msgid "Previous Contributors"
msgstr "Colaboradores anteriores"
#: builtin/mainmenu/tab_credits.lua
#, fuzzy
msgid "Previous Core Developers"
msgstr "Desenvolvedores principais"
msgstr "Desenvolvedores principais anteriores"
#: builtin/mainmenu/tab_mods.lua
msgid "Installed Mods:"
@ -329,9 +332,8 @@ msgid "Uninstall selected modpack"
msgstr "Desinstalar o pacote de módulos selecionado"
#: builtin/mainmenu/tab_multiplayer.lua
#, fuzzy
msgid "Address / Port :"
msgstr "Endereço/Porta"
msgstr "Endereço / Porta :"
#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
msgid "Client"
@ -342,14 +344,12 @@ msgid "Connect"
msgstr "Conectar"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
#, fuzzy
msgid "Creative mode"
msgstr "Modo criativo"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
#, fuzzy
msgid "Damage enabled"
msgstr "habilitado"
msgstr "Habilitar dano"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_server.lua
#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp
@ -357,22 +357,20 @@ msgid "Delete"
msgstr "Excluir"
#: builtin/mainmenu/tab_multiplayer.lua
#, fuzzy
msgid "Name / Password :"
msgstr "Nome/Senha"
msgstr "Nome / Senha :"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "Public Serverlist"
msgstr "Servidores públicos"
msgstr "Lista de servidores públicos"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
#, fuzzy
msgid "PvP enabled"
msgstr "habilitado"
msgstr "PvP habilitado"
#: builtin/mainmenu/tab_server.lua
msgid "Bind Address"
msgstr ""
msgstr "Endereço de Bind"
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
msgid "Configure"
@ -390,21 +388,19 @@ msgstr "Habilitar dano"
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua
msgid "Name/Password"
msgstr "Nome/Senha"
msgstr "Nome / Senha"
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
msgid "New"
msgstr "Novo"
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
#, fuzzy
msgid "No world created or selected!"
msgstr ""
"Não foi fornecido nenhum nome para o mundo ou não foi selecionado nenhum jogo"
msgstr "Nenhum mundo criado ou selecionado!"
#: builtin/mainmenu/tab_server.lua
msgid "Port"
msgstr ""
msgstr "Porta"
#: builtin/mainmenu/tab_server.lua
msgid "Public"
@ -428,43 +424,43 @@ msgstr "Iniciar o jogo"
#: builtin/mainmenu/tab_settings.lua
msgid "\"$1\" is not a valid flag."
msgstr ""
msgstr "\"$1\" não é uma flag válida."
#: builtin/mainmenu/tab_settings.lua
msgid "(No description of setting given)"
msgstr ""
msgstr "(Nenhuma descrição das configurações foi fornecida)"
#: builtin/mainmenu/tab_settings.lua
msgid "Browse"
msgstr ""
msgstr "Navegar"
#: builtin/mainmenu/tab_settings.lua
msgid "Change keys"
msgstr "Mudar teclas"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Disabled"
msgstr "Desabilitar PMs"
msgstr "Desabilitado"
#: builtin/mainmenu/tab_settings.lua
msgid "Edit"
msgstr ""
msgstr "Editar"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Enabled"
msgstr "habilitado"
msgstr "Habilitado"
#: builtin/mainmenu/tab_settings.lua
msgid "Format is 3 numbers separated by commas and inside brackets."
msgstr ""
msgstr "O formato é de 3 números separados por virgulas e dentro de colchetes."
#: builtin/mainmenu/tab_settings.lua
msgid ""
"Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, "
"<octaves>, <persistence>"
msgstr ""
"Formato: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, "
"<octaves>, <persistence>"
#: builtin/mainmenu/tab_settings.lua
msgid "Games"
@ -473,31 +469,31 @@ msgstr "Jogos"
#: builtin/mainmenu/tab_settings.lua
msgid "Optionally the lacunarity can be appended with a leading comma."
msgstr ""
"Opcionalmente essas lacunas podem ser colocados com a vírgula na frente."
#: builtin/mainmenu/tab_settings.lua
msgid "Please enter a comma seperated list of flags."
msgstr ""
msgstr "Por favor, digite uma lista de flags separadas por vírgulas."
#: builtin/mainmenu/tab_settings.lua
msgid "Please enter a valid integer."
msgstr ""
msgstr "Por favor entre com um inteiro válido."
#: builtin/mainmenu/tab_settings.lua
msgid "Please enter a valid number."
msgstr ""
msgstr "Por favor entre com um número válido."
#: builtin/mainmenu/tab_settings.lua
msgid "Possible values are: "
msgstr ""
msgstr "Os possíveis valores são: "
#: builtin/mainmenu/tab_settings.lua
msgid "Restore Default"
msgstr ""
msgstr "Restaurar para o padrão"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Select path"
msgstr "Select"
msgstr "Selecionar diretório"
#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
@ -505,20 +501,19 @@ msgstr "Configurações"
#: builtin/mainmenu/tab_settings.lua
msgid "Show technical names"
msgstr ""
msgstr "Mostrar nomes técnicos"
#: builtin/mainmenu/tab_settings.lua
msgid "The value must be greater than $1."
msgstr ""
msgstr "O valor deve ser maior que $1."
#: builtin/mainmenu/tab_settings.lua
msgid "The value must be lower than $1."
msgstr ""
msgstr "O valor deve ser menor que $1."
#: builtin/mainmenu/tab_simple_main.lua
#, fuzzy
msgid "Config mods"
msgstr "Configurar"
msgstr "Configurar Mods"
#: builtin/mainmenu/tab_simple_main.lua
#, fuzzy
@ -544,7 +539,7 @@ msgstr "Nenhuma informação disponível"
#: builtin/mainmenu/tab_texturepacks.lua
msgid "None"
msgstr ""
msgstr "Nenhum"
#: builtin/mainmenu/tab_texturepacks.lua
msgid "Select texture pack:"
@ -556,35 +551,32 @@ msgid "Texturepacks"
msgstr "Pacotes de texturas"
#: src/client.cpp
#, fuzzy
msgid "Connection timed out."
msgstr "Erro de conexão (tempo excedido?)"
msgstr "Erro de conexão (tempo excedido)."
#: src/client.cpp
msgid "Done!"
msgstr ""
msgstr "Pronto!"
#: src/client.cpp
msgid "Initializing nodes"
msgstr ""
msgstr "Inicializando nodes"
#: src/client.cpp
msgid "Initializing nodes..."
msgstr ""
msgstr "Inicializando nodes..."
#: src/client.cpp
msgid "Item textures..."
msgstr "Texturas dos itens..."
#: src/client.cpp
#, fuzzy
msgid "Loading textures..."
msgstr "Carregando..."
msgstr "Carregando texturas..."
#: src/client.cpp
#, fuzzy
msgid "Rebuilding shaders..."
msgstr "Resolvendo os endereços..."
msgstr "Recompilando shaders..."
#: src/client/clientlauncher.cpp
msgid "Connection error (timed out?)"
@ -605,20 +597,20 @@ msgstr "Menu principal"
#: src/client/clientlauncher.cpp
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."
"Nenhum mundo foi selecionado e nenhum endereço fornecido. Nada a ser feito."
#: src/client/clientlauncher.cpp
msgid "Player name too long."
msgstr ""
msgstr "Seu nome de jogador é muito longo."
#: src/client/clientlauncher.cpp
msgid "Provided world path doesn't exist: "
msgstr ""
msgstr "O caminho fornecido não existe: "
#: src/fontengine.cpp
#, fuzzy
msgid "needs_fallback_font"
msgstr "no"
msgstr "needs_fallback_font"
#: src/game.cpp
msgid ""
@ -695,6 +687,18 @@ msgid ""
"- touch&drag, tap 2nd finger\n"
" --> place single item to slot\n"
msgstr ""
"Controles:\n"
"Se não há nenhum menu visível:\n"
"- Um toque: ativa botão\n"
"- Duplo toque: place/use\n"
"- Deslizar dedo: Olhar ao redor\n"
"Menu/Inventário visível:\n"
"- Duplo toque: (Fora do menu):\n"
" -->Fechar\n"
"- Tocar Item e depois tocar em um slot:\n"
" --> move item\n"
"- Tocar e arrastar, e depois tocar com o 2º dedo\n"
" --> Coloca apenas um item no slot\n"
#: src/game.cpp
msgid "Exit to Menu"
@ -706,11 +710,11 @@ msgstr "Sair do Minetest"
#: src/game.cpp
msgid "Item definitions..."
msgstr "Definições dos itens..."
msgstr "Carregando itens..."
#: src/game.cpp
msgid "KiB/s"
msgstr ""
msgstr "KB/s"
#: src/game.cpp
msgid "Media..."
@ -718,11 +722,11 @@ msgstr "Mídia..."
#: src/game.cpp
msgid "MiB/s"
msgstr ""
msgstr "MB/s"
#: src/game.cpp
msgid "Node definitions..."
msgstr "Definições dos nós..."
msgstr "Carregando blocos..."
#: src/game.cpp src/guiFormSpecMenu.cpp
msgid "Proceed"
@ -750,12 +754,13 @@ msgid "You died."
msgstr "Você morreu."
#: src/guiFormSpecMenu.cpp
#, fuzzy
msgid "Enter "
msgstr ""
msgstr "Entrar "
#: src/guiFormSpecMenu.cpp
msgid "ok"
msgstr ""
msgstr "Ok"
#: src/guiKeyChangeMenu.cpp
msgid "\"Use\" = climb down"
@ -828,9 +833,8 @@ msgid "Sneak"
msgstr "Esgueirar"
#: src/guiKeyChangeMenu.cpp
#, fuzzy
msgid "Toggle Cinematic"
msgstr "Alternar corrida"
msgstr "Alternar modo de câmera cinemática"
#: src/guiKeyChangeMenu.cpp
msgid "Toggle fast"
@ -1181,7 +1185,7 @@ msgstr "Nuvens 3D"
#: src/settings_translation_file.cpp
msgid "3D mode"
msgstr ""
msgstr "modo 3D"
#: src/settings_translation_file.cpp
msgid ""
@ -1193,20 +1197,33 @@ msgid ""
"- topbottom: split screen top/bottom.\n"
"- sidebyside: split screen side by side."
msgstr ""
"Suporte 3D.\n"
"Modos atualmente suportados:\n"
"- none: Nenhum efeito 3D.\n"
"- anaglyph: Sistema de cor Ciano/Magenta (Óculos 3D azul vermelho).\n"
"- interlaced: Sistema interlaçado (Óculos com lentes polarizadas).\n"
"- topbottom: Divide a tela em duas: uma em cima e outra em baixo.\n"
"- sidebyside: Divide a tela em duas: lado a lado."
#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
msgstr ""
"Seed do mundo (deixe em branco para uma seed aleatória).\n"
"Será sobrescrita quando for criada um novo mundo no menu principal."
#: src/settings_translation_file.cpp
msgid "A message to be displayed to all clients when the server crashes."
msgstr ""
"Uma mensagem para ser mostrada a todos os clientes do seu servidor quando "
"ele travar."
#: src/settings_translation_file.cpp
msgid "A message to be displayed to all clients when the server shuts down."
msgstr ""
"Uma mensagem para ser mostrada a todos os clientes quando o servidor "
"desligar."
#: src/settings_translation_file.cpp
msgid "Absolute limit of emerge queues"
@ -1214,11 +1231,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Acceleration in air"
msgstr ""
msgstr "Aceleração no ar"
#: src/settings_translation_file.cpp
msgid "Active block range"
msgstr ""
msgstr "Limite para blocos ativos"
#: src/settings_translation_file.cpp
msgid "Active object send range"
@ -1230,12 +1247,17 @@ msgid ""
"Leave this blank to start a local server.\n"
"Note that the address field in the main menu overrides this setting."
msgstr ""
"Endereço para conexão.\n"
"Deixe em branco para iniciar um servidor local.\n"
"Note que o campo de endereço no menu principal sobrescreve essa configuração."
#: src/settings_translation_file.cpp
msgid ""
"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k "
"screens."
msgstr ""
"Ajustar configuração de dpi (profundidade de cor) para sua tela (apenas para "
"quem não usa X11/Android) Ex para telas 4K"
#: src/settings_translation_file.cpp
msgid ""
@ -1262,7 +1284,7 @@ msgstr "Filtragem anisotrópica"
#: src/settings_translation_file.cpp
msgid "Announce server"
msgstr ""
msgstr "Anunciar servidor"
#: src/settings_translation_file.cpp
msgid ""
@ -1286,7 +1308,7 @@ msgstr "Voltar"
#: src/settings_translation_file.cpp
msgid "Basic"
msgstr ""
msgstr "Básico"
#: src/settings_translation_file.cpp
#, fuzzy
@ -1301,11 +1323,12 @@ msgstr "Resolvendo os endereços..."
#: src/settings_translation_file.cpp
msgid "Bits per pixel (aka color depth) in fullscreen mode."
msgstr ""
"Bits por pixel (Também conhecido como profundidade de cor) no modo de tela "
"cheia."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Build inside player"
msgstr "Vários jogadores"
msgstr "Construir com o jogador dentro do bloco"
#: src/settings_translation_file.cpp
#, fuzzy
@ -1314,15 +1337,15 @@ msgstr "Mipmapping"
#: src/settings_translation_file.cpp
msgid "Camera smoothing"
msgstr ""
msgstr "Suavização da camera"
#: src/settings_translation_file.cpp
msgid "Camera smoothing in cinematic mode"
msgstr ""
msgstr "Suavização da câmera no modo cinematográfico"
#: src/settings_translation_file.cpp
msgid "Camera update toggle key"
msgstr ""
msgstr "Tecla para alternar atualização da câmera"
#: src/settings_translation_file.cpp
#, fuzzy
@ -1339,14 +1362,12 @@ msgid "Chunk size"
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Cinematic mode"
msgstr "Modo criativo"
msgstr "Modo cinematográfico"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Cinematic mode key"
msgstr "Modo criativo"
msgstr "Tecla para modo cinematográfico"
#: src/settings_translation_file.cpp
msgid "Clean transparent textures"
@ -1354,43 +1375,44 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Client and Server"
msgstr ""
msgstr "Cliente e servidor"
#: src/settings_translation_file.cpp
msgid "Climbing speed"
msgstr ""
msgstr "Velocidade de subida (em escadas e outros)"
#: src/settings_translation_file.cpp
msgid "Cloud height"
msgstr ""
msgstr "Altura das nuvens"
#: src/settings_translation_file.cpp
msgid "Cloud radius"
msgstr ""
msgstr "Espessura das nuvens"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Clouds"
msgstr "Nuvens 3D"
msgstr "Nuvens"
#: src/settings_translation_file.cpp
msgid "Clouds are a client side effect."
msgstr ""
msgstr "Conf. das nuvens apenas afetam seu jogo local."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Clouds in menu"
msgstr "Menu principal"
msgstr "Nuvens no menu"
#: src/settings_translation_file.cpp
msgid "Colored fog"
msgstr ""
msgstr "Névoa colorida"
#: src/settings_translation_file.cpp
msgid ""
"Comma-separated list of trusted mods that are allowed to access insecure\n"
"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
"Lista separada por vírgulas dos mods confiáveis que podem utilizar funções "
"inseguras mesmo quando o a opção de Mod Seguro está ativada (via "
"request_insecure_environment())."
#: src/settings_translation_file.cpp
#, fuzzy
@ -1398,41 +1420,36 @@ msgid "Command key"
msgstr "Comando"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Connect glass"
msgstr "Conectar"
msgstr "Vidro conectado"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Connect to external media server"
msgstr "Conectando ao servidor..."
msgstr "Conectando ao servidor de mídia externo..."
#: src/settings_translation_file.cpp
msgid "Connects glass if supported by node."
msgstr ""
msgstr "Conecta o vidro se isso for suportado pelo bloco."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Console alpha"
msgstr "Console"
msgstr "Console Alpha"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Console color"
msgstr "Console"
msgstr "Cor do console"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Console key"
msgstr "Console"
msgstr "Tecla do console"
#: src/settings_translation_file.cpp
msgid "Continuous forward"
msgstr ""
msgstr "Para frente continuamente"
#: src/settings_translation_file.cpp
msgid "Continuous forward movement (only used for testing)."
msgstr ""
msgstr "Movimento contínuo para frente (apenas usado para testes)."
#: src/settings_translation_file.cpp
#, fuzzy
@ -1445,81 +1462,86 @@ msgid ""
"Examples: 72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays "
"unchanged."
msgstr ""
"Controles da duração do dia.\n"
"Exemplos: 72 = 20min, 360 = 4min, 1 = 24hour, 0 = O tempo para e permanece "
"inalterado."
#: src/settings_translation_file.cpp
msgid ""
"Controls size of deserts and beaches in Mapgen v6.\n"
"When snowbiomes are enabled 'mgv6_freq_desert' is ignored."
msgstr ""
"Controla o tamanho dos desertos e das praias no Mapgen v6.\n"
"Quando \"snowbiomes\" (bioma de neve) está habilitado 'mgv6_freq_desert' é "
"ignorado."
#: src/settings_translation_file.cpp
msgid "Crash message"
msgstr ""
msgstr "Mensagem de travamento"
#: src/settings_translation_file.cpp
msgid "Crosshair alpha"
msgstr ""
msgstr "Alpha do cursor"
#: src/settings_translation_file.cpp
msgid "Crosshair alpha (opaqueness, between 0 and 255)."
msgstr ""
msgstr "Alpha do cursor (o quanto ele é opaco, níveis entre 0 e 255)."
#: src/settings_translation_file.cpp
msgid "Crosshair color"
msgstr ""
msgstr "Cor do cursor"
#: src/settings_translation_file.cpp
msgid "Crosshair color (R,G,B)."
msgstr ""
msgstr "Cor do cursor (R,G,B)."
#: src/settings_translation_file.cpp
msgid "Crouch speed"
msgstr ""
msgstr "Velocidade para descer"
#: src/settings_translation_file.cpp
msgid "DPI"
msgstr ""
msgstr "dpi"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Damage"
msgstr "Habilitar dano"
msgstr "Dano"
#: src/settings_translation_file.cpp
msgid "Debug info toggle key"
msgstr ""
msgstr "Tecla para alternar modo de Debug"
#: src/settings_translation_file.cpp
msgid "Debug log level"
msgstr ""
msgstr "Nível de log do Debug"
#: src/settings_translation_file.cpp
msgid "Dedicated server step"
msgstr ""
msgstr "Passo do servidor dedicado"
#: src/settings_translation_file.cpp
msgid "Default acceleration"
msgstr ""
msgstr "Aceleração padrão"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Default game"
msgstr "editar o jogo"
msgstr "Jogo padrão"
#: src/settings_translation_file.cpp
msgid ""
"Default game when creating a new world.\n"
"This will be overridden when creating a world from the main menu."
msgstr ""
"Padrões de jogo para quando criar um novo mundo.\n"
"Isso será sobrescrito quando criar um mundo no menu principal."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Default password"
msgstr "Nova senha"
msgstr "Senha padrão"
#: src/settings_translation_file.cpp
msgid "Default privileges"
msgstr ""
msgstr "Privilégios por padrão"
#: src/settings_translation_file.cpp
msgid ""
@ -1568,17 +1590,16 @@ msgid "Detailed mod profiling"
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Disable anticheat"
msgstr "Habilitar partículas"
msgstr "Habilitar Anti-Hack"
#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
msgstr ""
msgstr "Não permitir logar sem senha"
#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr ""
msgstr "Domínio do servidor, para ser mostrado na lista de servidores."
#: src/settings_translation_file.cpp
#, fuzzy
@ -1592,11 +1613,11 @@ msgstr "\"Pular\" duas vezes ativa o voo"
#: src/settings_translation_file.cpp
msgid "Drop item key"
msgstr ""
msgstr "Tecla para largar item"
#: src/settings_translation_file.cpp
msgid "Dump the mapgen debug infos."
msgstr ""
msgstr "Mostrar informações de depuração do Mapgen."
#: src/settings_translation_file.cpp
msgid ""
@ -1605,23 +1626,28 @@ msgid ""
"Note that this is not quite optimized and that smooth lighting on the\n"
"water surface doesn't work with this."
msgstr ""
"Habilita recurso permitindo que o nível da água seja um pouco menor, "
"portando não preenche todo o espaço disponível para bloco.\n"
"Note que isso não está bem otimizado e que suavização da iluminação na "
"superfície da água não funciona bem com esse recurso."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable mod security"
msgstr "Repositório de módulos online"
msgstr "Habilitar Mod Security (Segurança nos mods)"
#: src/settings_translation_file.cpp
msgid "Enable players getting damage and dying."
msgstr ""
msgstr "Permitir que os jogadores possam sofrer dano e morrer."
#: src/settings_translation_file.cpp
msgid "Enable random user input (only used for testing)."
msgstr ""
msgstr "Habilitar entrada de comandos aleatórios (apenas usado para testes)."
#: src/settings_translation_file.cpp
msgid "Enable selection highlighting for nodes (disables selectionbox)."
msgstr ""
"Habilitar destaque de bloco selecionado (desabilita o modo de destaque "
"selectionbox [Padrão])."
#: src/settings_translation_file.cpp
msgid ""
@ -1637,6 +1663,11 @@ msgid ""
"to new servers, but they may not support all new features that you are "
"expecting."
msgstr ""
"Habilitar recurso de não permitir que jogadores usando versões antigas do "
"cliente possam se conectar.\n"
"Essas versões são compatíveis no sentido de não travar quando conectam a "
"servidores com versões mais atuais, porém eles podem não suportar todos os "
"recursos que você está esperando."
#: src/settings_translation_file.cpp
msgid ""
@ -1666,9 +1697,8 @@ msgid "Enables caching of facedir rotated meshes."
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enables minimap."
msgstr "Habilitar dano"
msgstr "Habilitar minimapa."
#: src/settings_translation_file.cpp
msgid ""
@ -1741,17 +1771,19 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Field of view"
msgstr ""
msgstr "Campo de visão"
#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr ""
msgstr "Campo de visão em graus."
#: src/settings_translation_file.cpp
msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
"Arquivo na pasta client/serverlist/ que contém seus servidores favoritos, "
"que são mostrados na aba Multiplayer."
#: src/settings_translation_file.cpp
msgid ""

View File

@ -8,10 +8,10 @@ msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-11-08 21:23+0100\n"
"PO-Revision-Date: 2015-11-07 08:04+0000\n"
"PO-Revision-Date: 2015-12-30 16:01+0000\n"
"Last-Translator: Jun Zhang <zhangjunphy@gmail.com>\n"
"Language-Team: Chinese (China) <https://hosted.weblate.org/projects/minetest/"
"minetest/zh_CN/>\n"
"Language-Team: Chinese (China) "
"<https://hosted.weblate.org/projects/minetest/minetest/zh_CN/>\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -21,14 +21,13 @@ msgstr ""
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
msgstr ""
msgstr "Lua 脚本错误:"
#: builtin/fstk/ui.lua
msgid "An error occured:"
msgstr "错误:"
#: builtin/fstk/ui.lua
#, fuzzy
msgid "Main menu"
msgstr "主菜单"
@ -167,7 +166,7 @@ msgstr "世界名称"
#: builtin/mainmenu/dlg_create_world.lua
msgid "You have no subgames installed."
msgstr "你没有安装任何游戏"
msgstr "你没有安装任何游戏."
#: builtin/mainmenu/dlg_delete_mod.lua
msgid "Are you sure you want to delete \"$1\"?"
@ -254,9 +253,8 @@ msgid "Search"
msgstr "搜索"
#: builtin/mainmenu/store.lua
#, fuzzy
msgid "Shortname:"
msgstr "短名称"
msgstr "短名称:"
#: builtin/mainmenu/store.lua
msgid "Successfully installed:"
@ -287,9 +285,8 @@ msgid "Previous Contributors"
msgstr "前贡献者"
#: builtin/mainmenu/tab_credits.lua
#, fuzzy
msgid "Previous Core Developers"
msgstr "内部开发人员"
msgstr "前核心开发人员"
#: builtin/mainmenu/tab_mods.lua
msgid "Installed Mods:"
@ -324,9 +321,8 @@ msgid "Uninstall selected modpack"
msgstr "删除选中的MOD包"
#: builtin/mainmenu/tab_multiplayer.lua
#, fuzzy
msgid "Address / Port :"
msgstr "地址/端口"
msgstr "地址/端口:"
#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
msgid "Client"
@ -337,14 +333,12 @@ msgid "Connect"
msgstr "连接"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
#, fuzzy
msgid "Creative mode"
msgstr "创造模式"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
#, fuzzy
msgid "Damage enabled"
msgstr "启用"
msgstr "启用伤害"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_server.lua
#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp
@ -352,18 +346,16 @@ msgid "Delete"
msgstr "删除"
#: builtin/mainmenu/tab_multiplayer.lua
#, fuzzy
msgid "Name / Password :"
msgstr "名/密码"
msgstr "用户名/密码:"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "Public Serverlist"
msgstr "公共服务器列表"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
#, fuzzy
msgid "PvP enabled"
msgstr "启用"
msgstr "启用 PvP"
#: builtin/mainmenu/tab_server.lua
msgid "Bind Address"
@ -392,9 +384,8 @@ msgid "New"
msgstr "新建"
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
#, fuzzy
msgid "No world created or selected!"
msgstr "未给定世界名或未选择游戏"
msgstr "未创建或选择世界!"
#: builtin/mainmenu/tab_server.lua
msgid "Port"
@ -422,7 +413,7 @@ msgstr "启动游戏"
#: builtin/mainmenu/tab_settings.lua
msgid "\"$1\" is not a valid flag."
msgstr ""
msgstr "\"$1\" 不是合法的 flag."
#: builtin/mainmenu/tab_settings.lua
msgid "(No description of setting given)"
@ -437,28 +428,28 @@ msgid "Change keys"
msgstr "改变键位设置"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Disabled"
msgstr "禁用MOD包"
msgstr "禁用"
#: builtin/mainmenu/tab_settings.lua
msgid "Edit"
msgstr "设置"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Enabled"
msgstr "启用"
msgstr "启用"
#: builtin/mainmenu/tab_settings.lua
msgid "Format is 3 numbers separated by commas and inside brackets."
msgstr ""
msgstr "格式: (X, Y, Z)."
#: builtin/mainmenu/tab_settings.lua
msgid ""
"Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, "
"<octaves>, <persistence>"
msgstr ""
"格式: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, <octaves>, "
"<persistence>"
#: builtin/mainmenu/tab_settings.lua
msgid "Games"
@ -470,28 +461,27 @@ msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Please enter a comma seperated list of flags."
msgstr ""
msgstr "请输入 flag, 多个 flag 以半角逗号分隔."
#: builtin/mainmenu/tab_settings.lua
msgid "Please enter a valid integer."
msgstr ""
msgstr "请输入一个整数类型."
#: builtin/mainmenu/tab_settings.lua
msgid "Please enter a valid number."
msgstr ""
msgstr "请输入一个合法的数字."
#: builtin/mainmenu/tab_settings.lua
msgid "Possible values are: "
msgstr ""
msgstr "可设置的 flag: "
#: builtin/mainmenu/tab_settings.lua
msgid "Restore Default"
msgstr ""
msgstr "回复初始设置"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Select path"
msgstr "选择"
msgstr "选择路径"
#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
@ -499,20 +489,19 @@ msgstr "设置"
#: builtin/mainmenu/tab_settings.lua
msgid "Show technical names"
msgstr ""
msgstr "显示高级设置"
#: builtin/mainmenu/tab_settings.lua
msgid "The value must be greater than $1."
msgstr ""
msgstr "这个值必须大于 $1."
#: builtin/mainmenu/tab_settings.lua
msgid "The value must be lower than $1."
msgstr ""
msgstr "这个值必须小于 $1."
#: builtin/mainmenu/tab_simple_main.lua
#, fuzzy
msgid "Config mods"
msgstr "配置MOD"
msgstr "配置 MOD"
#: builtin/mainmenu/tab_simple_main.lua
#, fuzzy
@ -520,7 +509,6 @@ msgid "Main"
msgstr "主菜单"
#: builtin/mainmenu/tab_simple_main.lua
#, fuzzy
msgid "Start Singleplayer"
msgstr "单人游戏"
@ -538,47 +526,43 @@ msgstr "无资料可得"
#: builtin/mainmenu/tab_texturepacks.lua
msgid "None"
msgstr ""
msgstr ""
#: builtin/mainmenu/tab_texturepacks.lua
msgid "Select texture pack:"
msgstr "选择材质包:"
#: builtin/mainmenu/tab_texturepacks.lua
#, fuzzy
msgid "Texturepacks"
msgstr "材质包"
#: src/client.cpp
#, fuzzy
msgid "Connection timed out."
msgstr "连接出错(超时?)"
msgstr "连接超时."
#: src/client.cpp
msgid "Done!"
msgstr ""
msgstr "完成!"
#: src/client.cpp
msgid "Initializing nodes"
msgstr ""
msgstr "初始化节点中"
#: src/client.cpp
msgid "Initializing nodes..."
msgstr ""
msgstr "初始化节点..."
#: src/client.cpp
msgid "Item textures..."
msgstr "物品材质..."
#: src/client.cpp
#, fuzzy
msgid "Loading textures..."
msgstr "载入..."
msgstr "载入材质..."
#: src/client.cpp
#, fuzzy
msgid "Rebuilding shaders..."
msgstr "正在解析地址..."
msgstr "重建渲染器..."
#: src/client/clientlauncher.cpp
msgid "Connection error (timed out?)"
@ -602,11 +586,11 @@ msgstr "没有选择世界或提供地址。未执行操作。"
#: src/client/clientlauncher.cpp
msgid "Player name too long."
msgstr "玩家的名字太长了"
msgstr "玩家的名字太长了."
#: src/client/clientlauncher.cpp
msgid "Provided world path doesn't exist: "
msgstr "提供世界地址不存在"
msgstr "提供的世界路径不存在: "
#: src/fontengine.cpp
msgid "needs_fallback_font"
@ -621,9 +605,8 @@ msgstr ""
"查看 debug.txt 以获得详细信息。"
#: src/game.cpp
#, fuzzy
msgid "Change Keys"
msgstr "改键位设置"
msgstr "改键位设置"
#: src/game.cpp
msgid "Change Password"
@ -642,9 +625,8 @@ msgid "Creating client..."
msgstr "正在建立客户端..."
#: src/game.cpp
#, fuzzy
msgid "Creating server..."
msgstr "正在建立服务器...."
msgstr "建立服务器...."
#: src/game.cpp
msgid ""
@ -687,6 +669,18 @@ msgid ""
"- touch&drag, tap 2nd finger\n"
" --> place single item to slot\n"
msgstr ""
"默认按键:\n"
"菜单界面外:\n"
"- 单击: 激活按钮\n"
"- 双击: 放置/使用\n"
"- 滑动手指: 改变视角\n"
"菜单/物品栏:\n"
"- 双击 (界面区域外):\n"
" --> 关闭\n"
"- 点击物品, 然后点击栏位:\n"
" --> 移动一组物品\n"
"- 点击物品并拖动, 然后另一手指点击\n"
" --> 移动一个物品\n"
#: src/game.cpp
msgid "Exit to Menu"
@ -702,7 +696,7 @@ msgstr "物品定义..."
#: src/game.cpp
msgid "KiB/s"
msgstr ""
msgstr "KiB/s"
#: src/game.cpp
msgid "Media..."
@ -710,7 +704,7 @@ msgstr "媒体..."
#: src/game.cpp
msgid "MiB/s"
msgstr ""
msgstr "MiB/s"
#: src/game.cpp
msgid "Node definitions..."
@ -729,9 +723,8 @@ msgid "Respawn"
msgstr "重生"
#: src/game.cpp
#, fuzzy
msgid "Shutting down..."
msgstr "关闭中......"
msgstr "关闭..."
#: src/game.cpp
msgid "Sound Volume"
@ -743,7 +736,7 @@ msgstr "你死了。"
#: src/guiFormSpecMenu.cpp
msgid "Enter "
msgstr "输入"
msgstr "输入 "
#: src/guiFormSpecMenu.cpp
msgid "ok"
@ -818,9 +811,8 @@ msgid "Sneak"
msgstr "潜行"
#: src/guiKeyChangeMenu.cpp
#, fuzzy
msgid "Toggle Cinematic"
msgstr "切换快速移动模式"
msgstr "切换电影模式"
#: src/guiKeyChangeMenu.cpp
msgid "Toggle fast"
@ -1163,16 +1155,16 @@ msgid ""
"0 = parallax occlusion with slope information (faster).\n"
"1 = relief mapping (slower, more accurate)."
msgstr ""
"0 = 利用梯度信息进行视差遮蔽 (较快).\n"
"1 = 浮雕映射 (较慢, 但准确)."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "3D clouds"
msgstr "三维云彩"
msgstr "3D 云彩"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "3D mode"
msgstr "飞行模式"
msgstr "3D 模式"
#: src/settings_translation_file.cpp
msgid ""
@ -1247,7 +1239,6 @@ msgid "Ambient occlusion gamma"
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Anisotropic filtering"
msgstr "各向异性过滤"
@ -1280,7 +1271,6 @@ msgid "Basic"
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Bilinear filtering"
msgstr "双线性过滤"
@ -1360,18 +1350,16 @@ msgid "Cloud radius"
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Clouds"
msgstr "三维云彩"
msgstr "云彩"
#: src/settings_translation_file.cpp
msgid "Clouds are a client side effect."
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Clouds in menu"
msgstr "主菜单"
msgstr "主菜单显示云彩"
#: src/settings_translation_file.cpp
msgid "Colored fog"

View File

@ -388,6 +388,7 @@ set(common_SRCS
mapgen_v5.cpp
mapgen_v6.cpp
mapgen_v7.cpp
mapgen_valleys.cpp
mapnode.cpp
mapsector.cpp
mg_biome.cpp

View File

@ -646,7 +646,7 @@ void Camera::drawWieldedTool(irr::core::matrix4* translation)
scene::ICameraSceneNode* cam = m_wieldmgr->getActiveCamera();
cam->setAspectRatio(m_cameranode->getAspectRatio());
cam->setFOV(72.0*M_PI/180.0);
cam->setNearValue(0.1);
cam->setNearValue(10);
cam->setFarValue(1000);
if (translation != NULL)
{

View File

@ -43,6 +43,9 @@ CaveV5::CaveV5(Mapgen *mg, PseudoRandom *ps)
c_ice = ndef->getId("mapgen_ice");
this->np_caveliquids = &nparams_caveliquids;
this->ystride = mg->csize.X;
if (c_ice == CONTENT_IGNORE)
c_ice = CONTENT_AIR;
dswitchint = ps->range(1, 14);
flooded = ps->range(1, 2) == 2;

View File

@ -512,6 +512,9 @@ bool ClientLauncher::create_engine_device()
u16 bits = g_settings->getU16("fullscreen_bpp");
u16 fsaa = g_settings->getU16("fsaa");
// stereo buffer required for pageflip stereo
bool stereo_buffer = g_settings->get("3d_mode") == "pageflip";
// Determine driver
video::E_DRIVER_TYPE driverType = video::EDT_OPENGL;
std::string driverstring = g_settings->get("video_driver");
@ -537,9 +540,11 @@ bool ClientLauncher::create_engine_device()
params.AntiAlias = fsaa;
params.Fullscreen = fullscreen;
params.Stencilbuffer = false;
params.Stereobuffer = stereo_buffer;
params.Vsync = vsync;
params.EventReceiver = receiver;
params.HighPrecisionFPU = g_settings->getBool("high_precision_fpu");
params.ZBufferBits = 24;
#ifdef __ANDROID__
params.PrivateData = porting::app_global;
params.OGLES2ShaderPath = std::string(porting::path_user + DIR_DELIM +

View File

@ -40,7 +40,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
// The time after which the collision occurs is stored in dtime.
int axisAlignedCollision(
const aabb3f &staticbox, const aabb3f &movingbox,
const v3f &speed, f32 d, f32 &dtime)
const v3f &speed, f32 d, f32 *dtime)
{
//TimeTaker tt("axisAlignedCollision");
@ -59,13 +59,12 @@ int axisAlignedCollision(
if(speed.X > 0) // Check for collision with X- plane
{
if(relbox.MaxEdge.X <= d)
{
dtime = - relbox.MaxEdge.X / speed.X;
if((relbox.MinEdge.Y + speed.Y * dtime < ysize) &&
(relbox.MaxEdge.Y + speed.Y * dtime > COLL_ZERO) &&
(relbox.MinEdge.Z + speed.Z * dtime < zsize) &&
(relbox.MaxEdge.Z + speed.Z * dtime > COLL_ZERO))
if (relbox.MaxEdge.X <= d) {
*dtime = -relbox.MaxEdge.X / speed.X;
if ((relbox.MinEdge.Y + speed.Y * (*dtime) < ysize) &&
(relbox.MaxEdge.Y + speed.Y * (*dtime) > COLL_ZERO) &&
(relbox.MinEdge.Z + speed.Z * (*dtime) < zsize) &&
(relbox.MaxEdge.Z + speed.Z * (*dtime) > COLL_ZERO))
return 0;
}
else if(relbox.MinEdge.X > xsize)
@ -75,13 +74,12 @@ int axisAlignedCollision(
}
else if(speed.X < 0) // Check for collision with X+ plane
{
if(relbox.MinEdge.X >= xsize - d)
{
dtime = (xsize - relbox.MinEdge.X) / speed.X;
if((relbox.MinEdge.Y + speed.Y * dtime < ysize) &&
(relbox.MaxEdge.Y + speed.Y * dtime > COLL_ZERO) &&
(relbox.MinEdge.Z + speed.Z * dtime < zsize) &&
(relbox.MaxEdge.Z + speed.Z * dtime > COLL_ZERO))
if (relbox.MinEdge.X >= xsize - d) {
*dtime = (xsize - relbox.MinEdge.X) / speed.X;
if ((relbox.MinEdge.Y + speed.Y * (*dtime) < ysize) &&
(relbox.MaxEdge.Y + speed.Y * (*dtime) > COLL_ZERO) &&
(relbox.MinEdge.Z + speed.Z * (*dtime) < zsize) &&
(relbox.MaxEdge.Z + speed.Z * (*dtime) > COLL_ZERO))
return 0;
}
else if(relbox.MaxEdge.X < 0)
@ -94,13 +92,12 @@ int axisAlignedCollision(
if(speed.Y > 0) // Check for collision with Y- plane
{
if(relbox.MaxEdge.Y <= d)
{
dtime = - relbox.MaxEdge.Y / speed.Y;
if((relbox.MinEdge.X + speed.X * dtime < xsize) &&
(relbox.MaxEdge.X + speed.X * dtime > COLL_ZERO) &&
(relbox.MinEdge.Z + speed.Z * dtime < zsize) &&
(relbox.MaxEdge.Z + speed.Z * dtime > COLL_ZERO))
if (relbox.MaxEdge.Y <= d) {
*dtime = -relbox.MaxEdge.Y / speed.Y;
if ((relbox.MinEdge.X + speed.X * (*dtime) < xsize) &&
(relbox.MaxEdge.X + speed.X * (*dtime) > COLL_ZERO) &&
(relbox.MinEdge.Z + speed.Z * (*dtime) < zsize) &&
(relbox.MaxEdge.Z + speed.Z * (*dtime) > COLL_ZERO))
return 1;
}
else if(relbox.MinEdge.Y > ysize)
@ -110,13 +107,12 @@ int axisAlignedCollision(
}
else if(speed.Y < 0) // Check for collision with Y+ plane
{
if(relbox.MinEdge.Y >= ysize - d)
{
dtime = (ysize - relbox.MinEdge.Y) / speed.Y;
if((relbox.MinEdge.X + speed.X * dtime < xsize) &&
(relbox.MaxEdge.X + speed.X * dtime > COLL_ZERO) &&
(relbox.MinEdge.Z + speed.Z * dtime < zsize) &&
(relbox.MaxEdge.Z + speed.Z * dtime > COLL_ZERO))
if (relbox.MinEdge.Y >= ysize - d) {
*dtime = (ysize - relbox.MinEdge.Y) / speed.Y;
if ((relbox.MinEdge.X + speed.X * (*dtime) < xsize) &&
(relbox.MaxEdge.X + speed.X * (*dtime) > COLL_ZERO) &&
(relbox.MinEdge.Z + speed.Z * (*dtime) < zsize) &&
(relbox.MaxEdge.Z + speed.Z * (*dtime) > COLL_ZERO))
return 1;
}
else if(relbox.MaxEdge.Y < 0)
@ -129,13 +125,12 @@ int axisAlignedCollision(
if(speed.Z > 0) // Check for collision with Z- plane
{
if(relbox.MaxEdge.Z <= d)
{
dtime = - relbox.MaxEdge.Z / speed.Z;
if((relbox.MinEdge.X + speed.X * dtime < xsize) &&
(relbox.MaxEdge.X + speed.X * dtime > COLL_ZERO) &&
(relbox.MinEdge.Y + speed.Y * dtime < ysize) &&
(relbox.MaxEdge.Y + speed.Y * dtime > COLL_ZERO))
if (relbox.MaxEdge.Z <= d) {
*dtime = -relbox.MaxEdge.Z / speed.Z;
if ((relbox.MinEdge.X + speed.X * (*dtime) < xsize) &&
(relbox.MaxEdge.X + speed.X * (*dtime) > COLL_ZERO) &&
(relbox.MinEdge.Y + speed.Y * (*dtime) < ysize) &&
(relbox.MaxEdge.Y + speed.Y * (*dtime) > COLL_ZERO))
return 2;
}
//else if(relbox.MinEdge.Z > zsize)
@ -145,13 +140,12 @@ int axisAlignedCollision(
}
else if(speed.Z < 0) // Check for collision with Z+ plane
{
if(relbox.MinEdge.Z >= zsize - d)
{
dtime = (zsize - relbox.MinEdge.Z) / speed.Z;
if((relbox.MinEdge.X + speed.X * dtime < xsize) &&
(relbox.MaxEdge.X + speed.X * dtime > COLL_ZERO) &&
(relbox.MinEdge.Y + speed.Y * dtime < ysize) &&
(relbox.MaxEdge.Y + speed.Y * dtime > COLL_ZERO))
if (relbox.MinEdge.Z >= zsize - d) {
*dtime = (zsize - relbox.MinEdge.Z) / speed.Z;
if ((relbox.MinEdge.X + speed.X * (*dtime) < xsize) &&
(relbox.MaxEdge.X + speed.X * (*dtime) > COLL_ZERO) &&
(relbox.MinEdge.Y + speed.Y * (*dtime) < ysize) &&
(relbox.MaxEdge.Y + speed.Y * (*dtime) > COLL_ZERO))
return 2;
}
//else if(relbox.MaxEdge.Z < 0)
@ -195,33 +189,40 @@ bool wouldCollideWithCeiling(
collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
f32 pos_max_d, const aabb3f &box_0,
f32 stepheight, f32 dtime,
v3f &pos_f, v3f &speed_f,
v3f &accel_f,ActiveObject* self,
v3f *pos_f, v3f *speed_f,
v3f accel_f, ActiveObject *self,
bool collideWithObjects)
{
static bool time_notification_done = false;
Map *map = &env->getMap();
//TimeTaker tt("collisionMoveSimple");
ScopeProfiler sp(g_profiler, "collisionMoveSimple avg", SPT_AVG);
ScopeProfiler sp(g_profiler, "collisionMoveSimple avg", SPT_AVG);
collisionMoveResult result;
/*
Calculate new velocity
*/
if( dtime > 0.5 ) {
warningstream<<"collisionMoveSimple: maximum step interval exceeded, lost movement details!"<<std::endl;
if (dtime > 0.5) {
if (!time_notification_done) {
time_notification_done = true;
infostream << "collisionMoveSimple: maximum step interval exceeded,"
" lost movement details!"<<std::endl;
}
dtime = 0.5;
} else {
time_notification_done = false;
}
speed_f += accel_f * dtime;
*speed_f += accel_f * dtime;
// If there is no speed, there are no collisions
if(speed_f.getLength() == 0)
if (speed_f->getLength() == 0)
return result;
// Limit speed for avoiding hangs
speed_f.Y=rangelim(speed_f.Y,-5000,5000);
speed_f.X=rangelim(speed_f.X,-5000,5000);
speed_f.Z=rangelim(speed_f.Z,-5000,5000);
speed_f->Y = rangelim(speed_f->Y, -5000, 5000);
speed_f->X = rangelim(speed_f->X, -5000, 5000);
speed_f->Z = rangelim(speed_f->Z, -5000, 5000);
/*
Collect node boxes in movement range
@ -236,8 +237,8 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
//TimeTaker tt2("collisionMoveSimple collect boxes");
ScopeProfiler sp(g_profiler, "collisionMoveSimple collect boxes avg", SPT_AVG);
v3s16 oldpos_i = floatToInt(pos_f, BS);
v3s16 newpos_i = floatToInt(pos_f + speed_f * dtime, BS);
v3s16 oldpos_i = floatToInt(*pos_f, BS);
v3s16 newpos_i = floatToInt(*pos_f + *speed_f * dtime, BS);
s16 min_x = MYMIN(oldpos_i.X, newpos_i.X) + (box_0.MinEdge.X / BS) - 1;
s16 min_y = MYMIN(oldpos_i.Y, newpos_i.Y) + (box_0.MinEdge.Y / BS) - 1;
s16 min_z = MYMIN(oldpos_i.Z, newpos_i.Z) + (box_0.MinEdge.Z / BS) - 1;
@ -311,9 +312,9 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
#ifndef SERVER
ClientEnvironment *c_env = dynamic_cast<ClientEnvironment*>(env);
if (c_env != 0) {
f32 distance = speed_f.getLength();
f32 distance = speed_f->getLength();
std::vector<DistanceSortedActiveObject> clientobjects;
c_env->getActiveObjects(pos_f,distance * 1.5,clientobjects);
c_env->getActiveObjects(*pos_f, distance * 1.5, clientobjects);
for (size_t i=0; i < clientobjects.size(); i++) {
if ((self == 0) || (self != clientobjects[i].obj)) {
objects.push_back((ActiveObject*)clientobjects[i].obj);
@ -325,9 +326,9 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
{
ServerEnvironment *s_env = dynamic_cast<ServerEnvironment*>(env);
if (s_env != 0) {
f32 distance = speed_f.getLength();
f32 distance = speed_f->getLength();
std::vector<u16> s_objects;
s_env->getObjectsInsideRadius(s_objects, pos_f, distance * 1.5);
s_env->getObjectsInsideRadius(s_objects, *pos_f, distance * 1.5);
for (std::vector<u16>::iterator iter = s_objects.begin(); iter != s_objects.end(); ++iter) {
ServerActiveObject *current = s_env->getActiveObject(*iter);
if ((self == 0) || (self != current)) {
@ -392,8 +393,8 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
}
aabb3f movingbox = box_0;
movingbox.MinEdge += pos_f;
movingbox.MaxEdge += pos_f;
movingbox.MinEdge += *pos_f;
movingbox.MaxEdge += *pos_f;
int nearest_collided = -1;
f32 nearest_dtime = dtime;
@ -410,7 +411,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
// Find nearest collision of the two boxes (raytracing-like)
f32 dtime_tmp;
int collided = axisAlignedCollision(
cboxes[boxindex], movingbox, speed_f, d, dtime_tmp);
cboxes[boxindex], movingbox, *speed_f, d, &dtime_tmp);
if (collided == -1 || dtime_tmp >= nearest_dtime)
continue;
@ -422,7 +423,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
if (nearest_collided == -1) {
// No collision with any collision box.
pos_f += speed_f * dtime;
*pos_f += *speed_f * dtime;
dtime = 0; // Set to 0 to avoid "infinite" loop due to small FP numbers
} else {
// Otherwise, a collision occurred.
@ -445,14 +446,14 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
// Handle negative nearest_dtime (can be caused by the d allowance)
if (!step_up) {
if (nearest_collided == 0)
pos_f.X += speed_f.X * nearest_dtime;
pos_f->X += speed_f->X * nearest_dtime;
if (nearest_collided == 1)
pos_f.Y += speed_f.Y * nearest_dtime;
pos_f->Y += speed_f->Y * nearest_dtime;
if (nearest_collided == 2)
pos_f.Z += speed_f.Z * nearest_dtime;
pos_f->Z += speed_f->Z * nearest_dtime;
}
} else {
pos_f += speed_f * nearest_dtime;
*pos_f += *speed_f * nearest_dtime;
dtime -= nearest_dtime;
}
@ -468,7 +469,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
info.node_p = node_positions[nearest_boxindex];
info.bouncy = bouncy;
info.old_speed = speed_f;
info.old_speed = *speed_f;
// Set the speed component that caused the collision to zero
if (step_up) {
@ -476,29 +477,29 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
is_step_up[nearest_boxindex] = true;
is_collision = false;
} else if(nearest_collided == 0) { // X
if (fabs(speed_f.X) > BS * 3)
speed_f.X *= bounce;
if (fabs(speed_f->X) > BS * 3)
speed_f->X *= bounce;
else
speed_f.X = 0;
speed_f->X = 0;
result.collides = true;
result.collides_xz = true;
}
else if(nearest_collided == 1) { // Y
if(fabs(speed_f.Y) > BS * 3)
speed_f.Y *= bounce;
if (fabs(speed_f->Y) > BS * 3)
speed_f->Y *= bounce;
else
speed_f.Y = 0;
speed_f->Y = 0;
result.collides = true;
} else if(nearest_collided == 2) { // Z
if (fabs(speed_f.Z) > BS * 3)
speed_f.Z *= bounce;
if (fabs(speed_f->Z) > BS * 3)
speed_f->Z *= bounce;
else
speed_f.Z = 0;
speed_f->Z = 0;
result.collides = true;
result.collides_xz = true;
}
info.new_speed = speed_f;
info.new_speed = *speed_f;
if (info.new_speed.getDistanceFrom(info.old_speed) < 0.1 * BS)
is_collision = false;
@ -512,8 +513,8 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
Final touches: Check if standing on ground, step up stairs.
*/
aabb3f box = box_0;
box.MinEdge += pos_f;
box.MaxEdge += pos_f;
box.MinEdge += *pos_f;
box.MaxEdge += *pos_f;
for (u32 boxindex = 0; boxindex < cboxes.size(); boxindex++) {
const aabb3f& cbox = cboxes[boxindex];
@ -530,10 +531,10 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
cbox.MaxEdge.Z - d > box.MinEdge.Z &&
cbox.MinEdge.Z + d < box.MaxEdge.Z) {
if (is_step_up[boxindex]) {
pos_f.Y += (cbox.MaxEdge.Y - box.MinEdge.Y);
pos_f->Y += (cbox.MaxEdge.Y - box.MinEdge.Y);
box = box_0;
box.MinEdge += pos_f;
box.MaxEdge += pos_f;
box.MinEdge += *pos_f;
box.MaxEdge += *pos_f;
}
if (fabs(cbox.MaxEdge.Y - box.MinEdge.Y) < 0.15 * BS) {
result.touching_ground = true;

View File

@ -73,8 +73,8 @@ struct collisionMoveResult
collisionMoveResult collisionMoveSimple(Environment *env,IGameDef *gamedef,
f32 pos_max_d, const aabb3f &box_0,
f32 stepheight, f32 dtime,
v3f &pos_f, v3f &speed_f,
v3f &accel_f,ActiveObject* self=0,
v3f *pos_f, v3f *speed_f,
v3f accel_f, ActiveObject *self=NULL,
bool collideWithObjects=true);
// Helper function:
@ -83,7 +83,7 @@ collisionMoveResult collisionMoveSimple(Environment *env,IGameDef *gamedef,
// dtime receives time until first collision, invalid if -1 is returned
int axisAlignedCollision(
const aabb3f &staticbox, const aabb3f &movingbox,
const v3f &speed, f32 d, f32 &dtime);
const v3f &speed, f32 d, f32 *dtime);
// Helper function:
// Checks if moving the movingbox up by the given distance would hit a ceiling.

View File

@ -1192,15 +1192,13 @@ void GenericCAO::step(float dtime, ClientEnvironment *env)
f32 pos_max_d = BS*0.125; // Distance per iteration
v3f p_pos = m_position;
v3f p_velocity = m_velocity;
v3f p_acceleration = m_acceleration;
moveresult = collisionMoveSimple(env,env->getGameDef(),
pos_max_d, box, m_prop.stepheight, dtime,
p_pos, p_velocity, p_acceleration,
&p_pos, &p_velocity, m_acceleration,
this, m_prop.collideWithObjects);
// Apply results
m_position = p_pos;
m_velocity = p_velocity;
m_acceleration = p_acceleration;
bool is_end_position = moveresult.collides;
pos_translator.update(m_position, is_end_position, dtime);

View File

@ -201,6 +201,11 @@ public:
float time_from_last_punch=1000000);
std::string debugInfoText();
std::string infoText()
{
return m_prop.infotext;
}
};

View File

@ -269,7 +269,7 @@ void LuaEntitySAO::step(float dtime, bool send_recommended)
v3f p_acceleration = m_acceleration;
moveresult = collisionMoveSimple(m_env,m_env->getGameDef(),
pos_max_d, box, m_prop.stepheight, dtime,
p_pos, p_velocity, p_acceleration,
&p_pos, &p_velocity, p_acceleration,
this, m_prop.collideWithObjects);
// Apply results

View File

@ -52,7 +52,13 @@ Json::Value fetchJsonValue(const std::string &url,
if (!reader.parse(stream, root)) {
errorstream << "URL: " << url << std::endl;
errorstream << "Failed to parse json data " << reader.getFormattedErrorMessages();
errorstream << "data: \"" << fetch_result.data << "\"" << std::endl;
if (fetch_result.data.size() > 100) {
errorstream << "Data (" << fetch_result.data.size()
<< " bytes) printed to warningstream." << std::endl;
warningstream << "data: \"" << fetch_result.data << "\"" << std::endl;
} else {
errorstream << "data: \"" << fetch_result.data << "\"" << std::endl;
}
return Json::Value();
}

View File

@ -47,6 +47,7 @@ bool Database_Dummy::deleteBlock(const v3s16 &pos)
void Database_Dummy::listAllLoadableBlocks(std::vector<v3s16> &dst)
{
dst.reserve(m_database.size());
for (std::map<s64, std::string>::const_iterator x = m_database.begin();
x != m_database.end(); ++x) {
dst.push_back(getIntegerAsBlock(x->first));

View File

@ -92,7 +92,7 @@ bool Database_Redis::saveBlock(const v3s16 &pos, const std::string &data)
if (reply->type == REDIS_REPLY_ERROR) {
warningstream << "saveBlock: saving block " << PP(pos)
<< " failed: " << reply->str << std::endl;
<< " failed: " << std::string(reply->str, reply->len) << std::endl;
freeReplyObject(reply);
return false;
}
@ -119,7 +119,7 @@ std::string Database_Redis::loadBlock(const v3s16 &pos)
return str;
}
case REDIS_REPLY_ERROR: {
std::string errstr = reply->str;
std::string errstr(reply->str, reply->len);
freeReplyObject(reply);
errorstream << "loadBlock: loading block " << PP(pos)
<< " failed: " << errstr << std::endl;
@ -134,7 +134,7 @@ std::string Database_Redis::loadBlock(const v3s16 &pos)
}
errorstream << "loadBlock: loading block " << PP(pos)
<< " returned invalid reply type " << reply->type
<< ": " << reply->str << std::endl;
<< ": " << std::string(reply->str, reply->len) << std::endl;
freeReplyObject(reply);
throw FileNotGoodException(std::string(
"Redis command 'HGET %s %s' gave invalid reply."));
@ -151,7 +151,7 @@ bool Database_Redis::deleteBlock(const v3s16 &pos)
"Redis command 'HDEL %s %s' failed: ") + ctx->errstr);
} else if (reply->type == REDIS_REPLY_ERROR) {
warningstream << "deleteBlock: deleting block " << PP(pos)
<< " failed: " << reply->str << std::endl;
<< " failed: " << std::string(reply->str, reply->len) << std::endl;
freeReplyObject(reply);
return false;
}
@ -169,13 +169,16 @@ void Database_Redis::listAllLoadableBlocks(std::vector<v3s16> &dst)
}
switch (reply->type) {
case REDIS_REPLY_ARRAY:
dst.reserve(reply->elements);
for (size_t i = 0; i < reply->elements; i++) {
assert(reply->element[i]->type == REDIS_REPLY_STRING);
dst.push_back(getIntegerAsBlock(stoi64(reply->element[i]->str)));
}
break;
case REDIS_REPLY_ERROR:
throw FileNotGoodException(std::string(
"Failed to get keys from database: ") + reply->str);
"Failed to get keys from database: ") +
std::string(reply->str, reply->len));
}
freeReplyObject(reply);
}

View File

@ -31,31 +31,79 @@ SQLite format specification:
#include "filesys.h"
#include "exceptions.h"
#include "settings.h"
#include "porting.h"
#include "util/string.h"
#include <cassert>
// When to print messages when the database is being held locked by another process
// Note: I've seen occasional delays of over 250ms while running minetestmapper.
#define BUSY_INFO_TRESHOLD 100 // Print first informational message after 100ms.
#define BUSY_WARNING_TRESHOLD 250 // Print warning message after 250ms. Lag is increased.
#define BUSY_ERROR_TRESHOLD 1000 // Print error message after 1000ms. Significant lag.
#define BUSY_FATAL_TRESHOLD 3000 // Allow SQLITE_BUSY to be returned, which will cause a minetest crash.
#define BUSY_ERROR_INTERVAL 10000 // Safety net: report again every 10 seconds
#define SQLRES(s, r) \
#define SQLRES(s, r, m) \
if ((s) != (r)) { \
throw FileNotGoodException(std::string(\
"SQLite3 database error (" \
__FILE__ ":" TOSTRING(__LINE__) \
"): ") +\
throw FileNotGoodException(std::string(m) + ": " +\
sqlite3_errmsg(m_database)); \
}
#define SQLOK(s) SQLRES(s, SQLITE_OK)
#define SQLOK(s, m) SQLRES(s, SQLITE_OK, m)
#define PREPARE_STATEMENT(name, query) \
SQLOK(sqlite3_prepare_v2(m_database, query, -1, &m_stmt_##name, NULL))
SQLOK(sqlite3_prepare_v2(m_database, query, -1, &m_stmt_##name, NULL),\
"Failed to prepare query '" query "'")
#define FINALIZE_STATEMENT(statement) \
if (sqlite3_finalize(statement) != SQLITE_OK) { \
throw FileNotGoodException(std::string( \
"SQLite3: Failed to finalize " #statement ": ") + \
sqlite3_errmsg(m_database)); \
SQLOK(sqlite3_finalize(statement), "Failed to finalize " #statement)
int Database_SQLite3::busyHandler(void *data, int count)
{
s64 &first_time = reinterpret_cast<s64 *>(data)[0];
s64 &prev_time = reinterpret_cast<s64 *>(data)[1];
s64 cur_time = getTimeMs();
if (count == 0) {
first_time = cur_time;
prev_time = first_time;
} else {
while (cur_time < prev_time)
cur_time += s64(1)<<32;
}
if (cur_time - first_time < BUSY_INFO_TRESHOLD) {
; // do nothing
} else if (cur_time - first_time >= BUSY_INFO_TRESHOLD &&
prev_time - first_time < BUSY_INFO_TRESHOLD) {
infostream << "SQLite3 database has been locked for "
<< cur_time - first_time << " ms." << std::endl;
} else if (cur_time - first_time >= BUSY_WARNING_TRESHOLD &&
prev_time - first_time < BUSY_WARNING_TRESHOLD) {
warningstream << "SQLite3 database has been locked for "
<< cur_time - first_time << " ms." << std::endl;
} else if (cur_time - first_time >= BUSY_ERROR_TRESHOLD &&
prev_time - first_time < BUSY_ERROR_TRESHOLD) {
errorstream << "SQLite3 database has been locked for "
<< cur_time - first_time << " ms; this causes lag." << std::endl;
} else if (cur_time - first_time >= BUSY_FATAL_TRESHOLD &&
prev_time - first_time < BUSY_FATAL_TRESHOLD) {
errorstream << "SQLite3 database has been locked for "
<< cur_time - first_time << " ms - giving up!" << std::endl;
} else if ((cur_time - first_time) / BUSY_ERROR_INTERVAL !=
(prev_time - first_time) / BUSY_ERROR_INTERVAL) {
// Safety net: keep reporting every BUSY_ERROR_INTERVAL
errorstream << "SQLite3 database has been locked for "
<< (cur_time - first_time) / 1000 << " seconds!" << std::endl;
}
prev_time = cur_time;
// Make sqlite transaction fail if delay exceeds BUSY_FATAL_TRESHOLD
return cur_time - first_time < BUSY_FATAL_TRESHOLD;
}
Database_SQLite3::Database_SQLite3(const std::string &savedir) :
m_initialized(false),
@ -72,13 +120,15 @@ Database_SQLite3::Database_SQLite3(const std::string &savedir) :
void Database_SQLite3::beginSave() {
verifyDatabase();
SQLRES(sqlite3_step(m_stmt_begin), SQLITE_DONE);
SQLRES(sqlite3_step(m_stmt_begin), SQLITE_DONE,
"Failed to start SQLite3 transaction");
sqlite3_reset(m_stmt_begin);
}
void Database_SQLite3::endSave() {
verifyDatabase();
SQLRES(sqlite3_step(m_stmt_end), SQLITE_DONE);
SQLRES(sqlite3_step(m_stmt_end), SQLITE_DONE,
"Failed to commit SQLite3 transaction");
sqlite3_reset(m_stmt_end);
}
@ -99,13 +149,12 @@ void Database_SQLite3::openDatabase()
bool needs_create = !fs::PathExists(dbp);
if (sqlite3_open_v2(dbp.c_str(), &m_database,
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
NULL) != SQLITE_OK) {
errorstream << "SQLite3 database failed to open: "
<< sqlite3_errmsg(m_database) << std::endl;
throw FileNotGoodException("Cannot open database file");
}
SQLOK(sqlite3_open_v2(dbp.c_str(), &m_database,
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL),
std::string("Failed to open SQLite3 database file ") + dbp);
SQLOK(sqlite3_busy_handler(m_database, Database_SQLite3::busyHandler,
m_busy_handler_data), "Failed to set SQLite3 busy handler");
if (needs_create) {
createDatabase();
@ -113,7 +162,8 @@ void Database_SQLite3::openDatabase()
std::string query_str = std::string("PRAGMA synchronous = ")
+ itos(g_settings->getU16("sqlite_synchronous"));
SQLOK(sqlite3_exec(m_database, query_str.c_str(), NULL, NULL, NULL));
SQLOK(sqlite3_exec(m_database, query_str.c_str(), NULL, NULL, NULL),
"Failed to modify sqlite3 synchronous mode");
}
void Database_SQLite3::verifyDatabase()
@ -140,7 +190,8 @@ void Database_SQLite3::verifyDatabase()
inline void Database_SQLite3::bindPos(sqlite3_stmt *stmt, const v3s16 &pos, int index)
{
SQLOK(sqlite3_bind_int64(stmt, index, getBlockAsInteger(pos)));
SQLOK(sqlite3_bind_int64(stmt, index, getBlockAsInteger(pos)),
"Internal error: failed to bind query at " __FILE__ ":" TOSTRING(__LINE__));
}
bool Database_SQLite3::deleteBlock(const v3s16 &pos)
@ -177,9 +228,10 @@ bool Database_SQLite3::saveBlock(const v3s16 &pos, const std::string &data)
#endif
bindPos(m_stmt_write, pos);
SQLOK(sqlite3_bind_blob(m_stmt_write, 2, data.data(), data.size(), NULL));
SQLOK(sqlite3_bind_blob(m_stmt_write, 2, data.data(), data.size(), NULL),
"Internal error: failed to bind query at " __FILE__ ":" TOSTRING(__LINE__));
SQLRES(sqlite3_step(m_stmt_write), SQLITE_DONE)
SQLRES(sqlite3_step(m_stmt_write), SQLITE_DONE, "Failed to save block")
sqlite3_reset(m_stmt_write);
return true;
@ -217,7 +269,8 @@ void Database_SQLite3::createDatabase()
" `pos` INT PRIMARY KEY,\n"
" `data` BLOB\n"
");\n",
NULL, NULL, NULL));
NULL, NULL, NULL),
"Failed to create database table");
}
void Database_SQLite3::listAllLoadableBlocks(std::vector<v3s16> &dst)
@ -239,10 +292,6 @@ Database_SQLite3::~Database_SQLite3()
FINALIZE_STATEMENT(m_stmt_end)
FINALIZE_STATEMENT(m_stmt_delete)
if (sqlite3_close(m_database) != SQLITE_OK) {
errorstream << "Database_SQLite3::~Database_SQLite3(): "
<< "Failed to close database: "
<< sqlite3_errmsg(m_database) << std::endl;
}
SQLOK(sqlite3_close(m_database), "Failed to close database");
}

View File

@ -63,6 +63,10 @@ private:
sqlite3_stmt *m_stmt_delete;
sqlite3_stmt *m_stmt_begin;
sqlite3_stmt *m_stmt_end;
s64 m_busy_handler_data[2];
static int busyHandler(void *data, int count);
};
#endif

View File

@ -404,6 +404,84 @@ void draw_top_bottom_3d_mode(Camera& camera, bool show_hud,
camera.getCameraNode()->setTarget(oldTarget);
}
void draw_pageflip_3d_mode(Camera& camera, bool show_hud,
Hud& hud, std::vector<aabb3f> hilightboxes, video::IVideoDriver* driver,
scene::ISceneManager* smgr, const v2u32& screensize,
bool draw_wield_tool, Client& client, gui::IGUIEnvironment* guienv,
video::SColor skycolor)
{
/* preserve old setup*/
irr::core::vector3df oldPosition = camera.getCameraNode()->getPosition();
irr::core::vector3df oldTarget = camera.getCameraNode()->getTarget();
irr::core::matrix4 startMatrix =
camera.getCameraNode()->getAbsoluteTransformation();
irr::core::vector3df focusPoint = (camera.getCameraNode()->getTarget()
- camera.getCameraNode()->getAbsolutePosition()).setLength(1)
+ camera.getCameraNode()->getAbsolutePosition();
//Left eye...
driver->setRenderTarget(irr::video::ERT_STEREO_LEFT_BUFFER);
irr::core::vector3df leftEye;
irr::core::matrix4 leftMove;
leftMove.setTranslation(
irr::core::vector3df(-g_settings->getFloat("3d_paralax_strength"),
0.0f, 0.0f));
leftEye = (startMatrix * leftMove).getTranslation();
//clear the depth buffer, and color
driver->beginScene(true, true, irr::video::SColor(200, 200, 200, 255));
camera.getCameraNode()->setPosition(leftEye);
camera.getCameraNode()->setTarget(focusPoint);
smgr->drawAll();
driver->setTransform(video::ETS_WORLD, core::IdentityMatrix);
if (show_hud) {
draw_selectionbox(driver, hud, hilightboxes, show_hud);
if (draw_wield_tool)
camera.drawWieldedTool(&leftMove);
hud.drawHotbar(client.getPlayerItem());
hud.drawLuaElements(camera.getOffset());
}
guienv->drawAll();
//Right eye...
driver->setRenderTarget(irr::video::ERT_STEREO_RIGHT_BUFFER);
irr::core::vector3df rightEye;
irr::core::matrix4 rightMove;
rightMove.setTranslation(
irr::core::vector3df(g_settings->getFloat("3d_paralax_strength"),
0.0f, 0.0f));
rightEye = (startMatrix * rightMove).getTranslation();
//clear the depth buffer, and color
driver->beginScene(true, true, irr::video::SColor(200, 200, 200, 255));
camera.getCameraNode()->setPosition(rightEye);
camera.getCameraNode()->setTarget(focusPoint);
smgr->drawAll();
driver->setTransform(video::ETS_WORLD, core::IdentityMatrix);
if (show_hud) {
draw_selectionbox(driver, hud, hilightboxes, show_hud);
if (draw_wield_tool)
camera.drawWieldedTool(&rightMove);
hud.drawHotbar(client.getPlayerItem());
hud.drawLuaElements(camera.getOffset());
}
guienv->drawAll();
camera.getCameraNode()->setPosition(oldPosition);
camera.getCameraNode()->setTarget(oldTarget);
}
void draw_plain(Camera& camera, bool show_hud, Hud& hud,
std::vector<aabb3f> hilightboxes, video::IVideoDriver* driver,
bool draw_wield_tool, Client& client, gui::IGUIEnvironment* guienv)
@ -466,6 +544,13 @@ void draw_scene(video::IVideoDriver *driver, scene::ISceneManager *smgr,
smgr, screensize, draw_wield_tool, client, guienv, skycolor);
show_hud = false;
}
else if (draw_mode == "pageflip")
{
draw_pageflip_3d_mode(camera, show_hud, hud, hilightboxes, driver,
smgr, screensize, draw_wield_tool, client, guienv, skycolor);
draw_crosshair = false;
show_hud = false;
}
else {
draw_plain(camera, show_hud, hud, hilightboxes, driver,
draw_wield_tool, client, guienv);

View File

@ -68,6 +68,8 @@ DungeonGen::DungeonGen(Mapgen *mapgen, DungeonParams *dparams)
// For mapgens using river water
dp.c_river_water = mg->ndef->getId("mapgen_river_water_source");
if (dp.c_river_water == CONTENT_IGNORE)
dp.c_river_water = mg->ndef->getId("mapgen_water_source");
}

View File

@ -39,6 +39,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "mapgen_v5.h"
#include "mapgen_v6.h"
#include "mapgen_v7.h"
#include "mapgen_valleys.h"
#include "mapgen_singlenode.h"
#include "mg_biome.h"
#include "mg_ore.h"
@ -106,8 +107,9 @@ MapgenDesc g_reg_mapgens[] = {
{"v5", new MapgenFactoryV5, true},
{"v6", new MapgenFactoryV6, true},
{"v7", new MapgenFactoryV7, true},
{"flat", new MapgenFactoryFlat, false},
{"flat", new MapgenFactoryFlat, true},
{"fractal", new MapgenFactoryFractal, true},
{"valleys", new MapgenFactoryValleys, true},
{"singlenode", new MapgenFactorySinglenode, false},
};
@ -290,14 +292,18 @@ bool EmergeManager::enqueueBlockEmergeEx(
void *callback_param)
{
EmergeThread *thread = NULL;
bool entry_already_exists = false;
{
MutexAutoLock queuelock(m_queue_mutex);
if (!pushBlockEmergeData(blockpos, peer_id, flags,
callback, callback_param))
callback, callback_param, &entry_already_exists))
return false;
if (entry_already_exists)
return true;
thread = getOptimalThread();
thread->pushBlock(blockpos);
}
@ -380,7 +386,8 @@ bool EmergeManager::pushBlockEmergeData(
u16 peer_requested,
u16 flags,
EmergeCompletionCallback callback,
void *callback_param)
void *callback_param,
bool *entry_already_exists)
{
u16 &count_peer = m_peer_queue_count[peer_requested];
@ -400,12 +407,12 @@ bool EmergeManager::pushBlockEmergeData(
findres = m_blocks_enqueued.insert(std::make_pair(pos, BlockEmergeData()));
BlockEmergeData &bedata = findres.first->second;
bool update_existing = !findres.second;
*entry_already_exists = !findres.second;
if (callback)
bedata.callbacks.push_back(std::make_pair(callback, callback_param));
if (update_existing) {
if (*entry_already_exists) {
bedata.flags |= flags;
} else {
bedata.flags = flags;

View File

@ -159,8 +159,15 @@ private:
// Requires m_queue_mutex held
EmergeThread *getOptimalThread();
bool pushBlockEmergeData(v3s16 pos, u16 peer_requested, u16 flags,
EmergeCompletionCallback callback, void *callback_param);
bool pushBlockEmergeData(
v3s16 pos,
u16 peer_requested,
u16 flags,
EmergeCompletionCallback callback,
void *callback_param,
bool *entry_already_exists);
bool popBlockEmergeData(v3s16 pos, BlockEmergeData *bedata);
friend class EmergeThread;

View File

@ -693,13 +693,22 @@ bool safeWriteToFile(const std::string &path, const std::string &content)
os.flush();
os.close();
if (os.fail()) {
// Remove the temporary file because writing it failed and it's useless.
remove(tmp_file.c_str());
return false;
}
// Copy file
// Move the finished temporary file over the real file
#ifdef _WIN32
// On POSIX compliant systems rename() is specified to be able to swap the
// file in place of the destination file, making this a truly error-proof
// transaction.
// However, on Windows, the target file has to be removed first.
remove(path.c_str());
#endif
if(rename(tmp_file.c_str(), path.c_str())) {
// Remove the temporary file because moving it over the target file
// failed.
remove(tmp_file.c_str());
return false;
} else {

View File

@ -1824,7 +1824,9 @@ void Game::run()
&& client->checkPrivilege("fast");
#endif
while (device->run() && !(*kill || g_gamecallback->shutdown_requested)) {
while (device->run()
&& !(*kill || g_gamecallback->shutdown_requested
|| (server && server->getShutdownRequested()))) {
/* Must be called immediately after a device->run() call because it
* uses device->getTimer()->getTime()
@ -1878,6 +1880,10 @@ void Game::run()
void Game::shutdown()
{
if (g_settings->get("3d_mode") == "pageflip") {
driver->setRenderTarget(irr::video::ERT_STEREO_BOTH_BUFFERS);
}
showOverlayMessage(wgettext("Shutting down..."), 0, 0, false);
if (clouds)
@ -3751,8 +3757,11 @@ void Game::handlePointingAtObject(GameRunData *runData,
{
infotext = utf8_to_wide(runData->selected_object->infoText());
if (infotext == L"" && show_debug) {
infotext = utf8_to_wide(runData->selected_object->debugInfoText());
if (show_debug) {
if (infotext != L"") {
infotext += L"\n";
}
infotext += utf8_to_wide(runData->selected_object->debugInfoText());
}
if (input->getLeftState()) {

View File

@ -214,8 +214,8 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d,
v3f accel_f = v3f(0,0,0);
collisionMoveResult result = collisionMoveSimple(env, m_gamedef,
pos_max_d, m_collisionbox, player_stepheight, dtime,
position, m_speed, accel_f);
pos_max_d, m_collisionbox, player_stepheight, dtime,
&position, &m_speed, accel_f);
/*
If the player's feet touch the topside of any node, this is

View File

@ -1654,10 +1654,10 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks)
loop_max *= m_transforming_liquid_loop_count_multiplier;
#endif
while(m_transforming_liquid.size() != 0)
while (m_transforming_liquid.size() != 0)
{
// This should be done here so that it is done when continue is used
if(loopcount >= initial_size || loopcount >= loop_max)
if (loopcount >= initial_size || loopcount >= loop_max)
break;
loopcount++;
@ -1674,21 +1674,24 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks)
*/
s8 liquid_level = -1;
content_t liquid_kind = CONTENT_IGNORE;
LiquidType liquid_type = nodemgr->get(n0).liquid_type;
content_t floodable_node = CONTENT_AIR;
ContentFeatures cf = nodemgr->get(n0);
LiquidType liquid_type = cf.liquid_type;
switch (liquid_type) {
case LIQUID_SOURCE:
liquid_level = LIQUID_LEVEL_SOURCE;
liquid_kind = nodemgr->getId(nodemgr->get(n0).liquid_alternative_flowing);
liquid_kind = nodemgr->getId(cf.liquid_alternative_flowing);
break;
case LIQUID_FLOWING:
liquid_level = (n0.param2 & LIQUID_LEVEL_MASK);
liquid_kind = n0.getContent();
break;
case LIQUID_NONE:
// if this is an air node, it *could* be transformed into a liquid. otherwise,
// continue with the next node.
if (n0.getContent() != CONTENT_AIR)
// if this node is 'floodable', it *could* be transformed
// into a liquid, otherwise, continue with the next node.
if (!cf.floodable)
continue;
floodable_node = n0.getContent();
liquid_kind = CONTENT_AIR;
break;
}
@ -1718,9 +1721,10 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks)
}
v3s16 npos = p0 + dirs[i];
NodeNeighbor nb(getNodeNoEx(npos), nt, npos);
ContentFeatures cfnb = nodemgr->get(nb.n);
switch (nodemgr->get(nb.n.getContent()).liquid_type) {
case LIQUID_NONE:
if (nb.n.getContent() == CONTENT_AIR) {
if (cfnb.floodable) {
airs[num_airs++] = nb;
// if the current node is a water source the neighbor
// should be enqueded for transformation regardless of whether the
@ -1728,18 +1732,21 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks)
if (nb.t != NEIGHBOR_UPPER && liquid_type != LIQUID_NONE)
m_transforming_liquid.push_back(npos);
// if the current node happens to be a flowing node, it will start to flow down here.
if (nb.t == NEIGHBOR_LOWER) {
if (nb.t == NEIGHBOR_LOWER)
flowing_down = true;
}
} else {
neutrals[num_neutrals++] = nb;
// If neutral below is ignore prevent water spreading outwards
if (nb.t == NEIGHBOR_LOWER &&
nb.n.getContent() == CONTENT_IGNORE)
flowing_down = true;
}
break;
case LIQUID_SOURCE:
// if this node is not (yet) of a liquid type, choose the first liquid type we encounter
if (liquid_kind == CONTENT_AIR)
liquid_kind = nodemgr->getId(nodemgr->get(nb.n).liquid_alternative_flowing);
if (nodemgr->getId(nodemgr->get(nb.n).liquid_alternative_flowing) != liquid_kind) {
liquid_kind = nodemgr->getId(cfnb.liquid_alternative_flowing);
if (nodemgr->getId(cfnb.liquid_alternative_flowing) != liquid_kind) {
neutrals[num_neutrals++] = nb;
} else {
// Do not count bottom source, it will screw things up
@ -1750,8 +1757,8 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks)
case LIQUID_FLOWING:
// if this node is not (yet) of a liquid type, choose the first liquid type we encounter
if (liquid_kind == CONTENT_AIR)
liquid_kind = nodemgr->getId(nodemgr->get(nb.n).liquid_alternative_flowing);
if (nodemgr->getId(nodemgr->get(nb.n).liquid_alternative_flowing) != liquid_kind) {
liquid_kind = nodemgr->getId(cfnb.liquid_alternative_flowing);
if (nodemgr->getId(cfnb.liquid_alternative_flowing) != liquid_kind) {
neutrals[num_neutrals++] = nb;
} else {
flows[num_flows++] = nb;
@ -1770,8 +1777,8 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks)
s8 max_node_level = -1;
u8 range = nodemgr->get(liquid_kind).liquid_range;
if (range > LIQUID_LEVEL_MAX+1)
range = LIQUID_LEVEL_MAX+1;
if (range > LIQUID_LEVEL_MAX + 1)
range = LIQUID_LEVEL_MAX + 1;
if ((num_sources >= 2 && nodemgr->get(liquid_kind).liquid_renewable) || liquid_type == LIQUID_SOURCE) {
// liquid_kind will be set to either the flowing alternative of the node (if it's a liquid)
@ -1780,10 +1787,11 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks)
new_node_content = nodemgr->getId(nodemgr->get(liquid_kind).liquid_alternative_source);
} else if (num_sources >= 1 && sources[0].t != NEIGHBOR_LOWER) {
// liquid_kind is set properly, see above
new_node_content = liquid_kind;
max_node_level = new_node_level = LIQUID_LEVEL_MAX;
if (new_node_level < (LIQUID_LEVEL_MAX+1-range))
new_node_content = CONTENT_AIR;
if (new_node_level >= (LIQUID_LEVEL_MAX + 1 - range))
new_node_content = liquid_kind;
else
new_node_content = floodable_node;
} else {
// no surrounding sources, so get the maximum level that can flow into this node
for (u16 i = 0; i < num_flows; i++) {
@ -1794,16 +1802,16 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks)
max_node_level = LIQUID_LEVEL_MAX;
if (nb_liquid_level + WATER_DROP_BOOST < LIQUID_LEVEL_MAX)
max_node_level = nb_liquid_level + WATER_DROP_BOOST;
} else if (nb_liquid_level > max_node_level)
} else if (nb_liquid_level > max_node_level) {
max_node_level = nb_liquid_level;
}
break;
case NEIGHBOR_LOWER:
break;
case NEIGHBOR_SAME_LEVEL:
if ((flows[i].n.param2 & LIQUID_FLOW_DOWN_MASK) != LIQUID_FLOW_DOWN_MASK &&
nb_liquid_level > 0 && nb_liquid_level - 1 > max_node_level) {
nb_liquid_level > 0 && nb_liquid_level - 1 > max_node_level)
max_node_level = nb_liquid_level - 1;
}
break;
}
}
@ -1821,23 +1829,25 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks)
new_node_level = liquid_level + 1;
if (new_node_level != max_node_level)
must_reflow.push_back(p0);
} else
} else {
new_node_level = max_node_level;
}
if (max_node_level >= (LIQUID_LEVEL_MAX+1-range))
if (max_node_level >= (LIQUID_LEVEL_MAX + 1 - range))
new_node_content = liquid_kind;
else
new_node_content = CONTENT_AIR;
new_node_content = floodable_node;
}
/*
check if anything has changed. if not, just continue with the next node.
*/
if (new_node_content == n0.getContent() && (nodemgr->get(n0.getContent()).liquid_type != LIQUID_FLOWING ||
((n0.param2 & LIQUID_LEVEL_MASK) == (u8)new_node_level &&
((n0.param2 & LIQUID_FLOW_DOWN_MASK) == LIQUID_FLOW_DOWN_MASK)
== flowing_down)))
if (new_node_content == n0.getContent() &&
(nodemgr->get(n0.getContent()).liquid_type != LIQUID_FLOWING ||
((n0.param2 & LIQUID_LEVEL_MASK) == (u8)new_node_level &&
((n0.param2 & LIQUID_FLOW_DOWN_MASK) == LIQUID_FLOW_DOWN_MASK)
== flowing_down)))
continue;
@ -1857,11 +1867,10 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks)
// Find out whether there is a suspect for this action
std::string suspect;
if(m_gamedef->rollback()) {
if (m_gamedef->rollback())
suspect = m_gamedef->rollback()->getSuspect(p0, 83, 1);
}
if(m_gamedef->rollback() && !suspect.empty()){
if (m_gamedef->rollback() && !suspect.empty()) {
// Blame suspect
RollbackScopeActor rollback_scope(m_gamedef->rollback(), suspect, true);
// Get old node for rollback
@ -1880,10 +1889,10 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks)
v3s16 blockpos = getNodeBlockPos(p0);
MapBlock *block = getBlockNoCreateNoEx(blockpos);
if(block != NULL) {
if (block != NULL) {
modified_blocks[blockpos] = block;
// If new or old node emits light, MapBlock requires lighting update
if(nodemgr->get(n0).light_source != 0 ||
if (nodemgr->get(n0).light_source != 0 ||
nodemgr->get(n00).light_source != 0)
lighting_modified_blocks[block->getPos()] = block;
}

View File

@ -551,20 +551,39 @@ void MapgenFlat::dustTopNodes()
void MapgenFlat::generateCaves(s16 max_stone_y)
{
if (max_stone_y >= node_min.Y) {
u32 index = 0;
v3s16 em = vm->m_area.getExtent();
u32 index2d = 0;
u32 index3d;
for (s16 z = node_min.Z; z <= node_max.Z; z++)
for (s16 y = node_min.Y - 1; y <= node_max.Y + 1; y++) {
u32 vi = vm->m_area.index(node_min.X, y, z);
for (s16 x = node_min.X; x <= node_max.X; x++, vi++, index++) {
float d1 = contour(noise_cave1->result[index]);
float d2 = contour(noise_cave2->result[index]);
if (d1 * d2 > 0.3f) {
content_t c = vm->m_data[vi].getContent();
if (!ndef->get(c).is_ground_content || c == CONTENT_AIR)
continue;
for (s16 x = node_min.X; x <= node_max.X; x++, index2d++) {
bool open = false; // Is column open to overground
u32 vi = vm->m_area.index(x, node_max.Y + 1, z);
index3d = (z - node_min.Z) * zstride + (csize.Y + 1) * ystride +
(x - node_min.X);
// Biome of column
Biome *biome = (Biome *)bmgr->getRaw(biomemap[index2d]);
for (s16 y = node_max.Y + 1; y >= node_min.Y - 1;
y--, index3d -= ystride, vm->m_area.add_y(em, vi, -1)) {
content_t c = vm->m_data[vi].getContent();
if (c == CONTENT_AIR || c == biome->c_water_top ||
c == biome->c_water) {
open = true;
continue;
}
// Ground
float d1 = contour(noise_cave1->result[index3d]);
float d2 = contour(noise_cave2->result[index3d]);
if (d1 * d2 > 0.3f && ndef->get(c).is_ground_content) {
// In tunnel and ground content, excavate
vm->m_data[vi] = MapNode(CONTENT_AIR);
} else if (open && (c == biome->c_filler || c == biome->c_stone)) {
// Tunnel entrance floor
vm->m_data[vi] = MapNode(biome->c_top);
open = false;
} else {
open = false;
}
}
}

View File

@ -674,20 +674,39 @@ void MapgenFractal::dustTopNodes()
void MapgenFractal::generateCaves(s16 max_stone_y)
{
if (max_stone_y >= node_min.Y) {
u32 index = 0;
v3s16 em = vm->m_area.getExtent();
u32 index2d = 0;
u32 index3d;
for (s16 z = node_min.Z; z <= node_max.Z; z++)
for (s16 y = node_min.Y - 1; y <= node_max.Y + 1; y++) {
u32 vi = vm->m_area.index(node_min.X, y, z);
for (s16 x = node_min.X; x <= node_max.X; x++, vi++, index++) {
float d1 = contour(noise_cave1->result[index]);
float d2 = contour(noise_cave2->result[index]);
if (d1 * d2 > 0.3f) {
content_t c = vm->m_data[vi].getContent();
if (!ndef->get(c).is_ground_content || c == CONTENT_AIR)
continue;
for (s16 x = node_min.X; x <= node_max.X; x++, index2d++) {
bool open = false; // Is column open to overground
u32 vi = vm->m_area.index(x, node_max.Y + 1, z);
index3d = (z - node_min.Z) * zstride + (csize.Y + 1) * ystride +
(x - node_min.X);
// Biome of column
Biome *biome = (Biome *)bmgr->getRaw(biomemap[index2d]);
for (s16 y = node_max.Y + 1; y >= node_min.Y - 1;
y--, index3d -= ystride, vm->m_area.add_y(em, vi, -1)) {
content_t c = vm->m_data[vi].getContent();
if (c == CONTENT_AIR || c == biome->c_water_top ||
c == biome->c_water) {
open = true;
continue;
}
// Ground
float d1 = contour(noise_cave1->result[index3d]);
float d2 = contour(noise_cave2->result[index3d]);
if (d1 * d2 > 0.3f && ndef->get(c).is_ground_content) {
// In tunnel and ground content, excavate
vm->m_data[vi] = MapNode(CONTENT_AIR);
} else if (open && (c == biome->c_filler || c == biome->c_stone)) {
// Tunnel entrance floor
vm->m_data[vi] = MapNode(biome->c_top);
open = false;
} else {
open = false;
}
}
}

View File

@ -38,7 +38,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "mg_ore.h"
#include "mg_decoration.h"
#include "mapgen_v5.h"
#include "util/directiontables.h"
FlagDesc flagdesc_mapgen_v5[] = {
@ -216,9 +215,9 @@ void MapgenV5::makeChunk(BlockMakeData *data)
data->blockpos_requested.Y <= data->blockpos_max.Y &&
data->blockpos_requested.Z <= data->blockpos_max.Z);
generating = true;
vm = data->vmanip;
ndef = data->nodedef;
this->generating = true;
this->vm = data->vmanip;
this->ndef = data->nodedef;
//TimeTaker t("makeChunk");
v3s16 blockpos_min = data->blockpos_min;

View File

@ -17,6 +17,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "mapgen.h"
#include "voxel.h"
#include "noise.h"
@ -37,6 +38,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "mg_decoration.h"
#include "mapgen_v6.h"
FlagDesc flagdesc_mapgen_v6[] = {
{"jungles", MGV6_JUNGLES},
{"biomeblend", MGV6_BIOMEBLEND},
@ -47,7 +49,8 @@ FlagDesc flagdesc_mapgen_v6[] = {
{NULL, 0}
};
///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
MapgenV6::MapgenV6(int mapgenid, MapgenParams *params, EmergeManager *emerge)
@ -197,7 +200,6 @@ void MapgenV6Params::writeParams(Settings *settings) const
//////////////////////// Some helper functions for the map generator
// Returns Y one under area minimum if not found
s16 MapgenV6::find_stone_level(v2s16 p2d)
{
@ -468,11 +470,11 @@ void MapgenV6::makeChunk(BlockMakeData *data)
assert(data->vmanip);
assert(data->nodedef);
assert(data->blockpos_requested.X >= data->blockpos_min.X &&
data->blockpos_requested.Y >= data->blockpos_min.Y &&
data->blockpos_requested.Z >= data->blockpos_min.Z);
data->blockpos_requested.Y >= data->blockpos_min.Y &&
data->blockpos_requested.Z >= data->blockpos_min.Z);
assert(data->blockpos_requested.X <= data->blockpos_max.X &&
data->blockpos_requested.Y <= data->blockpos_max.Y &&
data->blockpos_requested.Z <= data->blockpos_max.Z);
data->blockpos_requested.Y <= data->blockpos_max.Y &&
data->blockpos_requested.Z <= data->blockpos_max.Z);
this->generating = true;
this->vm = data->vmanip;
@ -808,7 +810,7 @@ void MapgenV6::flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos)
continue;
// Drop mud on side
for(u32 di = 0; di < 4; di++) {
for (u32 di = 0; di < 4; di++) {
v3s16 dirp = dirs4[di];
u32 i2 = i;
// Move to side
@ -833,7 +835,7 @@ void MapgenV6::flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos)
vm->m_area.add_y(em, i2, -1);
n2 = &vm->m_data[i2];
// if out of known area
if(vm->m_area.contains(i2) == false ||
if (vm->m_area.contains(i2) == false ||
n2->getContent() == CONTENT_IGNORE) {
dropped_to_unknown = true;
break;
@ -848,7 +850,7 @@ void MapgenV6::flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos)
if (!dropped_to_unknown) {
*n2 = *n;
// Set old place to be air (or water)
if(old_is_water)
if (old_is_water)
*n = MapNode(c_water_source);
else
*n = MapNode(CONTENT_AIR);

View File

@ -46,6 +46,7 @@ FlagDesc flagdesc_mapgen_v7[] = {
{NULL, 0}
};
///////////////////////////////////////////////////////////////////////////////
@ -862,20 +863,39 @@ void MapgenV7::addTopNodes()
void MapgenV7::generateCaves(s16 max_stone_y)
{
if (max_stone_y >= node_min.Y) {
u32 index = 0;
v3s16 em = vm->m_area.getExtent();
u32 index2d = 0;
u32 index3d;
for (s16 z = node_min.Z; z <= node_max.Z; z++)
for (s16 y = node_min.Y - 1; y <= node_max.Y + 1; y++) {
u32 i = vm->m_area.index(node_min.X, y, z);
for (s16 x = node_min.X; x <= node_max.X; x++, i++, index++) {
float d1 = contour(noise_cave1->result[index]);
float d2 = contour(noise_cave2->result[index]);
if (d1 * d2 > 0.3f) {
content_t c = vm->m_data[i].getContent();
if (!ndef->get(c).is_ground_content || c == CONTENT_AIR)
continue;
for (s16 x = node_min.X; x <= node_max.X; x++, index2d++) {
bool open = false; // Is column open to overground
u32 vi = vm->m_area.index(x, node_max.Y + 1, z);
index3d = (z - node_min.Z) * zstride + (csize.Y + 1) * ystride +
(x - node_min.X);
// Biome of column
Biome *biome = (Biome *)bmgr->getRaw(biomemap[index2d]);
vm->m_data[i] = MapNode(CONTENT_AIR);
for (s16 y = node_max.Y + 1; y >= node_min.Y - 1;
y--, index3d -= ystride, vm->m_area.add_y(em, vi, -1)) {
content_t c = vm->m_data[vi].getContent();
if (c == CONTENT_AIR || c == biome->c_water_top ||
c == biome->c_water) {
open = true;
continue;
}
// Ground
float d1 = contour(noise_cave1->result[index3d]);
float d2 = contour(noise_cave2->result[index3d]);
if (d1 * d2 > 0.3f && ndef->get(c).is_ground_content) {
// In tunnel and ground content, excavate
vm->m_data[vi] = MapNode(CONTENT_AIR);
} else if (open && (c == biome->c_filler || c == biome->c_stone)) {
// Tunnel entrance floor
vm->m_data[vi] = MapNode(biome->c_top);
open = false;
} else {
open = false;
}
}
}

997
src/mapgen_valleys.cpp Normal file
View File

@ -0,0 +1,997 @@
/*
Minetest Valleys C
Copyright (C) 2010-2015 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
Copyright (C) 2010-2015 paramat, Matt Gregory
Copyright (C) 2016 Duane Robertson <duane@duanerobertson.com>
Based on Valleys Mapgen by Gael de Sailly
(https://forum.minetest.net/viewtopic.php?f=9&t=11430)
and mapgen_v7 by kwolekr and paramat.
Licensing changed by permission of Gael de Sailly.
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 "mapgen.h"
#include "voxel.h"
#include "noise.h"
#include "mapblock.h"
#include "mapnode.h"
#include "map.h"
#include "content_sao.h"
#include "nodedef.h"
#include "voxelalgorithms.h"
#include "settings.h" // For g_settings
#include "emerge.h"
#include "dungeongen.h"
#include "treegen.h"
#include "mg_biome.h"
#include "mg_ore.h"
#include "mg_decoration.h"
#include "mapgen_valleys.h"
//#undef NDEBUG
//#include "assert.h"
//#include "util/timetaker.h"
//#include "profiler.h"
//static Profiler mapgen_prof;
//Profiler *mapgen_profiler = &mapgen_prof;
static FlagDesc flagdesc_mapgen_valleys[] = {
{"altitude_chill", MG_VALLEYS_ALT_CHILL},
{"cliffs", MG_VALLEYS_CLIFFS},
{"fast", MG_VALLEYS_FAST},
{"humid_rivers", MG_VALLEYS_HUMID_RIVERS},
{"rugged", MG_VALLEYS_RUGGED},
{NULL, 0}
};
///////////////////////////////////////////////////////////////////////////////
MapgenValleys::MapgenValleys(int mapgenid, MapgenParams *params, EmergeManager *emerge)
: Mapgen(mapgenid, params, emerge)
{
this->m_emerge = emerge;
this->bmgr = emerge->biomemgr;
//// 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 + 2);
this->biomemap = new u8[csize.X * csize.Z];
this->heightmap = new s16[csize.X * csize.Z];
this->heatmap = NULL;
this->humidmap = NULL;
MapgenValleysParams *sp = (MapgenValleysParams *)params->sparams;
this->spflags = sp->spflags;
this->cliff_terrain = (spflags & MG_VALLEYS_CLIFFS);
this->fast_terrain = (spflags & MG_VALLEYS_FAST);
this->humid_rivers = (spflags & MG_VALLEYS_HUMID_RIVERS);
this->rugged_terrain = (spflags & MG_VALLEYS_RUGGED);
this->use_altitude_chill = (spflags & MG_VALLEYS_ALT_CHILL);
this->altitude_chill = sp->altitude_chill;
this->cave_water_max_height = sp->cave_water_max_height;
this->humidity_adjust = sp->humidity - 50.f;
this->humidity_break_point = sp->humidity_break_point;
this->lava_max_height = sp->lava_max_height;
this->river_depth = sp->river_depth + 1.f;
this->river_size = sp->river_size / 100.f;
this->temperature_adjust = sp->temperature - 50.f;
this->water_features = MYMAX(1, MYMIN(11, 11 - sp->water_features));
//// 2D Terrain noise
noise_cliffs = new Noise(&sp->np_cliffs, seed, csize.X, csize.Z);
noise_corr = new Noise(&sp->np_corr, seed, csize.X, csize.Z);
noise_filler_depth = new Noise(&sp->np_filler_depth, seed, csize.X, csize.Z);
noise_inter_valley_slope = new Noise(&sp->np_inter_valley_slope, seed, csize.X, csize.Z);
noise_rivers = new Noise(&sp->np_rivers, seed, csize.X, csize.Z);
noise_terrain_height = new Noise(&sp->np_terrain_height, seed, csize.X, csize.Z);
noise_valley_depth = new Noise(&sp->np_valley_depth, seed, csize.X, csize.Z);
noise_valley_profile = new Noise(&sp->np_valley_profile, seed, csize.X, csize.Z);
if (this->fast_terrain)
noise_inter_valley_fill = new Noise(&sp->np_inter_valley_fill, seed, csize.X, csize.Z);
//// 3D Terrain noise
noise_simple_caves_1 = new Noise(&sp->np_simple_caves_1, seed, csize.X, csize.Y + 2, csize.Z);
noise_simple_caves_2 = new Noise(&sp->np_simple_caves_2, seed, csize.X, csize.Y + 2, csize.Z);
if (!this->fast_terrain)
noise_inter_valley_fill = new Noise(&sp->np_inter_valley_fill, seed, csize.X, csize.Y + 2, csize.Z);
//// Biome noise
noise_heat_blend = new Noise(&params->np_biome_heat_blend, seed, csize.X, csize.Z);
noise_heat = new Noise(&params->np_biome_heat, seed, csize.X, csize.Z);
noise_humidity_blend = new Noise(&params->np_biome_humidity_blend, seed, csize.X, csize.Z);
noise_humidity = new Noise(&params->np_biome_humidity, seed, csize.X, csize.Z);
//// Resolve nodes to be used
INodeDefManager *ndef = emerge->ndef;
c_cobble = ndef->getId("mapgen_cobble");
c_desert_stone = ndef->getId("mapgen_desert_stone");
c_dirt = ndef->getId("mapgen_dirt");
c_lava_source = ndef->getId("mapgen_lava_source");
c_mossycobble = ndef->getId("mapgen_mossycobble");
c_river_water_source = ndef->getId("mapgen_river_water_source");
c_sand = ndef->getId("mapgen_sand");
c_sandstonebrick = ndef->getId("mapgen_sandstonebrick");
c_sandstone = ndef->getId("mapgen_sandstone");
c_stair_cobble = ndef->getId("mapgen_stair_cobble");
c_stair_sandstonebrick = ndef->getId("mapgen_stair_sandstonebrick");
c_stone = ndef->getId("mapgen_stone");
c_water_source = ndef->getId("mapgen_water_source");
if (c_mossycobble == CONTENT_IGNORE)
c_mossycobble = c_cobble;
if (c_river_water_source == CONTENT_IGNORE)
c_river_water_source = c_water_source;
if (c_sand == CONTENT_IGNORE)
c_sand = c_stone;
if (c_sandstonebrick == CONTENT_IGNORE)
c_sandstonebrick = c_sandstone;
if (c_stair_cobble == CONTENT_IGNORE)
c_stair_cobble = c_cobble;
if (c_stair_sandstonebrick == CONTENT_IGNORE)
c_stair_sandstonebrick = c_sandstone;
}
MapgenValleys::~MapgenValleys()
{
delete noise_cliffs;
delete noise_corr;
delete noise_filler_depth;
delete noise_heat;
delete noise_heat_blend;
delete noise_humidity;
delete noise_humidity_blend;
delete noise_inter_valley_fill;
delete noise_inter_valley_slope;
delete noise_rivers;
delete noise_simple_caves_1;
delete noise_simple_caves_2;
delete noise_terrain_height;
delete noise_valley_depth;
delete noise_valley_profile;
delete[] heightmap;
delete[] biomemap;
}
MapgenValleysParams::MapgenValleysParams()
{
spflags = MG_VALLEYS_CLIFFS | MG_VALLEYS_RUGGED
| MG_VALLEYS_HUMID_RIVERS | MG_VALLEYS_ALT_CHILL;
altitude_chill = 90; // The altitude at which temperature drops by 20C.
// Water in caves will never be higher than this.
cave_water_max_height = MAX_MAP_GENERATION_LIMIT;
humidity = 50;
// the maximum humidity around rivers in otherwise dry areas
humidity_break_point = 65;
lava_max_height = 0; // Lava will never be higher than this.
river_depth = 4; // How deep to carve river channels.
river_size = 5; // How wide to make rivers.
temperature = 50;
water_features = 3; // How often water will occur in caves.
np_cliffs = NoiseParams(0.f, 1.f, v3f(750, 750, 750), 8445, 5, 1.f, 2.f);
np_corr = NoiseParams(0.f, 1.f, v3f(40, 40, 40), -3536, 4, 1.f, 2.f);
np_filler_depth = NoiseParams(0.f, 1.2f, v3f(256, 256, 256), 1605, 3, 0.5f, 2.f);
np_inter_valley_fill = NoiseParams(0.f, 1.f, v3f(256, 512, 256), 1993, 6, 0.8f, 2.f);
np_inter_valley_slope = NoiseParams(0.5f, 0.5f, v3f(128, 128, 128), 746, 1, 1.f, 2.f);
np_rivers = NoiseParams(0.f, 1.f, v3f(256, 256, 256), -6050, 5, 0.6f, 2.f);
np_simple_caves_1 = NoiseParams(0.f, 1.f, v3f(64, 64, 64), -8402, 3, 0.5f, 2.f);
np_simple_caves_2 = NoiseParams(0.f, 1.f, v3f(64, 64, 64), 3944, 3, 0.5f, 2.f);
np_terrain_height = NoiseParams(-10.f, 50.f, v3f(1024, 1024, 1024), 5202, 6, 0.4f, 2.f);
np_valley_depth = NoiseParams(5.f, 4.f, v3f(512, 512, 512), -1914, 1, 1.f, 2.f);
np_valley_profile = NoiseParams(0.6f, 0.5f, v3f(512, 512, 512), 777, 1, 1.f, 2.f);
}
void MapgenValleysParams::readParams(const Settings *settings)
{
settings->getFlagStrNoEx("mg_valleys_spflags", spflags, flagdesc_mapgen_valleys);
settings->getU16NoEx("mg_valleys_altitude_chill", altitude_chill);
settings->getS16NoEx("mg_valleys_cave_water_max_height", cave_water_max_height);
settings->getS16NoEx("mg_valleys_humidity", humidity);
settings->getS16NoEx("mg_valleys_humidity_break_point", humidity_break_point);
settings->getS16NoEx("mg_valleys_lava_max_height", lava_max_height);
settings->getU16NoEx("mg_valleys_river_depth", river_depth);
settings->getU16NoEx("mg_valleys_river_size", river_size);
settings->getS16NoEx("mg_valleys_temperature", temperature);
settings->getU16NoEx("mg_valleys_water_features", water_features);
settings->getNoiseParams("mg_valleys_np_cliffs", np_cliffs);
settings->getNoiseParams("mg_valleys_np_corr", np_corr);
settings->getNoiseParams("mg_valleys_np_filler_depth", np_filler_depth);
settings->getNoiseParams("mg_valleys_np_inter_valley_fill", np_inter_valley_fill);
settings->getNoiseParams("mg_valleys_np_inter_valley_slope", np_inter_valley_slope);
settings->getNoiseParams("mg_valleys_np_rivers", np_rivers);
settings->getNoiseParams("mg_valleys_np_simple_caves_1", np_simple_caves_1);
settings->getNoiseParams("mg_valleys_np_simple_caves_2", np_simple_caves_2);
settings->getNoiseParams("mg_valleys_np_terrain_height", np_terrain_height);
settings->getNoiseParams("mg_valleys_np_valley_depth", np_valley_depth);
settings->getNoiseParams("mg_valleys_np_valley_profile", np_valley_profile);
}
void MapgenValleysParams::writeParams(Settings *settings) const
{
settings->setFlagStr("mg_valleys_spflags", spflags, flagdesc_mapgen_valleys, U32_MAX);
settings->setU16("mg_valleys_altitude_chill", altitude_chill);
settings->setS16("mg_valleys_cave_water_max_height", cave_water_max_height);
settings->setS16("mg_valleys_humidity", humidity);
settings->setS16("mg_valleys_humidity_break_point", humidity_break_point);
settings->setS16("mg_valleys_lava_max_height", lava_max_height);
settings->setU16("mg_valleys_river_depth", river_depth);
settings->setU16("mg_valleys_river_size", river_size);
settings->setS16("mg_valleys_temperature", temperature);
settings->setU16("mg_valleys_water_features", water_features);
settings->setNoiseParams("mg_valleys_np_cliffs", np_cliffs);
settings->setNoiseParams("mg_valleys_np_corr", np_corr);
settings->setNoiseParams("mg_valleys_np_filler_depth", np_filler_depth);
settings->setNoiseParams("mg_valleys_np_inter_valley_fill", np_inter_valley_fill);
settings->setNoiseParams("mg_valleys_np_inter_valley_slope", np_inter_valley_slope);
settings->setNoiseParams("mg_valleys_np_rivers", np_rivers);
settings->setNoiseParams("mg_valleys_np_simple_caves_1", np_simple_caves_1);
settings->setNoiseParams("mg_valleys_np_simple_caves_2", np_simple_caves_2);
settings->setNoiseParams("mg_valleys_np_terrain_height", np_terrain_height);
settings->setNoiseParams("mg_valleys_np_valley_depth", np_valley_depth);
settings->setNoiseParams("mg_valleys_np_valley_profile", np_valley_profile);
}
///////////////////////////////////////
void MapgenValleys::makeChunk(BlockMakeData *data)
{
// Pre-conditions
assert(data->vmanip);
assert(data->nodedef);
assert(data->blockpos_requested.X >= data->blockpos_min.X &&
data->blockpos_requested.Y >= data->blockpos_min.Y &&
data->blockpos_requested.Z >= data->blockpos_min.Z);
assert(data->blockpos_requested.X <= data->blockpos_max.X &&
data->blockpos_requested.Y <= data->blockpos_max.Y &&
data->blockpos_requested.Z <= data->blockpos_max.Z);
this->generating = true;
this->vm = data->vmanip;
this->ndef = data->nodedef;
//TimeTaker t("makeChunk");
v3s16 blockpos_min = data->blockpos_min;
v3s16 blockpos_max = data->blockpos_max;
node_min = blockpos_min * MAP_BLOCKSIZE;
node_max = (blockpos_max + v3s16(1, 1, 1)) * MAP_BLOCKSIZE - v3s16(1, 1, 1);
full_node_min = (blockpos_min - 1) * MAP_BLOCKSIZE;
full_node_max = (blockpos_max + 2) * MAP_BLOCKSIZE - v3s16(1, 1, 1);
blockseed = getBlockSeed2(full_node_min, seed);
// Generate noise maps and base terrain height.
calculateNoise();
// Generate base terrain with initial heightmaps
s16 stone_surface_max_y = generateTerrain();
// Create biomemap at heightmap surface
bmgr->calcBiomes(csize.X, csize.Z, heatmap, humidmap, heightmap, biomemap);
// Actually place the biome-specific nodes
MgStoneType stone_type = generateBiomes(heatmap, humidmap);
// Cave creation.
if (flags & MG_CAVES)
generateSimpleCaves(stone_surface_max_y);
// Dungeon creation
if ((flags & MG_DUNGEONS) && node_max.Y < 50 && (stone_surface_max_y >= node_min.Y)) {
DungeonParams dp;
dp.np_rarity = nparams_dungeon_rarity;
dp.np_density = nparams_dungeon_density;
dp.np_wetness = nparams_dungeon_wetness;
dp.c_water = c_water_source;
if (stone_type == STONE) {
dp.c_cobble = c_cobble;
dp.c_moss = c_mossycobble;
dp.c_stair = c_stair_cobble;
dp.diagonal_dirs = false;
dp.mossratio = 3.f;
dp.holesize = v3s16(1, 2, 1);
dp.roomsize = v3s16(0, 0, 0);
dp.notifytype = GENNOTIFY_DUNGEON;
} else if (stone_type == DESERT_STONE) {
dp.c_cobble = c_desert_stone;
dp.c_moss = c_desert_stone;
dp.c_stair = c_desert_stone;
dp.diagonal_dirs = true;
dp.mossratio = 0.f;
dp.holesize = v3s16(2, 3, 2);
dp.roomsize = v3s16(2, 5, 2);
dp.notifytype = GENNOTIFY_TEMPLE;
} else if (stone_type == SANDSTONE) {
dp.c_cobble = c_sandstonebrick;
dp.c_moss = c_sandstonebrick;
dp.c_stair = c_sandstonebrick;
dp.diagonal_dirs = false;
dp.mossratio = 0.f;
dp.holesize = v3s16(2, 2, 2);
dp.roomsize = v3s16(2, 0, 2);
dp.notifytype = GENNOTIFY_DUNGEON;
}
DungeonGen dgen(this, &dp);
dgen.generate(blockseed, full_node_min, full_node_max);
}
// Generate the registered decorations
if (flags & MG_DECORATIONS)
m_emerge->decomgr->placeAllDecos(this, blockseed, node_min, node_max);
// Generate the registered ores
m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max);
// Sprinkle some dust on top after everything else was generated
dustTopNodes();
//TimeTaker tll("liquid_lighting");
updateLiquid(&data->transforming_liquid, full_node_min, full_node_max);
if (flags & MG_LIGHT)
calcLighting(
node_min - v3s16(0, 1, 0),
node_max + v3s16(0, 1, 0),
full_node_min,
full_node_max);
//mapgen_profiler->avg("liquid_lighting", tll.stop() / 1000.f);
//mapgen_profiler->avg("makeChunk", t.stop() / 1000.f);
this->generating = false;
}
// Populate the noise tables and do most of the
// calculation necessary to determine terrain height.
void MapgenValleys::calculateNoise()
{
//TimeTaker t("calculateNoise", NULL, PRECISION_MICRO);
int x = node_min.X;
int y = node_min.Y - 1;
int z = node_min.Z;
//TimeTaker tcn("actualNoise");
noise_filler_depth->perlinMap2D(x, z);
noise_heat_blend->perlinMap2D(x, z);
noise_heat->perlinMap2D(x, z);
noise_humidity_blend->perlinMap2D(x, z);
noise_humidity->perlinMap2D(x, z);
noise_inter_valley_slope->perlinMap2D(x, z);
noise_rivers->perlinMap2D(x, z);
noise_terrain_height->perlinMap2D(x, z);
noise_valley_depth->perlinMap2D(x, z);
noise_valley_profile->perlinMap2D(x, z);
if (fast_terrain) {
// Make this 2D for speed, if requested.
noise_inter_valley_fill->perlinMap2D(x, z);
if (cliff_terrain)
noise_cliffs->perlinMap2D(x, z);
if (rugged_terrain)
noise_corr->perlinMap2D(x, z);
} else {
noise_inter_valley_fill->perlinMap3D(x, y, z);
}
if (flags & MG_CAVES) {
noise_simple_caves_1->perlinMap3D(x, y, z);
noise_simple_caves_2->perlinMap3D(x, y, z);
}
//mapgen_profiler->avg("noisemaps", tcn.stop() / 1000.f);
for (s32 index = 0; index < csize.X * csize.Z; index++) {
noise_heat->result[index] += noise_heat_blend->result[index];
noise_heat->result[index] += temperature_adjust;
noise_humidity->result[index] += noise_humidity_blend->result[index];
}
TerrainNoise tn;
u32 index = 0;
for (tn.z = node_min.Z; tn.z <= node_max.Z; tn.z++)
for (tn.x = node_min.X; tn.x <= node_max.X; tn.x++, index++) {
// The parameters that we actually need to generate terrain
// are passed by address (and the return value).
tn.terrain_height = noise_terrain_height->result[index];
// River noise is replaced with base terrain, which
// is basically the height of the water table.
tn.rivers = &noise_rivers->result[index];
// Valley depth noise is replaced with the valley
// number that represents the height of terrain
// over rivers and is used to determine about
// how close a river is for humidity calculation.
tn.valley = &noise_valley_depth->result[index];
tn.valley_profile = noise_valley_profile->result[index];
// Slope noise is replaced by the calculated slope
// which is used to get terrain height in the slow
// method, to create sharper mountains.
tn.slope = &noise_inter_valley_slope->result[index];
tn.inter_valley_fill = noise_inter_valley_fill->result[index];
tn.cliffs = noise_cliffs->result[index];
tn.corr = noise_corr->result[index];
// This is the actual terrain height.
float mount = terrainLevelFromNoise(&tn);
noise_terrain_height->result[index] = mount;
if (fast_terrain) {
// Assign humidity adjusted by water proximity.
// I can't think of a reason why a mod would expect base humidity
// from noise or at any altitude other than ground level.
noise_humidity->result[index] = humidityByTerrain(
noise_humidity->result[index],
mount,
noise_rivers->result[index],
noise_valley_depth->result[index]);
// Assign heat adjusted by altitude. See humidity, above.
if (use_altitude_chill && mount > 0.f)
noise_heat->result[index] *= pow(0.5f, (mount - altitude_chill / 3.f) / altitude_chill);
}
}
heatmap = noise_heat->result;
humidmap = noise_humidity->result;
}
// This keeps us from having to maintain two similar sets of
// complicated code to determine ground level.
float MapgenValleys::terrainLevelFromNoise(TerrainNoise *tn)
{
float inter_valley_slope = *tn->slope;
// The square function changes the behaviour of this noise:
// very often small, and sometimes very high.
float valley_d = pow(*tn->valley, 2);
// valley_d is here because terrain is generally higher where valleys
// are deep (mountains). base represents the height of the
// rivers, most of the surface is above.
float base = tn->terrain_height + valley_d;
// "river" represents the distance from the river, in arbitrary units.
float river = fabs(*tn->rivers) - river_size;
// Use the curve of the function 1exp((x/a)²) to model valleys.
// Making "a" vary (0 < a ≤ 1) changes the shape of the valleys.
// Try it with a geometry software !
// (here x = "river" and a = valley_profile).
// "valley" represents the height of the terrain, from the rivers.
*tn->valley = valley_d * (1.f - exp(- pow(river / tn->valley_profile, 2)));
// approximate height of the terrain at this point
float mount = base + *tn->valley;
*tn->slope *= *tn->valley;
// Rivers are placed where "river" is negative, so where the original
// noise value is close to zero.
// Base ground is returned as rivers since it's basically the water table.
*tn->rivers = base;
if (river < 0.f) {
// Use the the function sqrt(1x²) which models a circle.
float depth = (river_depth * sqrt(1.f - pow((river / river_size + 1), 2)));
// base - depth : height of the bottom of the river
// water_level - 2 : don't make rivers below 2 nodes under the surface
u16 min_bottom = 2;
if (!fast_terrain)
min_bottom = 6;
mount = fmin(fmax(base - depth, (float) (water_level - min_bottom)), mount);
// Slope has no influence on rivers.
*tn->slope = 0.f;
}
if (fast_terrain) {
// The penultimate step builds up the heights, but we reduce it
// occasionally to create cliffs.
float delta = sin(tn->inter_valley_fill) * *tn->slope;
if (cliff_terrain && tn->cliffs >= 0.2f)
mount += delta * 0.66f;
else
mount += delta;
// Use yet another noise to make the heights look more rugged.
if (rugged_terrain
&& mount > water_level
&& fabs(inter_valley_slope * tn->inter_valley_fill) < 0.3f)
mount += ((delta < 0.f) ? -1.f : 1.f) * pow(fabs(delta), 0.5f) * fabs(sin(tn->corr));
}
return mount;
}
// This avoids duplicating the code in terrainLevelFromNoise, adding
// only the final step of terrain generation without a noise map.
float MapgenValleys::adjustedTerrainLevelFromNoise(TerrainNoise *tn)
{
float mount = terrainLevelFromNoise(tn);
if (!fast_terrain) {
for (s16 y = round(mount); y <= round(mount) + 1000; y++) {
float fill = NoisePerlin3D(&noise_inter_valley_fill->np, tn->x, y, tn->z, seed);
if (fill * *tn->slope <= y - mount) {
mount = fmax(y - 1, mount);
break;
}
}
}
return mount;
}
float MapgenValleys::humidityByTerrain(
float humidity_base,
float mount,
float rivers,
float valley)
{
// Although the original valleys adjusts humidity by distance
// from seawater, this causes problems with the default biomes.
// Adjust only by freshwater proximity.
float humidity = humidity_base + humidity_adjust;
if (humid_rivers && mount > water_level) {
// Offset to make everything average the same.
humidity -= (humidity_break_point - humidity_adjust) / 3.f;
// This method is from the original lua.
float water_table = pow(0.5f, fmax(rivers / 3.f, 0.f));
// This adds humidity next to rivers and lakes.
float river_water = pow(0.5f, fmax(valley / 12.f, 0.f));
// Combine the two.
float water = water_table + (1.f - water_table) * river_water;
humidity = fmax(humidity, (humidity_break_point * water));
}
return humidity;
}
int MapgenValleys::getGroundLevelAtPoint(v2s16 p)
{
// ***********************************************
// This method (deliberately) does not return correct
// terrain values. This may be a problem in the future.
// ***********************************************
// Since MT doesn't normally deal with rivers, check
// to make sure this isn't a request for a location
// in a river.
float rivers = NoisePerlin2D(&noise_rivers->np, p.X, p.Y, seed);
// If it's wet, return an unusable number.
if (fabs(rivers) < river_size)
return MAX_MAP_GENERATION_LIMIT;
// Otherwise, return the real result.
return terrainLevelAtPoint(p.X, p.Y);
}
float MapgenValleys::terrainLevelAtPoint(s16 x, s16 z)
{
TerrainNoise tn;
float rivers = NoisePerlin2D(&noise_rivers->np, x, z, seed);
float valley = NoisePerlin2D(&noise_valley_depth->np, x, z, seed);
float inter_valley_slope = NoisePerlin2D(&noise_inter_valley_slope->np, x, z, seed);
tn.x = x;
tn.z = z;
tn.terrain_height = NoisePerlin2D(&noise_terrain_height->np, x, z, seed);
tn.rivers = &rivers;
tn.valley = &valley;
tn.valley_profile = NoisePerlin2D(&noise_valley_profile->np, x, z, seed);
tn.slope = &inter_valley_slope;
tn.inter_valley_fill = 0.f;
tn.cliffs = 0.f;
tn.corr = 0.f;
if (fast_terrain) {
tn.inter_valley_fill = NoisePerlin2D(&noise_inter_valley_fill->np, x, z, seed);
if (cliff_terrain)
tn.cliffs = NoisePerlin2D(&noise_cliffs->np, x, z, seed);
if (rugged_terrain)
tn.corr = NoisePerlin2D(&noise_corr->np, x, z, seed);
}
return adjustedTerrainLevelFromNoise(&tn);
}
int MapgenValleys::generateTerrain()
{
MapNode n_air(CONTENT_AIR);
MapNode n_river_water(c_river_water_source);
MapNode n_sand(c_sand);
MapNode n_stone(c_stone);
MapNode n_water(c_water_source);
v3s16 em = vm->m_area.getExtent();
s16 surface_max_y = -MAX_MAP_GENERATION_LIMIT;
u32 index_2d = 0;
for (s16 z = node_min.Z; z <= node_max.Z; z++)
for (s16 x = node_min.X; x <= node_max.X; x++, index_2d++) {
s16 river_y = floor(noise_rivers->result[index_2d]);
s16 surface_y = floor(noise_terrain_height->result[index_2d]);
float slope = noise_inter_valley_slope->result[index_2d];
heightmap[index_2d] = surface_y;
if (surface_y > surface_max_y)
surface_max_y = surface_y;
u32 index_3d = 0;
if (!fast_terrain)
index_3d = (z - node_min.Z) * zstride + (x - node_min.X);
u32 index_data = vm->m_area.index(x, node_min.Y - 1, z);
// Mapgens concern themselves with stone and water.
for (s16 y = node_min.Y - 1; y <= node_max.Y + 1; y++) {
float fill = 0.f;
if (!fast_terrain)
fill = noise_inter_valley_fill->result[index_3d];
if (vm->m_data[index_data].getContent() == CONTENT_IGNORE) {
bool river = (river_y > surface_y);
if (river && y == surface_y) {
// river bottom
vm->m_data[index_data] = n_sand;
} else if ((fast_terrain || river) && y <= surface_y) {
// ground
vm->m_data[index_data] = n_stone;
} else if (river && y < river_y) {
// river
vm->m_data[index_data] = n_river_water;
} else if ((!fast_terrain) && (!river) && round(fill * slope) >= y - surface_y) {
// ground (slow method)
vm->m_data[index_data] = n_stone;
heightmap[index_2d] = surface_max_y = y;
} else if (y <= water_level) {
// sea
vm->m_data[index_data] = n_water;
} else {
vm->m_data[index_data] = n_air;
}
}
vm->m_area.add_y(em, index_data, 1);
if (!fast_terrain)
index_3d += ystride;
}
if (!fast_terrain) {
// Assign the humidity adjusted by water proximity.
noise_humidity->result[index_2d] = humidityByTerrain(
noise_humidity->result[index_2d],
surface_max_y,
noise_rivers->result[index_2d],
noise_valley_depth->result[index_2d]);
// Assign the heat adjusted by altitude. See humidity, above.
if (use_altitude_chill && surface_max_y > 0)
noise_heat->result[index_2d]
*= pow(0.5f, (surface_max_y - altitude_chill / 3.f) / altitude_chill);
}
}
return surface_max_y;
}
MgStoneType MapgenValleys::generateBiomes(float *heat_map, float *humidity_map)
{
v3s16 em = vm->m_area.getExtent();
u32 index = 0;
MgStoneType stone_type = STONE;
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 = NULL;
u16 depth_top = 0;
u16 base_filler = 0;
u16 depth_water_top = 0;
u32 vi = vm->m_area.index(x, node_max.Y, z);
// Check node at base of mapchunk above, either a node of a previously
// generated mapchunk or if not, a node of overgenerated base terrain.
content_t c_above = vm->m_data[vi + em.X].getContent();
bool air_above = c_above == CONTENT_AIR;
bool water_above = (c_above == c_water_source);
// If there is air or water above enable top/filler placement, otherwise force
// nplaced to stone level by setting a number exceeding any possible filler depth.
u16 nplaced = (air_above || water_above) ? 0 : U16_MAX;
for (s16 y = node_max.Y; y >= node_min.Y; y--) {
content_t c = vm->m_data[vi].getContent();
// Biome is recalculated each time an upper surface is detected while
// working down a column. The selected biome then remains in effect for
// all nodes below until the next surface and biome recalculation.
// Biome is recalculated:
// 1. At the surface of stone below air or water.
// 2. At the surface of water below air.
// 3. When stone or water is detected but biome has not yet been calculated.
if ((c == c_stone && (air_above || water_above || !biome))
|| ((c == c_water_source || c == c_river_water_source)
&& (air_above || !biome))) {
// Both heat and humidity have already been adjusted for altitude.
biome = bmgr->getBiome(heat_map[index], humidity_map[index], y);
depth_top = biome->depth_top;
base_filler = MYMAX(depth_top
+ biome->depth_filler
+ noise_filler_depth->result[index], 0.f);
depth_water_top = biome->depth_water_top;
// Detect stone type for dungeons during every biome calculation.
// This is more efficient than detecting per-node and will not
// miss any desert stone or sandstone biomes.
if (biome->c_stone == c_desert_stone)
stone_type = DESERT_STONE;
else if (biome->c_stone == c_sandstone)
stone_type = SANDSTONE;
}
if (c == c_stone) {
content_t c_below = vm->m_data[vi - em.X].getContent();
// If the node below isn't solid, make this node stone, so that
// any top/filler nodes above are structurally supported.
// This is done by aborting the cycle of top/filler placement
// immediately by forcing nplaced to stone level.
if (c_below == CONTENT_AIR
|| c_below == c_water_source
|| c_below == c_river_water_source)
nplaced = U16_MAX;
if (nplaced < depth_top) {
vm->m_data[vi] = MapNode(biome->c_top);
nplaced++;
} else if (nplaced < base_filler) {
vm->m_data[vi] = MapNode(biome->c_filler);
nplaced++;
} else {
vm->m_data[vi] = MapNode(biome->c_stone);
}
air_above = false;
water_above = false;
} else if (c == c_water_source) {
vm->m_data[vi] = MapNode((y > (s32)(water_level - depth_water_top))
? biome->c_water_top : biome->c_water);
nplaced = 0; // Enable top/filler placement for next surface
air_above = false;
water_above = true;
} else if (c == c_river_water_source) {
vm->m_data[vi] = MapNode(biome->c_river_water);
nplaced = U16_MAX; // Sand was already placed under rivers.
air_above = false;
water_above = true;
} else if (c == CONTENT_AIR) {
nplaced = 0; // Enable top/filler placement for next surface
air_above = true;
water_above = false;
} else { // Possible various nodes overgenerated from neighbouring mapchunks
nplaced = U16_MAX; // Disable top/filler placement
air_above = false;
water_above = false;
}
vm->m_area.add_y(em, vi, -1);
}
}
return stone_type;
}
void MapgenValleys::dustTopNodes()
{
if (node_max.Y < water_level)
return;
v3s16 em = vm->m_area.getExtent();
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 = (Biome *)bmgr->getRaw(biomemap[index]);
if (biome->c_dust == CONTENT_IGNORE)
continue;
u32 vi = vm->m_area.index(x, full_node_max.Y, z);
content_t c_full_max = vm->m_data[vi].getContent();
s16 y_start;
if (c_full_max == CONTENT_AIR) {
y_start = full_node_max.Y - 1;
} else if (c_full_max == CONTENT_IGNORE) {
vi = vm->m_area.index(x, node_max.Y + 1, z);
content_t c_max = vm->m_data[vi].getContent();
if (c_max == CONTENT_AIR)
y_start = node_max.Y;
else
continue;
} else {
continue;
}
vi = vm->m_area.index(x, y_start, z);
for (s16 y = y_start; y >= node_min.Y - 1; 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 (!ndef->get(c).buildable_to && c != CONTENT_IGNORE && c != biome->c_dust) {
vm->m_area.add_y(em, vi, 1);
vm->m_data[vi] = MapNode(biome->c_dust);
}
}
}
void MapgenValleys::generateSimpleCaves(s16 max_stone_y)
{
PseudoRandom ps(blockseed + 72202);
MapNode n_air(CONTENT_AIR);
MapNode n_dirt(c_dirt);
MapNode n_lava(c_lava_source);
MapNode n_water(c_river_water_source);
v3s16 em = vm->m_area.getExtent();
s16 base_water_chance = 0;
if (water_features < 11)
base_water_chance = ceil(MAX_MAP_GENERATION_LIMIT / (water_features * 1000));
if (max_stone_y >= node_min.Y) {
u32 index_2d = 0;
u32 index_3d = 0;
for (s16 z = node_min.Z; z <= node_max.Z; z++)
for (s16 x = node_min.X; x <= node_max.X; x++, index_2d++) {
bool air_above = false;
//bool underground = false;
u32 index_data = vm->m_area.index(x, node_max.Y + 1, z);
index_3d = (z - node_min.Z) * zstride + (csize.Y + 1) * ystride + (x - node_min.X);
// Dig caves on down loop to check for air above.
for (s16 y = node_max.Y + 1;
y >= node_min.Y - 1;
y--, index_3d -= ystride, vm->m_area.add_y(em, index_data, -1)) {
float terrain = noise_terrain_height->result[index_2d];
// Saves some time and prevents removing above ground nodes.
if (y > terrain + 1) {
air_above = true;
continue;
}
content_t c = vm->m_data[index_data].getContent();
bool n1 = (fabs(noise_simple_caves_1->result[index_3d]) < 0.07f);
bool n2 = (fabs(noise_simple_caves_2->result[index_3d]) < 0.07f);
// River water is (foolishly) not set as ground content
// in the default game. This can produce strange results
// when a cave undercuts a river. However, that's not for
// the mapgen to correct. Fix it in lua.
if (c == CONTENT_AIR) {
air_above = true;
} else if (n1 && n2 && ndef->get(c).is_ground_content) {
// When both n's are true, we're in a cave.
vm->m_data[index_data] = n_air;
air_above = true;
} else if (air_above
&& (c == c_stone || c == c_sandstone || c == c_desert_stone)) {
// At the cave floor
s16 sr = ps.next() & 1023;
u32 j = index_data;
vm->m_area.add_y(em, j, 1);
if (sr > (terrain - y) * 25) {
// Put dirt in caves near the surface.
Biome *biome = (Biome *)bmgr->getRaw(biomemap[index_2d]);
vm->m_data[index_data] = MapNode(biome->c_filler);
} else {
s16 lava_chance = 0;
if (y <= lava_max_height && c == c_stone) {
// Lava spawns increase with depth.
lava_chance = ceil((lava_max_height - y + 1) / 10000);
if (sr < lava_chance)
vm->m_data[j] = n_lava;
}
if (base_water_chance > 0 && y <= cave_water_max_height) {
s16 water_chance = base_water_chance
- (abs(y - water_level) / (water_features * 1000));
// Waterfalls may get out of control above ground.
sr -= lava_chance;
// If sr < 0 then we should have already placed lava --
// don't immediately dump water on it.
if (sr >= 0 && sr < water_chance)
vm->m_data[j] = n_water;
}
}
air_above = false;
}
// If we're not in a cave, there's no open space.
if (!(n1 && n2))
air_above = false;
}
}
}
}

194
src/mapgen_valleys.h Normal file
View File

@ -0,0 +1,194 @@
/*
Minetest Valleys C
Copyright (C) 2010-2015 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
Copyright (C) 2010-2015 paramat, Matt Gregory
Copyright (C) 2016 Duane Robertson <duane@duanerobertson.com>
Based on Valleys Mapgen by Gael de Sailly
(https://forum.minetest.net/viewtopic.php?f=9&t=11430)
and mapgen_v7 by kwolekr and paramat.
Licensing changed by permission of Gael de Sailly.
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 MAPGEN_VALLEYS_HEADER
#define MAPGEN_VALLEYS_HEADER
#include "mapgen.h"
/////////////////// Mapgen Valleys flags
#define MG_VALLEYS_ALT_CHILL 0x01
#define MG_VALLEYS_CLIFFS 0x02
#define MG_VALLEYS_FAST 0x04
#define MG_VALLEYS_HUMID_RIVERS 0x08
#define MG_VALLEYS_RUGGED 0x10
class BiomeManager;
// Global profiler
//class Profiler;
//extern Profiler *mapgen_profiler;
struct MapgenValleysParams : public MapgenSpecificParams {
u32 spflags;
u16 altitude_chill;
s16 cave_water_max_height;
s16 humidity;
s16 humidity_break_point;
s16 lava_max_height;
u16 river_depth;
u16 river_size;
s16 temperature;
u16 water_features;
NoiseParams np_biome_heat;
NoiseParams np_biome_heat_blend;
NoiseParams np_biome_humidity;
NoiseParams np_biome_humidity_blend;
NoiseParams np_cliffs;
NoiseParams np_corr;
NoiseParams np_filler_depth;
NoiseParams np_inter_valley_fill;
NoiseParams np_inter_valley_slope;
NoiseParams np_rivers;
NoiseParams np_simple_caves_1;
NoiseParams np_simple_caves_2;
NoiseParams np_terrain_height;
NoiseParams np_valley_depth;
NoiseParams np_valley_profile;
MapgenValleysParams();
~MapgenValleysParams() {}
void readParams(const Settings *settings);
void writeParams(Settings *settings) const;
};
struct TerrainNoise {
s16 x;
s16 z;
float terrain_height;
float *rivers;
float *valley;
float valley_profile;
float *slope;
float inter_valley_fill;
float cliffs;
float corr;
};
class MapgenValleys : public Mapgen {
public:
MapgenValleys(int mapgenid, MapgenParams *params, EmergeManager *emerge);
~MapgenValleys();
virtual void makeChunk(BlockMakeData *data);
int getGroundLevelAtPoint(v2s16 p);
private:
EmergeManager *m_emerge;
BiomeManager *bmgr;
int ystride;
int zstride;
u32 spflags;
bool cliff_terrain;
bool fast_terrain;
bool rugged_terrain;
bool humid_rivers;
bool use_altitude_chill;
v3s16 node_min;
v3s16 node_max;
v3s16 full_node_min;
v3s16 full_node_max;
Noise *noise_filler_depth;
Noise *noise_cliffs;
Noise *noise_corr;
Noise *noise_heat;
Noise *noise_heat_blend;
Noise *noise_humidity;
Noise *noise_humidity_blend;
Noise *noise_inter_valley_fill;
Noise *noise_inter_valley_slope;
Noise *noise_rivers;
Noise *noise_simple_caves_1;
Noise *noise_simple_caves_2;
Noise *noise_terrain_height;
Noise *noise_valley_depth;
Noise *noise_valley_profile;
float altitude_chill;
float cave_water_max_height;
float humidity_adjust;
float humidity_break_point;
float lava_max_height;
float river_depth;
float river_size;
float temperature_adjust;
s16 water_features;
content_t c_cobble;
content_t c_desert_stone;
content_t c_dirt;
content_t c_ice;
content_t c_lava_source;
content_t c_mossycobble;
content_t c_river_water_source;
content_t c_sand;
content_t c_sandstone;
content_t c_sandstonebrick;
content_t c_stair_cobble;
content_t c_stair_sandstonebrick;
content_t c_stone;
content_t c_water_source;
float terrainLevelAtPoint(s16 x, s16 z);
void calculateNoise();
virtual int generateTerrain();
float terrainLevelFromNoise(TerrainNoise *tn);
float adjustedTerrainLevelFromNoise(TerrainNoise *tn);
float humidityByTerrain(float humidity_base, float mount, float rivers, float valley);
MgStoneType generateBiomes(float *heat_map, float *humidity_map);
void dustTopNodes();
void generateSimpleCaves(s16 max_stone_y);
};
struct MapgenFactoryValleys : public MapgenFactory {
Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge)
{
return new MapgenValleys(mgid, params, emerge);
};
MapgenSpecificParams *createMapgenParams()
{
return new MapgenValleysParams();
};
};
#endif

View File

@ -206,146 +206,139 @@ void setMeshColorByNormalXYZ(scene::IMesh *mesh,
const video::SColor &colorY,
const video::SColor &colorZ)
{
if(mesh == NULL)
if (mesh == NULL)
return;
u16 mc = mesh->getMeshBufferCount();
for(u16 j=0; j<mc; j++)
{
for (u16 j = 0; j < mc; j++) {
scene::IMeshBuffer *buf = mesh->getMeshBuffer(j);
video::S3DVertex *vertices = (video::S3DVertex*)buf->getVertices();
u16 vc = buf->getVertexCount();
for(u16 i=0; i<vc; i++)
{
f32 x = fabs(vertices[i].Normal.X);
f32 y = fabs(vertices[i].Normal.Y);
f32 z = fabs(vertices[i].Normal.Z);
if(x >= y && x >= z)
vertices[i].Color = colorX;
else if(y >= z)
vertices[i].Color = colorY;
const u32 stride = getVertexPitchFromType(buf->getVertexType());
u32 vertex_count = buf->getVertexCount();
u8 *vertices = (u8 *)buf->getVertices();
for (u32 i = 0; i < vertex_count; i++) {
video::S3DVertex *vertex = (video::S3DVertex *)(vertices + i * stride);
f32 x = fabs(vertex->Normal.X);
f32 y = fabs(vertex->Normal.Y);
f32 z = fabs(vertex->Normal.Z);
if (x >= y && x >= z)
vertex->Color = colorX;
else if (y >= z)
vertex->Color = colorY;
else
vertices[i].Color = colorZ;
vertex->Color = colorZ;
}
}
}
void rotateMeshXYby (scene::IMesh *mesh, f64 degrees)
{
void rotateMeshXYby(scene::IMesh *mesh, f64 degrees)
{
u16 mc = mesh->getMeshBufferCount();
for(u16 j = 0; j < mc; j++)
{
for (u16 j = 0; j < mc; j++) {
scene::IMeshBuffer *buf = mesh->getMeshBuffer(j);
video::S3DVertex *vertices = (video::S3DVertex*)buf->getVertices();
u16 vc = buf->getVertexCount();
for(u16 i = 0; i < vc; i++)
{
vertices[i].Pos.rotateXYBy(degrees);
}
const u32 stride = getVertexPitchFromType(buf->getVertexType());
u32 vertex_count = buf->getVertexCount();
u8 *vertices = (u8 *)buf->getVertices();
for (u32 i = 0; i < vertex_count; i++)
((video::S3DVertex *)(vertices + i * stride))->Pos.rotateXYBy(degrees);
}
}
void rotateMeshXZby (scene::IMesh *mesh, f64 degrees)
{
void rotateMeshXZby(scene::IMesh *mesh, f64 degrees)
{
u16 mc = mesh->getMeshBufferCount();
for(u16 j = 0; j < mc; j++)
{
for (u16 j = 0; j < mc; j++) {
scene::IMeshBuffer *buf = mesh->getMeshBuffer(j);
video::S3DVertex *vertices = (video::S3DVertex*)buf->getVertices();
u16 vc = buf->getVertexCount();
for(u16 i = 0; i < vc; i++)
{
vertices[i].Pos.rotateXZBy(degrees);
}
const u32 stride = getVertexPitchFromType(buf->getVertexType());
u32 vertex_count = buf->getVertexCount();
u8 *vertices = (u8 *)buf->getVertices();
for (u32 i = 0; i < vertex_count; i++)
((video::S3DVertex *)(vertices + i * stride))->Pos.rotateXZBy(degrees);
}
}
void rotateMeshYZby (scene::IMesh *mesh, f64 degrees)
{
void rotateMeshYZby(scene::IMesh *mesh, f64 degrees)
{
u16 mc = mesh->getMeshBufferCount();
for(u16 j = 0; j < mc; j++)
{
for (u16 j = 0; j < mc; j++) {
scene::IMeshBuffer *buf = mesh->getMeshBuffer(j);
video::S3DVertex *vertices = (video::S3DVertex*)buf->getVertices();
u16 vc = buf->getVertexCount();
for(u16 i = 0; i < vc; i++)
{
vertices[i].Pos.rotateYZBy(degrees);
}
const u32 stride = getVertexPitchFromType(buf->getVertexType());
u32 vertex_count = buf->getVertexCount();
u8 *vertices = (u8 *)buf->getVertices();
for (u32 i = 0; i < vertex_count; i++)
((video::S3DVertex *)(vertices + i * stride))->Pos.rotateYZBy(degrees);
}
}
void rotateMeshBy6dFacedir(scene::IMesh *mesh, int facedir)
{
int axisdir = facedir>>2;
{
int axisdir = facedir >> 2;
facedir &= 0x03;
u16 mc = mesh->getMeshBufferCount();
for(u16 j = 0; j < mc; j++)
{
for (u16 j = 0; j < mc; j++) {
scene::IMeshBuffer *buf = mesh->getMeshBuffer(j);
video::S3DVertex *vertices = (video::S3DVertex*)buf->getVertices();
u16 vc = buf->getVertexCount();
for(u16 i=0; i<vc; i++)
{
switch (axisdir)
{
case 0:
if(facedir == 1)
vertices[i].Pos.rotateXZBy(-90);
else if(facedir == 2)
vertices[i].Pos.rotateXZBy(180);
else if(facedir == 3)
vertices[i].Pos.rotateXZBy(90);
break;
case 1: // z+
vertices[i].Pos.rotateYZBy(90);
if(facedir == 1)
vertices[i].Pos.rotateXYBy(90);
else if(facedir == 2)
vertices[i].Pos.rotateXYBy(180);
else if(facedir == 3)
vertices[i].Pos.rotateXYBy(-90);
break;
case 2: //z-
vertices[i].Pos.rotateYZBy(-90);
if(facedir == 1)
vertices[i].Pos.rotateXYBy(-90);
else if(facedir == 2)
vertices[i].Pos.rotateXYBy(180);
else if(facedir == 3)
vertices[i].Pos.rotateXYBy(90);
break;
case 3: //x+
vertices[i].Pos.rotateXYBy(-90);
if(facedir == 1)
vertices[i].Pos.rotateYZBy(90);
else if(facedir == 2)
vertices[i].Pos.rotateYZBy(180);
else if(facedir == 3)
vertices[i].Pos.rotateYZBy(-90);
break;
case 4: //x-
vertices[i].Pos.rotateXYBy(90);
if(facedir == 1)
vertices[i].Pos.rotateYZBy(-90);
else if(facedir == 2)
vertices[i].Pos.rotateYZBy(180);
else if(facedir == 3)
vertices[i].Pos.rotateYZBy(90);
break;
case 5:
vertices[i].Pos.rotateXYBy(-180);
if(facedir == 1)
vertices[i].Pos.rotateXZBy(90);
else if(facedir == 2)
vertices[i].Pos.rotateXZBy(180);
else if(facedir == 3)
vertices[i].Pos.rotateXZBy(-90);
break;
default:
break;
const u32 stride = getVertexPitchFromType(buf->getVertexType());
u32 vertex_count = buf->getVertexCount();
u8 *vertices = (u8 *)buf->getVertices();
for (u32 i = 0; i < vertex_count; i++) {
video::S3DVertex *vertex = (video::S3DVertex *)(vertices + i * stride);
switch (axisdir) {
case 0:
if (facedir == 1)
vertex->Pos.rotateXZBy(-90);
else if (facedir == 2)
vertex->Pos.rotateXZBy(180);
else if (facedir == 3)
vertex->Pos.rotateXZBy(90);
break;
case 1: // z+
vertex->Pos.rotateYZBy(90);
if (facedir == 1)
vertex->Pos.rotateXYBy(90);
else if (facedir == 2)
vertex->Pos.rotateXYBy(180);
else if (facedir == 3)
vertex->Pos.rotateXYBy(-90);
break;
case 2: //z-
vertex->Pos.rotateYZBy(-90);
if (facedir == 1)
vertex->Pos.rotateXYBy(-90);
else if (facedir == 2)
vertex->Pos.rotateXYBy(180);
else if (facedir == 3)
vertex->Pos.rotateXYBy(90);
break;
case 3: //x+
vertex->Pos.rotateXYBy(-90);
if (facedir == 1)
vertex->Pos.rotateYZBy(90);
else if (facedir == 2)
vertex->Pos.rotateYZBy(180);
else if (facedir == 3)
vertex->Pos.rotateYZBy(-90);
break;
case 4: //x-
vertex->Pos.rotateXYBy(90);
if (facedir == 1)
vertex->Pos.rotateYZBy(-90);
else if (facedir == 2)
vertex->Pos.rotateYZBy(180);
else if (facedir == 3)
vertex->Pos.rotateYZBy(90);
break;
case 5:
vertex->Pos.rotateXYBy(-180);
if (facedir == 1)
vertex->Pos.rotateXZBy(90);
else if (facedir == 2)
vertex->Pos.rotateXZBy(180);
else if (facedir == 3)
vertex->Pos.rotateXZBy(-90);
break;
default:
break;
}
}
}
@ -355,11 +348,10 @@ void recalculateBoundingBox(scene::IMesh *src_mesh)
{
core::aabbox3d<f32> bbox;
bbox.reset(0,0,0);
for(u16 j = 0; j < src_mesh->getMeshBufferCount(); j++)
{
for (u16 j = 0; j < src_mesh->getMeshBufferCount(); j++) {
scene::IMeshBuffer *buf = src_mesh->getMeshBuffer(j);
buf->recalculateBoundingBox();
if(j == 0)
if (j == 0)
bbox = buf->getBoundingBox();
else
bbox.addInternalBox(buf->getBoundingBox());
@ -370,18 +362,47 @@ void recalculateBoundingBox(scene::IMesh *src_mesh)
scene::IMesh* cloneMesh(scene::IMesh *src_mesh)
{
scene::SMesh* dst_mesh = new scene::SMesh();
for(u16 j = 0; j < src_mesh->getMeshBufferCount(); j++)
{
for (u16 j = 0; j < src_mesh->getMeshBufferCount(); j++) {
scene::IMeshBuffer *buf = src_mesh->getMeshBuffer(j);
video::S3DVertex *vertices = (video::S3DVertex*)buf->getVertices();
u16 *indices = (u16*)buf->getIndices();
scene::SMeshBuffer *temp_buf = new scene::SMeshBuffer();
temp_buf->append(vertices, buf->getVertexCount(),
indices, buf->getIndexCount());
dst_mesh->addMeshBuffer(temp_buf);
temp_buf->drop();
switch (buf->getVertexType()) {
case video::EVT_STANDARD: {
video::S3DVertex *v =
(video::S3DVertex *) buf->getVertices();
u16 *indices = (u16*)buf->getIndices();
scene::SMeshBuffer *temp_buf = new scene::SMeshBuffer();
temp_buf->append(v, buf->getVertexCount(),
indices, buf->getIndexCount());
dst_mesh->addMeshBuffer(temp_buf);
temp_buf->drop();
break;
}
case video::EVT_2TCOORDS: {
video::S3DVertex2TCoords *v =
(video::S3DVertex2TCoords *) buf->getVertices();
u16 *indices = (u16*)buf->getIndices();
scene::SMeshBufferTangents *temp_buf =
new scene::SMeshBufferTangents();
temp_buf->append(v, buf->getVertexCount(),
indices, buf->getIndexCount());
dst_mesh->addMeshBuffer(temp_buf);
temp_buf->drop();
break;
}
case video::EVT_TANGENTS: {
video::S3DVertexTangents *v =
(video::S3DVertexTangents *) buf->getVertices();
u16 *indices = (u16*)buf->getIndices();
scene::SMeshBufferTangents *temp_buf =
new scene::SMeshBufferTangents();
temp_buf->append(v, buf->getVertexCount(),
indices, buf->getIndexCount());
dst_mesh->addMeshBuffer(temp_buf);
temp_buf->drop();
break;
}
}
}
return dst_mesh;
return dst_mesh;
}
scene::IMesh* convertNodeboxNodeToMesh(ContentFeatures *f)

View File

@ -77,6 +77,9 @@ void NetworkPacket::putRawString(const char* src, u32 len)
m_data.resize(m_datasize);
}
if (len == 0)
return;
memcpy(&m_data[m_read_offset], src, len);
m_read_offset += len;
}

View File

@ -132,9 +132,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
Rename GENERIC_CMD_SET_ATTACHMENT to GENERIC_CMD_ATTACH_TO
PROTOCOL_VERSION 26:
Add TileDef tileable_horizontal, tileable_vertical flags
PROTOCOL_VERSION 27:
backface_culling: backwards compatibility for playing with
newer client on pre-27 servers.
*/
#define LATEST_PROTOCOL_VERSION 26
#define LATEST_PROTOCOL_VERSION 27
// Server's supported network protocol range
#define SERVER_PROTOCOL_VERSION_MIN 13

View File

@ -1358,7 +1358,9 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
Check that target is reasonably close
(only when digging or placing things)
*/
if (action == 0 || action == 2 || action == 3) {
static const bool enable_anticheat = !g_settings->getBool("disable_anticheat");
if ((action == 0 || action == 2 || action == 3) &&
(enable_anticheat && !isSingleplayer())) {
float d = player_pos.getDistanceFrom(pointed_pos_under);
float max_d = BS * 14; // Just some large enough value
if (d > max_d) {
@ -1495,7 +1497,7 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
/* Cheat prevention */
bool is_valid_dig = true;
if (!isSingleplayer() && !g_settings->getBool("disable_anticheat")) {
if (enable_anticheat && !isSingleplayer()) {
v3s16 nocheat_p = playersao->getNoCheatDigPos();
float nocheat_t = playersao->getNoCheatDigTime();
playersao->noCheatDigEnd();

View File

@ -139,7 +139,7 @@ void TileDef::serialize(std::ostream &os, u16 protocol_version) const
}
}
void TileDef::deSerialize(std::istream &is)
void TileDef::deSerialize(std::istream &is, bool culling_ignore)
{
int version = readU8(is);
name = deSerializeString(is);
@ -153,6 +153,11 @@ void TileDef::deSerialize(std::istream &is)
tileable_horizontal = readU8(is);
tileable_vertical = readU8(is);
}
// when connecting to old servers - do not use
// provided values here since culling needs to be
// disabled by default for these drawtypes
if (culling_ignore)
backface_culling = false;
}
@ -233,6 +238,7 @@ void ContentFeatures::reset()
diggable = true;
climbable = false;
buildable_to = false;
floodable = false;
rightclickable = true;
leveled = 0;
liquid_type = LIQUID_NONE;
@ -318,6 +324,7 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const
// the protocol version
os<<serializeString(mesh);
collision_box.serialize(os, protocol_version);
writeU8(os, floodable);
}
void ContentFeatures::deSerialize(std::istream &is)
@ -337,15 +344,22 @@ void ContentFeatures::deSerialize(std::istream &is)
groups[name] = value;
}
drawtype = (enum NodeDrawType)readU8(is);
bool ignore_culling = ((version <= 26) &&
((drawtype == NDT_MESH) ||
(drawtype == NDT_PLANTLIKE) ||
(drawtype == NDT_FIRELIKE) ||
(drawtype == NDT_LIQUID)));
visual_scale = readF1000(is);
if(readU8(is) != 6)
throw SerializationError("unsupported tile count");
for(u32 i = 0; i < 6; i++)
tiledef[i].deSerialize(is);
tiledef[i].deSerialize(is, ignore_culling);
if(readU8(is) != CF_SPECIAL_COUNT)
throw SerializationError("unsupported CF_SPECIAL_COUNT");
for(u32 i = 0; i < CF_SPECIAL_COUNT; i++)
tiledef_special[i].deSerialize(is);
tiledef_special[i].deSerialize(is, ignore_culling);
alpha = readU8(is);
post_effect_color.setAlpha(readU8(is));
post_effect_color.setRed(readU8(is));
@ -388,6 +402,7 @@ void ContentFeatures::deSerialize(std::istream &is)
// otherwise changes the protocol version
mesh = deSerializeString(is);
collision_box.deSerialize(is);
floodable = readU8(is);
}catch(SerializationError &e) {};
}
@ -520,6 +535,7 @@ void CNodeDefManager::clear()
f.pointable = false;
f.diggable = false;
f.buildable_to = true;
f.floodable = true;
f.is_ground_content = true;
// Insert directly into containers
content_t c = CONTENT_AIR;
@ -839,12 +855,7 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef,
assert(f->liquid_type == LIQUID_SOURCE);
if (opaque_water)
f->alpha = 255;
if (new_style_water){
f->solidness = 0;
} else {
f->solidness = 1;
f->backface_culling = false;
}
f->solidness = new_style_water ? 0 : 1;
is_liquid = true;
break;
case NDT_FLOWINGLIQUID:
@ -895,17 +906,14 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef,
break;
case NDT_PLANTLIKE:
f->solidness = 0;
f->backface_culling = false;
if (f->waving == 1)
material_type = TILE_MATERIAL_WAVING_PLANTS;
break;
case NDT_FIRELIKE:
f->backface_culling = false;
f->solidness = 0;
break;
case NDT_MESH:
f->solidness = 0;
f->backface_culling = false;
break;
case NDT_TORCHLIKE:
case NDT_SIGNLIKE:
@ -937,7 +945,7 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef,
// Tiles (fill in f->tiles[])
for (u16 j = 0; j < 6; j++) {
fillTileAttribs(tsrc, &f->tiles[j], &tiledef[j], tile_shader[j],
use_normal_texture, f->backface_culling, f->alpha, material_type);
use_normal_texture, f->tiledef[j].backface_culling, f->alpha, material_type);
}
// Special tiles (fill in f->special_tiles[])
@ -1262,7 +1270,6 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const
"Unsupported version requested");
}
void ContentFeatures::deSerializeOld(std::istream &is, int version)
{
if (version == 5) // In PROTOCOL_VERSION 13
@ -1276,15 +1283,22 @@ void ContentFeatures::deSerializeOld(std::istream &is, int version)
groups[name] = value;
}
drawtype = (enum NodeDrawType)readU8(is);
bool ignore_culling = ((version <= 26) &&
((drawtype == NDT_MESH) ||
(drawtype == NDT_PLANTLIKE) ||
(drawtype == NDT_FIRELIKE) ||
(drawtype == NDT_LIQUID)));
visual_scale = readF1000(is);
if (readU8(is) != 6)
throw SerializationError("unsupported tile count");
for (u32 i = 0; i < 6; i++)
tiledef[i].deSerialize(is);
tiledef[i].deSerialize(is, ignore_culling);
if (readU8(is) != CF_SPECIAL_COUNT)
throw SerializationError("unsupported CF_SPECIAL_COUNT");
for (u32 i = 0; i < CF_SPECIAL_COUNT; i++)
tiledef_special[i].deSerialize(is);
tiledef_special[i].deSerialize(is, ignore_culling);
alpha = readU8(is);
post_effect_color.setAlpha(readU8(is));
post_effect_color.setRed(readU8(is));
@ -1328,12 +1342,12 @@ void ContentFeatures::deSerializeOld(std::istream &is, int version)
if (readU8(is) != 6)
throw SerializationError("unsupported tile count");
for (u32 i = 0; i < 6; i++)
tiledef[i].deSerialize(is);
tiledef[i].deSerialize(is, drawtype);
// CF_SPECIAL_COUNT in version 6 = 2
if (readU8(is) != 2)
throw SerializationError("unsupported CF_SPECIAL_COUNT");
for (u32 i = 0; i < 2; i++)
tiledef_special[i].deSerialize(is);
tiledef_special[i].deSerialize(is, drawtype);
alpha = readU8(is);
post_effect_color.setAlpha(readU8(is));
post_effect_color.setRed(readU8(is));

View File

@ -137,7 +137,7 @@ struct TileDef
}
void serialize(std::ostream &os, u16 protocol_version) const;
void deSerialize(std::istream &is);
void deSerialize(std::istream &is, bool culling_ignore);
};
enum NodeDrawType
@ -229,6 +229,8 @@ struct ContentFeatures
bool climbable;
// Player can build on these
bool buildable_to;
// Liquids flow into and replace node
bool floodable;
// Player cannot build to these (placement prediction disabled)
bool rightclickable;
// Flowing liquid or snow, value = default level

View File

@ -118,6 +118,7 @@ void ObjectProperties::serialize(std::ostream &os) const
os << serializeString(nametag);
writeARGB8(os, nametag_color);
writeF1000(os, automatic_face_movement_max_rotation_per_sec);
os << serializeString(infotext);
// Add stuff only at the bottom.
// Never remove anything, because we don't want new versions of this
@ -159,6 +160,7 @@ void ObjectProperties::deSerialize(std::istream &is)
nametag = deSerializeString(is);
nametag_color = readARGB8(is);
automatic_face_movement_max_rotation_per_sec = readF1000(is);
infotext = deSerializeString(is);
}catch(SerializationError &e){}
}
else

View File

@ -51,6 +51,7 @@ struct ObjectProperties
std::string nametag;
video::SColor nametag_color;
f32 automatic_face_movement_max_rotation_per_sec;
std::string infotext;
ObjectProperties();
std::string dump();

View File

@ -131,14 +131,12 @@ void Particle::step(float dtime)
core::aabbox3d<f32> box = m_collisionbox;
v3f p_pos = m_pos*BS;
v3f p_velocity = m_velocity*BS;
v3f p_acceleration = m_acceleration*BS;
collisionMoveSimple(m_env, m_gamedef,
BS*0.5, box,
0, dtime,
p_pos, p_velocity, p_acceleration);
&p_pos, &p_velocity, m_acceleration * BS);
m_pos = p_pos/BS;
m_velocity = p_velocity/BS;
m_acceleration = p_acceleration/BS;
}
else
{

View File

@ -163,6 +163,8 @@ bool detectMSVCBuildDir(const std::string &path)
{
const char *ends[] = {
"bin\\Release",
"bin\\MinSizeRel",
"bin\\RelWithDebInfo",
"bin\\Debug",
"bin\\Build",
NULL
@ -527,6 +529,7 @@ void initializePaths()
path_share = execpath;
path_user = execpath;
}
path_cache = path_user + DIR_DELIM + "cache";
#else
infostream << "Using system-wide paths (NOT RUN_IN_PLACE)" << std::endl;
@ -536,16 +539,16 @@ void initializePaths()
// Initialize path_cache
// First try $XDG_CACHE_HOME/PROJECT_NAME
const char *cache_dir = getenv("XDG_CACHE_HOME");
const char *home_dir = getenv("HOME");
if (cache_dir) {
path_cache = std::string(cache_dir) + DIR_DELIM + PROJECT_NAME;
} else {
} else if (home_dir) {
// Then try $HOME/.cache/PROJECT_NAME
const char *home_dir = getenv("HOME");
if (home_dir) {
path_cache = std::string(home_dir) + DIR_DELIM + ".cache"
+ DIR_DELIM + PROJECT_NAME;
}
// If neither works, leave it at $PATH_USER/cache
path_cache = std::string(home_dir) + DIR_DELIM + ".cache"
+ DIR_DELIM + PROJECT_NAME;
} else {
// If neither works, use $PATH_USER/cache
path_cache = path_user + DIR_DELIM + "cache";
}
// Migrate cache folder to new location if possible
migrateCachePath();

View File

@ -211,43 +211,56 @@ void initIrrlicht(irr::IrrlichtDevice * );
}
#else // Posix
inline u32 getTimeS()
inline void _os_get_clock(struct timespec *ts)
{
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec;
}
inline u32 getTimeMs()
{
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec * 1000 + tv.tv_usec / 1000;
}
inline u32 getTimeUs()
{
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec * 1000000 + tv.tv_usec;
}
inline u32 getTimeNs()
{
struct timespec ts;
// from http://stackoverflow.com/questions/5167269/clock-gettime-alternative-in-mac-os-x
#if defined(__MACH__) && defined(__APPLE__) // OS X does not have clock_gettime, use clock_get_time
#if defined(__MACH__) && defined(__APPLE__)
// from http://stackoverflow.com/questions/5167269/clock-gettime-alternative-in-mac-os-x
// OS X does not have clock_gettime, use clock_get_time
clock_serv_t cclock;
mach_timespec_t mts;
host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
clock_get_time(cclock, &mts);
mach_port_deallocate(mach_task_self(), cclock);
ts.tv_sec = mts.tv_sec;
ts.tv_nsec = mts.tv_nsec;
ts->tv_sec = mts.tv_sec;
ts->tv_nsec = mts.tv_nsec;
#elif defined(CLOCK_MONOTONIC_RAW)
clock_gettime(CLOCK_MONOTONIC_RAW, ts);
#elif defined(_POSIX_MONOTONIC_CLOCK)
clock_gettime(CLOCK_MONOTONIC, ts);
#else
clock_gettime(CLOCK_REALTIME, &ts);
#endif
struct timeval tv;
gettimeofday(&tv, NULL);
TIMEVAL_TO_TIMESPEC(&tv, ts);
#endif // defined(__MACH__) && defined(__APPLE__)
}
// Note: these clock functions do not return wall time, but
// generally a clock that starts at 0 when the process starts.
inline u32 getTimeS()
{
struct timespec ts;
_os_get_clock(&ts);
return ts.tv_sec;
}
inline u32 getTimeMs()
{
struct timespec ts;
_os_get_clock(&ts);
return ts.tv_sec * 1000 + ts.tv_nsec / 1000000;
}
inline u32 getTimeUs()
{
struct timespec ts;
_os_get_clock(&ts);
return ts.tv_sec * 1000000 + ts.tv_nsec / 1000;
}
inline u32 getTimeNs()
{
struct timespec ts;
_os_get_clock(&ts);
return ts.tv_sec * 1000000000 + ts.tv_nsec;
}

View File

@ -216,6 +216,7 @@ void read_object_properties(lua_State *L, int index,
prop->automatic_face_movement_max_rotation_per_sec = luaL_checknumber(L, -1);
}
lua_pop(L, 1);
getstringfield(L, -1, "infotext", prop->infotext);
}
/******************************************************************************/
@ -282,6 +283,8 @@ void push_object_properties(lua_State *L, ObjectProperties *prop)
lua_setfield(L, -2, "nametag_color");
lua_pushnumber(L, prop->automatic_face_movement_max_rotation_per_sec);
lua_setfield(L, -2, "automatic_face_movement_max_rotation_per_sec");
lua_pushlstring(L, prop->infotext.c_str(), prop->infotext.size());
lua_setfield(L, -2, "infotext");
}
/******************************************************************************/
@ -291,14 +294,31 @@ TileDef read_tiledef(lua_State *L, int index, u8 drawtype)
index = lua_gettop(L) + 1 + index;
TileDef tiledef;
bool default_tiling = (drawtype == NDT_PLANTLIKE || drawtype == NDT_FIRELIKE)
? false : true;
bool default_tiling = true;
bool default_culling = true;
switch (drawtype) {
case NDT_PLANTLIKE:
case NDT_FIRELIKE:
default_tiling = false;
// "break" is omitted here intentionaly, as PLANTLIKE
// FIRELIKE drawtype both should default to having
// backface_culling to false.
case NDT_MESH:
case NDT_LIQUID:
default_culling = false;
break;
default:
break;
}
// key at index -2 and value at index
if(lua_isstring(L, index)){
// "default_lava.png"
tiledef.name = lua_tostring(L, index);
tiledef.tileable_vertical = default_tiling;
tiledef.tileable_horizontal = default_tiling;
tiledef.backface_culling = default_culling;
}
else if(lua_istable(L, index))
{
@ -307,7 +327,7 @@ TileDef read_tiledef(lua_State *L, int index, u8 drawtype)
getstringfield(L, index, "name", tiledef.name);
getstringfield(L, index, "image", tiledef.name); // MaterialSpec compat.
tiledef.backface_culling = getboolfield_default(
L, index, "backface_culling", true);
L, index, "backface_culling", default_culling);
tiledef.tileable_horizontal = getboolfield_default(
L, index, "tileable_horizontal", default_tiling);
tiledef.tileable_vertical = getboolfield_default(
@ -481,6 +501,8 @@ ContentFeatures read_content_features(lua_State *L, int index)
getboolfield(L, index, "climbable", f.climbable);
// Player can build on these
getboolfield(L, index, "buildable_to", f.buildable_to);
// Liquids flow into and replace node
getboolfield(L, index, "floodable", f.floodable);
// Whether the node is non-liquid, source liquid or flowing liquid
f.liquid_type = (LiquidType)getenumfield(L, index, "liquidtype",
ScriptApiNode::es_LiquidType, LIQUID_NONE);

View File

@ -68,7 +68,7 @@ public:
*/
ScriptApiBase::ScriptApiBase() :
m_luastackmutex(true)
m_luastackmutex()
{
#ifdef SCRIPTAPI_LOCK_DEBUG
m_lock_recursion_count = 0;

View File

@ -108,7 +108,7 @@ protected:
void objectrefGetOrCreate(lua_State *L, ServerActiveObject *cobj);
void objectrefGet(lua_State *L, u16 id);
Mutex m_luastackmutex;
RecursiveMutex m_luastackmutex;
std::string m_last_run_mod;
bool m_secure;
#ifdef SCRIPTAPI_LOCK_DEBUG

View File

@ -75,7 +75,7 @@ private:
#endif
#define SCRIPTAPI_PRECHECKHEADER \
MutexAutoLock scriptlock(this->m_luastackmutex); \
RecursiveMutexAutoLock scriptlock(this->m_luastackmutex); \
SCRIPTAPI_LOCK_CHECK; \
realityCheck(); \
lua_State *L = getStack(); \

View File

@ -94,7 +94,7 @@ int LuaItemStack::l_set_count(lua_State *L)
bool status;
lua_Integer count = luaL_checkinteger(L, 2);
if (count <= 65535) {
if (count > 0 && count <= 65535) {
item.count = count;
status = true;
} else {

View File

@ -161,8 +161,14 @@ int ModApiUtil::l_parse_json(lua_State *L)
if (!reader.parse(stream, root)) {
errorstream << "Failed to parse json data "
<< reader.getFormattedErrorMessages();
errorstream << "data: \"" << jsonstr << "\""
<< std::endl;
size_t jlen = strlen(jsonstr);
if (jlen > 100) {
errorstream << "Data (" << jlen
<< " bytes) printed to warningstream." << std::endl;
warningstream << "data: \"" << jsonstr << "\"" << std::endl;
} else {
errorstream << "data: \"" << jsonstr << "\"" << std::endl;
}
lua_pushnil(L);
return 1;
}

View File

@ -133,7 +133,8 @@ void decompressZlib(std::istream &is, std::ostream &os)
if(z.avail_in == 0)
{
z.next_in = (Bytef*)input_buffer;
input_buffer_len = is.readsome(input_buffer, bufsize);
is.read(input_buffer, bufsize);
input_buffer_len = is.gcount();
z.avail_in = input_buffer_len;
//dstream<<"read fail="<<is.fail()<<" bad="<<is.bad()<<std::endl;
}
@ -166,6 +167,7 @@ void decompressZlib(std::istream &is, std::ostream &os)
//dstream<<"z.avail_in="<<z.avail_in<<std::endl;
//dstream<<"fail="<<is.fail()<<" bad="<<is.bad()<<std::endl;
// Unget all the data that inflate didn't take
is.clear(); // Just in case EOF is set
for(u32 i=0; i < z.avail_in; i++)
{
is.unget();

View File

@ -880,8 +880,14 @@ bool Settings::remove(const std::string &name)
{
MutexAutoLock lock(m_mutex);
delete m_settings[name].group;
return m_settings.erase(name);
std::map<std::string, SettingsEntry>::iterator it = m_settings.find(name);
if (it != m_settings.end()) {
delete it->second.group;
m_settings.erase(it);
return true;
} else {
return false;
}
}

View File

@ -29,6 +29,7 @@ DEALINGS IN THE SOFTWARE.
#if __cplusplus >= 201103L
#include <condition_variable>
#include "threading/mutex.h"
#include "threading/mutex_auto_lock.h"
#elif defined(_WIN32)
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN

View File

@ -34,7 +34,18 @@ DEALINGS IN THE SOFTWARE.
#define UNUSED(expr) do { (void)(expr); } while (0)
Mutex::Mutex()
{
init_mutex(false);
}
Mutex::Mutex(bool recursive)
{
init_mutex(recursive);
}
void Mutex::init_mutex(bool recursive)
{
#ifdef _WIN32
// Windows critical sections are recursive by default
@ -89,5 +100,9 @@ void Mutex::unlock()
#endif
}
RecursiveMutex::RecursiveMutex()
: Mutex(true)
{}
#endif

View File

@ -30,6 +30,7 @@ DEALINGS IN THE SOFTWARE.
#if __cplusplus >= 201103L && !defined(_WIN32)
#include <mutex>
using Mutex = std::mutex;
using RecursiveMutex = std::recursive_mutex;
#else
#ifdef _WIN32
@ -49,11 +50,14 @@ DEALINGS IN THE SOFTWARE.
class Mutex
{
public:
Mutex(bool recursive=false);
Mutex();
~Mutex();
void lock();
void unlock();
protected:
Mutex(bool recursive);
void init_mutex(bool recursive);
private:
#ifdef _WIN32
CRITICAL_SECTION mutex;
@ -64,6 +68,14 @@ private:
DISABLE_CLASS_COPY(Mutex);
};
class RecursiveMutex : public Mutex
{
public:
RecursiveMutex();
DISABLE_CLASS_COPY(RecursiveMutex);
};
#endif // C++11
#endif

View File

@ -28,7 +28,8 @@ DEALINGS IN THE SOFTWARE.
#if __cplusplus >= 201103L
#include <mutex>
using MutexAutoLock = std::lock_guard<std::mutex>;
using MutexAutoLock = std::unique_lock<std::mutex>;
using RecursiveMutexAutoLock = std::unique_lock<std::recursive_mutex>;
#else
#include "threading/mutex.h"
@ -44,6 +45,15 @@ private:
Mutex &mutex;
};
class RecursiveMutexAutoLock
{
public:
RecursiveMutexAutoLock(RecursiveMutex &m) : mutex(m) { mutex.lock(); }
~RecursiveMutexAutoLock() { mutex.unlock(); }
private:
RecursiveMutex &mutex;
};
#endif
#endif

View File

@ -51,7 +51,7 @@ void TestCollision::testAxisAlignedCollision()
aabb3f m(bx-2, by, bz, bx-1, by+1, bz+1);
v3f v(1, 0, 0);
f32 dtime = 0;
UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
UASSERT(axisAlignedCollision(s, m, v, 0, &dtime) == 0);
UASSERT(fabs(dtime - 1.000) < 0.001);
}
{
@ -59,21 +59,21 @@ void TestCollision::testAxisAlignedCollision()
aabb3f m(bx-2, by, bz, bx-1, by+1, bz+1);
v3f v(-1, 0, 0);
f32 dtime = 0;
UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == -1);
UASSERT(axisAlignedCollision(s, m, v, 0, &dtime) == -1);
}
{
aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
aabb3f m(bx-2, by+1.5, bz, bx-1, by+2.5, bz-1);
v3f v(1, 0, 0);
f32 dtime;
UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == -1);
UASSERT(axisAlignedCollision(s, m, v, 0, &dtime) == -1);
}
{
aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
aabb3f m(bx-2, by-1.5, bz, bx-1.5, by+0.5, bz+1);
v3f v(0.5, 0.1, 0);
f32 dtime;
UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
UASSERT(axisAlignedCollision(s, m, v, 0, &dtime) == 0);
UASSERT(fabs(dtime - 3.000) < 0.001);
}
{
@ -81,7 +81,7 @@ void TestCollision::testAxisAlignedCollision()
aabb3f m(bx-2, by-1.5, bz, bx-1.5, by+0.5, bz+1);
v3f v(0.5, 0.1, 0);
f32 dtime;
UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
UASSERT(axisAlignedCollision(s, m, v, 0, &dtime) == 0);
UASSERT(fabs(dtime - 3.000) < 0.001);
}
@ -91,7 +91,7 @@ void TestCollision::testAxisAlignedCollision()
aabb3f m(bx+2, by, bz, bx+3, by+1, bz+1);
v3f v(-1, 0, 0);
f32 dtime;
UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
UASSERT(axisAlignedCollision(s, m, v, 0, &dtime) == 0);
UASSERT(fabs(dtime - 1.000) < 0.001);
}
{
@ -99,21 +99,21 @@ void TestCollision::testAxisAlignedCollision()
aabb3f m(bx+2, by, bz, bx+3, by+1, bz+1);
v3f v(1, 0, 0);
f32 dtime;
UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == -1);
UASSERT(axisAlignedCollision(s, m, v, 0, &dtime) == -1);
}
{
aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
aabb3f m(bx+2, by, bz+1.5, bx+3, by+1, bz+3.5);
v3f v(-1, 0, 0);
f32 dtime;
UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == -1);
UASSERT(axisAlignedCollision(s, m, v, 0, &dtime) == -1);
}
{
aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
aabb3f m(bx+2, by-1.5, bz, bx+2.5, by-0.5, bz+1);
v3f v(-0.5, 0.2, 0);
f32 dtime;
UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 1); // Y, not X!
UASSERT(axisAlignedCollision(s, m, v, 0, &dtime) == 1); // Y, not X!
UASSERT(fabs(dtime - 2.500) < 0.001);
}
{
@ -121,7 +121,7 @@ void TestCollision::testAxisAlignedCollision()
aabb3f m(bx+2, by-1.5, bz, bx+2.5, by-0.5, bz+1);
v3f v(-0.5, 0.3, 0);
f32 dtime;
UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
UASSERT(axisAlignedCollision(s, m, v, 0, &dtime) == 0);
UASSERT(fabs(dtime - 2.000) < 0.001);
}
@ -133,7 +133,7 @@ void TestCollision::testAxisAlignedCollision()
aabb3f m(bx+2.3, by+2.29, bz+2.29, bx+4.2, by+4.2, bz+4.2);
v3f v(-1./3, -1./3, -1./3);
f32 dtime;
UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
UASSERT(axisAlignedCollision(s, m, v, 0, &dtime) == 0);
UASSERT(fabs(dtime - 0.9) < 0.001);
}
{
@ -141,7 +141,7 @@ void TestCollision::testAxisAlignedCollision()
aabb3f m(bx+2.29, by+2.3, bz+2.29, bx+4.2, by+4.2, bz+4.2);
v3f v(-1./3, -1./3, -1./3);
f32 dtime;
UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 1);
UASSERT(axisAlignedCollision(s, m, v, 0, &dtime) == 1);
UASSERT(fabs(dtime - 0.9) < 0.001);
}
{
@ -149,7 +149,7 @@ void TestCollision::testAxisAlignedCollision()
aabb3f m(bx+2.29, by+2.29, bz+2.3, bx+4.2, by+4.2, bz+4.2);
v3f v(-1./3, -1./3, -1./3);
f32 dtime;
UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 2);
UASSERT(axisAlignedCollision(s, m, v, 0, &dtime) == 2);
UASSERT(fabs(dtime - 0.9) < 0.001);
}
{
@ -157,7 +157,7 @@ void TestCollision::testAxisAlignedCollision()
aabb3f m(bx-4.2, by-4.2, bz-4.2, bx-2.3, by-2.29, bz-2.29);
v3f v(1./7, 1./7, 1./7);
f32 dtime;
UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
UASSERT(axisAlignedCollision(s, m, v, 0, &dtime) == 0);
UASSERT(fabs(dtime - 16.1) < 0.001);
}
{
@ -165,7 +165,7 @@ void TestCollision::testAxisAlignedCollision()
aabb3f m(bx-4.2, by-4.2, bz-4.2, bx-2.29, by-2.3, bz-2.29);
v3f v(1./7, 1./7, 1./7);
f32 dtime;
UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 1);
UASSERT(axisAlignedCollision(s, m, v, 0, &dtime) == 1);
UASSERT(fabs(dtime - 16.1) < 0.001);
}
{
@ -173,7 +173,7 @@ void TestCollision::testAxisAlignedCollision()
aabb3f m(bx-4.2, by-4.2, bz-4.2, bx-2.29, by-2.29, bz-2.3);
v3f v(1./7, 1./7, 1./7);
f32 dtime;
UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 2);
UASSERT(axisAlignedCollision(s, m, v, 0, &dtime) == 2);
UASSERT(fabs(dtime - 16.1) < 0.001);
}
}

View File

@ -26,7 +26,17 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "config.h"
#if HAVE_ENDIAN_H
#include <endian.h>
#ifdef _WIN32
#define __BYTE_ORDER 0
#define __LITTLE_ENDIAN 0
#define __BIG_ENDIAN 1
#elif defined(__MACH__) && defined(__APPLE__)
#include <machine/endian.h>
#elif defined(__FreeBSD__)
#include <sys/endian.h>
#else
#include <endian.h>
#endif
#endif
#include <string.h> // for memcpy
#include <iostream>